BLOG
대부분의 AWS CloudFormation 템플릿은 사용자 정의를 위해 매개 변수를 사용합니다. 좋은 사용자 환경을 보장하기 위해 매개 변수를 검증하는 것이 중요합니다. AWS CloudFormation은 매개변수 유효성 검사를 수행하는 여러 가지 방법을 제공합니다. 예를 들어 AllowedValues 또는 Default를 지정하거나 Types를 할당할 수 있습니다. 매개 변수 검증에 대한 자세한 내용은 설명서를 참조하십시오.
개발자들은 종종 매개변수 값이 다른 매개변수에 의존하는 상황에 부딪힙니다. 예를 들어 애플리케이션 로드 밸런서를 생성할 때 인증서는 보안 수신기(HTTPS)에만 필요하며 기본 수신기(HTTP)에는 필요하지 않습니다. 따라서 CloudFormation 개발자가 수신자를 조건부로 만들 수 있는 공통 템플릿을 가지고 있다면 2가지 매개 변수가 필요합니다. 1) 안전한 애플리케이션 로드 밸런서를 만들려면 ‘예’를 선택하고, 2) 인증서의 ARN(Amazon Resource Name)을 입력하십시오. 여기서 인증서의 ARN은 첫 번째 매개변수에 대한 응답이 ‘예’인 경우에만 필요합니다. 사용자가 입력을 올바르게 입력했는지 확인하기 위해 이 유효성 검사를 어떻게 시행하고 있습니까?
제가 방금 설명한 상황은 교차 파라미터 또는 교차 필드 검증의 예입니다. AWS CloudFormation은 규칙을 사용하여 제품에 대한 리소스를 생성하기 전에 매개 변수 값을 검증합니다.예를 들어 엔드 유저가 NAT 게이트웨이의 공용 서브넷을 지정했거나 개발/테스트 환경에 더 작은 인스턴스 유형을 사용했는지 확인하는 규칙을 추가할 수 있습니다. 이 글에서는 AWS CloudFormation 규칙과 주장을 사용하여 이러한 검증을 수행하는 방법을 확인할 것입니다.
규칙 섹션은 CloudFormation 템플릿의 별도 섹션입니다. 규칙에는 2가지의 속성이 있습니다. 1) 선택적인 속성인 규칙 조건 및 2) 의무적인 주장이 있습니다. 주장을 조건부로 적용하기 위해 규칙 조건이 사용됩니다. 즉, 어떤 조건이 참으로 평가될 때만 주장이 적용됩니다. 그렇지 않으면, 그 주장은 무시됩니다. 조건 구성이 규칙에 지정되지 않은 경우 주장은 항상 적용됩니다. 규칙별 고유 기능을 사용하여 규칙 조건 및 주장을 정의할 수 있습니다. 또한 주장이 거짓을 반환할 때 표시할 오류 메시지는 AssertDescription 속성의 일부로 제공됩니다. 규칙의 구조와 구문에 대한 자세한 내용은 설명서를 참조하십시오.
규칙은 다른 매개변수의 값에 기초한 매개변수 검증을 수행하기 위해 사용될 수 있습니다. 예를 들어 템플릿에서 선택한 모든 서브넷이 동일한 VPC(Virtual Private Cloud) 내에 있는지 확인할 경우를 고려해 보십시오. 이것은 규칙의 일부가 되는 조건이 필요하지 않습니다. 주장은 서브넷의 VPC ID 값을 기반으로 평가되며, CloudFormation 스택 작업이 거짓일 경우 중단됩니다. 여기 이 검증을 수행하는 코드 조각들이 있습니다.
{
“Rules”: {
“SubnetsInVPC”: {
“Assertions”: [
{
“Assert”: {
“Fn::EachMemberIn”: [
{
“Fn::ValueOfAll”: [
“AWS::EC2::Subnet::Id”,
“VpcId”
]
},
{
“Fn::RefAll”: “AWS::EC2::VPC::Id”
}
]
},
“AssertDescription”: “All subnets must in the VPC”
}
]
}
}
}
주장은 조건부로 적용될 수 있습니다. 예를 들어 사용자가 애플리케이션 로드 밸런서에서 SSL 수신기를 구성할 경우 호스트 영역과 ACM 인증서를 제공해야 하는 점을 적용하려면 규칙의 조건 속성을 사용하십시오. 몇 가지 주장이 동일한 조건에 기초하는 경우, 여러분은 또한 여러 주장을 함께 묶을 수 있습니다. 예를 들어, 다음 조각을 고려하십시오. ACM 인증서와 호스트 영역 이름은 보안 수신기를 선택한 경우에만 필요하므로, 동일한 조건인 “UseSSL”으로 그룹화됩니다.
{
“Rules”: {
“ValidateHostedZone”: {
“RuleCondition”: {
“Fn::Equals”: [
{
“Ref”: “UseSSL”
},
“Yes”
]
},
“Assertions”: [
{
“Assert”: {
“Fn::Not”: [
{
“Fn::Equals”: [
{
“Ref”: “ALBSSLCertificateARN”
},
“”
]
}
]
},
“AssertDescription”: “ACM Certificate value cannot be empty if SSL is required”
},
{
“Assert”: {
“Fn::Not”: [
{
“Fn::Equals”: [
{
“Ref”: “HostedZoneName”
},
“”
]
}
]
},
“AssertDescription”: “Route53 Hosted Zone Name is mandatory when SSL is required”
}
]
}
}
}
규칙 블록 내에 지정된 조건만 주장에 적용할 수 있다는 점에 유의하십시오. 규칙 블록(즉, 조건 블록) 외부에 있는 조건은 사용할 수 없습니다. 또한 특정 고유 기능만 규칙 내에서 사용할 수 있다는 점에 유의하십시오. 자세한 내용은 여기의 기능 목록과 앞에서 언급한 코드 조각들이 사용되는 전체 템플릿에 대한 링크를 참조하십시오. 이 템플릿은 사용자가 선택적으로 HTTPS/SSL 수신기를 구성할 수 있는 로드 밸런싱된 자동 확장 샘플 웹사이트를 생성합니다.
결론
CloudFormation 규칙과 주장을 사용함으로써 암호형 인프라 개발자는 정교한 검증 로직을 생성하고 스택 작업을 실행할 때 오류와 문제를 방지할 수 있습니다. 이렇게 하면 템플릿 및 스택 사용자의 문제 해결 시간이 절약됩니다.
원문 URL : https://aws.amazon.com/ko/blogs/mt/how-to-perform-cross-parameter-validation-using-aws-cloudformation-rules-and-assertions/
** 메가존클라우드 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.