내용으로 건너뛰기

CloudFormation에서 템플릿 검증 또는 템플릿 형식 오류를 해결하려면 어떻게 해야 합니까?

7분 분량
0

AWS CloudFormation 템플릿을 검증하여 구문 오류가 없는지 확인하려 합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

표시되는 오류 메시지를 기반으로 다음 작업을 완료하십시오.

"JSON not well-formed" 또는 "YAML not well-formed" 오류

CloudFormation 템플릿에 올바른 형식을 지정하지 않은 경우 다음 오류 메시지 중 하나가 표시됩니다.

"JSON not well-formed"

"YAML not well-formed"

CloudFormation 템플릿의 JSON 또는 YAML 구문 모범 사례를 따라야 합니다. 이 오류를 해결하려면 다음 작업을 수행하십시오.

  • Infrastructure Composer로 스택을 만듭니다.
  • validate-template AWS CLI 명령을 사용하여 JSON 및 YAML 구문을 검증합니다.
  • AWS CloudFormation 린터를 사용하여 JSON 또는 YAML 템플릿을 검증하려면 GitHub 웹사이트에서 cfn-lint를 참조하십시오.

"Unresolved resource dependencies [XXXXXXXX] in the Resources block of the template" error

CloudFormation 템플릿에 resource 논리적 ID 또는 파라미터가 지정되지 않은 경우 다음과 같은 오류 메시지가 표시됩니다.

"Unresolved resource dependencies [test] in the Resources block of the template.".

이 오류를 해결하려면 resource 논리적 ID를 지정합니다. 또는 참조가 ImageId 값을 반환하는 test라는 파라미터를 만드십시오. 다음 예시 JSON 및 YAML 템플릿에는 이름이 test이고 값이 ImageId인 파라미터가 포함되어 있습니다.

JSON 예시:

{
  "Parameters": {
     "test": {
         "Type": "String",
         "Default": "ami-xxx"
       }
  },
  "Resources" : {
    "EC2Instance01" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : {"Ref": "test"}
      }
    }
  }
}

YAML 예시:

Parameters:
  test:
    Type: String
    Default: ami-xxx
Resources:
  EC2Instance01:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !Ref test

"Unrecognized parameter type: XXXXXXXX" 또는 "Invalid template parameter property 'XXXXXXXX'" 오류

JSON 및 YAML 템플릿에 ParameterC의 기본값이 내장 함수 Fn::Sub로 포함되어 있는 경우 다음과 같은 오류 메시지가 표시됩니다.

"Every Default member must be a string."

파라미터는 내장 함수를 지원하지 않습니다. Fn::Sub 함수를 사용하여 ParameterAParameterB 값을 지정합니다. 이 오류를 해결하려면 ParameterC를 제거하십시오.

CloudFormation 템플릿에서 ParameterC를 제거하려면 다음 단계를 완료하십시오.

  1. Type을 지원되는 속성(String, Number, List 또는 CommaDelimitedList) 중 하나로 설정합니다.
  2. 파라미터에 허용된 속성만 포함되어 있는지 확인합니다.
  3. Parameters 섹션에 내장 함수가 포함되어 있지 않은지 확인합니다.

JSON 예시:

{
  "Parameters": {
    "ParameterA": {
      "Type": "String",
      "Default": "abc"
    },
    "ParameterB": {
      "Type": "String",
      "Default": "def"
    }
  },
  "Resources": {
    "MyS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": {
          "Fn::Sub": "${ParameterA}-${ParameterB}"
        }
      }
    }
  }
}

YAML 예시:

Parameters:
 ParameterA:
  Type: String
  Default: abc
 ParameterB:
  Type: String
  Default: def
Resources:
 MyS3Bucket:
  Type: 'AWS::S3::Bucket'
  Properties:
   BucketName: !Sub ${ParameterA}-${ParameterB}

"Every Condition member must be a string" error

JSON 및 YAML 템플릿이 EC2RouteA 리소스의 condition을 단일 문자열이 아닌 문자열 목록으로 지정하는 경우도 있습니다. 그러면 다음과 같은 오류 메시지가 표시됩니다.

"Every Condition member must be a string."

이 오류를 해결하려면 템플릿의 Conditions 섹션에 ConditionAandB를 추가하십시오. 그런 다음 ConditionAandBEC2RouteA 리소스의 조건으로 사용합니다.

JSON 예시:

{
  "Conditions": {
    "ConditionA": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionB": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionAandB": {
      "Fn::And": [
        {
          "Condition": "ConditionA"
        },
        {
          "Condition": "ConditionB"
        }
      ]
    }
  },
  "Resources": {
    "EC2RouteA": {
      "Type": "AWS::EC2::Route",
      "Condition": "ConditionAandB",
      "Properties": {
        ...
      }
    }
  }
}

YAML 예시:

Conditions:
  ConditionA:
    Fn::Not:
    - Fn::Equals:
      - ''
      - Sample
  ConditionB:
    Fn::Not:
    - Fn::Equals:
      - ''
      - Sample
  ConditionAandB:
    Fn::And:
    - Condition: ConditionA
    - Condition: ConditionB
Resources:
  EC2RouteA:
    Type: AWS::EC2::Route
    Condition: ConditionAandB
    Properties:

"Unrecognized resource types: [XXXXXXXX]" 오류

모든 AWS 리전에서 모든 리소스 유형을 사용할 수 있는 것은 아닙니다. 템플릿에 해당 리전에서 사용할 수 없는 리소스 유형이 포함된 경우 다음과 같은 오류 메시지가 표시됩니다.

"Unrecognized resource types: [XXXXXXXX]."

이 오류를 해결하려면 해당 리전에서 리소스를 사용할 수 있는지 확인하십시오. 템플릿이 서버리스 리소스로 구성된 경우 Transform 선언을 포함하십시오.

JSON 예시:

{
    "Transform": "AWS::Serverless-2016-10-31", #Make sure to include this.
    "Resources": {
        "MyServerlessFunctionLogicalID": {
            "Type": "AWS::Serverless::Function",
            "Properties": {
                "Handler": "index.handler",
                "Runtime": "nodejs8.10",
                "CodeUri": "s3://testBucket/mySourceCode.zip"
            }
        }
   }
}

YAML 예시:

Transform: AWS::Serverless-2016-10-31 #Make sure to include this.
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'

"The [environmental resource] 'XXXXXXXX' does not exist" 오류

스택의 AWS::EC2::Instance 리소스가 보안 그룹을 지정하는 경우 다음과 같은 오류 메시지가 표시됩니다.

"The sg-1234567890 does not exist."

보안 그룹이 존재하지 않거나 보안 그룹이 스택의 리전에 존재하지 않는 경우 스택이 실패합니다. 이 오류를 해결하려면 템플릿에 SecurityGroupIDs를 추가하십시오.

LinuxInstance:
    Type: AWS::EC2::Instance
    Properties:
      SubnetId: !Ref ServerSubnetID
      KeyName: !Ref EC2KeyPairName
      SecurityGroupIds: sg-1234567890 #<This resource must exist and be in the same AWS Region as the stack.>

리소스 또는 Amazon 리소스 이름(ARN)을 CloudFormation 스택 외부에 있는 스택 리소스 중 하나에 하드코딩하는 경우 다음을 확인하십시오.

  • 리소스 이름 또는 ARN이 정확합니다.
  • 존재하는 리소스입니다.
  • 리소스가 스택과 동일한 리전에 있습니다. 일부 리소스는 리전 또는 계정 전체에서 속성을 허용합니다.

"Invalid template property or properties [XXXXXXXX]" 오류

버킷 리소스를 JSON 및 YAML 템플릿의 Resources 섹션과 동일한 수준으로 설정하면 다음과 같은 오류 메시지가 표시됩니다.

"Template validation error: Invalid template property or properties [Bucket]."

이 오류는 CloudFormation 템플릿 검증기가 버킷 리소스를 섹션 수준 사양으로 식별할 때 발생합니다. 섹션 수준 사양은 템플릿 속성으로 허용되지 않습니다. CloudFormation 템플릿에 허용된 템플릿 속성만 사용하는 것이 가장 좋습니다.

이 오류를 해결하려면 Resources 섹션에서 버킷 리소스를 지정합니다.

JSON 예시:

{
  "Resources": {
    "WaitCondition": {
      "Type": "AWS::CloudFormation::WaitCondition"
    },
    "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "Name": "BucketName"
      }
    }
  }
}

참고: BucketName을 사용하는 버킷 이름으로 바꾸십시오.

YAML 예시:

Resources:
  WaitCondition:
    Type: 'AWS::CloudFormation::WaitCondition'
  Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      Name: BucketName

참고: BucketName을 사용하는 버킷 이름으로 바꾸십시오.

"Invalid policy syntax" 또는 "MalformedPolicy" 오류

ID 정책, 리소스 정책, 서비스 제어 정책 또는 리소스 제어 정책을 만들 때 검증은 두 단계로 나뉩니다. 이러한 단계에는 AWS Identity and Access Management(IAM) 검증과 CloudFormation 검증이 포함됩니다.

정책을 검증하려면 정책을 만든 후 다음 validate-policy AWS CLI 명령을 실행합니다.

➜  aws accessanalyzer validate-policy --policy-document file://policy-document.json --policy-type IDENTITY_POLICY

참고: policy-document.json을 JSON 파일의 파일 경로로 바꾸십시오.

validate-policy AWS CLI 명령을 실행하면 "Invalid policy syntax" 또는 "MalformedPolicy" 오류 메시지가 표시됩니다. 이 문제를 해결하려면 Actions3:DeleteObject로 변경하고 명령을 다시 실행하십시오.

JSON 예시:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyObjectDeletionForAllExceptRolePrefix",
      "Effect": "Deny",
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:PutLifecycleConfiguration"
      ],
      "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
    }
  ]
}

참고: BUCKET_NAME을 사용하는 버킷 이름으로 바꾸십시오.

CloudFormation 템플릿에 검증된 정책을 추가하고 파라미터 또는 리소스를 지정합니다.

하위 함수가 템플릿에 없는 파라미터를 참조하는 경우 다음과 같은 오류 메시지가 표시됩니다.

"An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: Unresolved resource dependencies [Bucket] in the Resources block of the template"

이 오류를 해결하려면 템플릿의 Resourcearn:aws:s3:::${BucketName}/*로 업데이트하십시오.

JSON 예시:

{
  "Parameters": {
    "BucketName": {
      "Type": "String"
    },
    "RoleName": {
      "Type": "String"
    }
  },
  "Resources": {
    "ManagedPolicy": {
      "Type": "AWS::IAM::ManagedPolicy",
      "Properties": {
        "Roles": [
          {
            "Ref": "RoleName"
          }
        ],
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "DenyObjectDeletionForAllExceptRolePrefix",
              "Effect": "Deny",
              "Action": [
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:PutLifecycleConfiguration"
              ],
              "Resource": [
                {
                  "Fn::Sub": "arn:aws:s3:::${BucketName}/*"
                }
              ]
            }
          ]
        }
      }
    }
  }
}

참고: BucketName을 사용하는 버킷 이름으로 바꾸십시오.

IAM 정책 관련 리소스의 정책 구문을 수동으로 확인

정책이 유효한지 수동으로 확인하려면 다음 정책 템플릿을 사용하십시오.

{  
    "Resources": {  
        "Policy": {  
            "Type": "AWS::IAM::Policy",  
            "Properties": {  
                "PolicyName": "IamPolicyName",  
                "PolicyDocument": {  
                    "Version": "2012-10-17",  
                    "Statement": [  
                        {  
                            "Effect": "effect",  
                            "Action": [  
                                "service:API_action",  
                                "<...>"  
                            ],  
                            "Resource": "desiredResourceARN",  
                            "Condition": {  
                                "ConditionConfiguration": {  
                                    "conditionKey": [  
                                        "values"  
                                    ]  
                                },  
                                "ConditionConfiguration2": "<...>"  
                            }  
                        }  
                    ]  
                }  
            }  
        }  
    }  
}

참고: service를 서비스 이름으로 바꾸고, API_action을 선택한 서비스의 API 작업으로 바꾸십시오. 자세한 내용은 IAM JSON 정책 요소 참조를 참조하십시오.

JSON 정책 문서를 YAML 형식 템플릿과 통합

CloudFormation을 프로비저닝하기 위해 JSON 정책 문서를 YAML 형식 템플릿과 통합하는 경우 템플릿에 문서가 표시되는 방식을 변경할 수 있습니다. 이렇게 하면 YAML과 JSON이 혼합된 블록이 방지됩니다. 통합 후 정책 요소는 다음 예시 템플릿과 유사합니다.

Resources:  
  Policy:  
    Type: 'AWS::IAM::Policy'  
    Properties:  
      PolicyName: IamPolicyName  
      PolicyDocument:  
        Version: 2012-10-17  
        Statement:  
          - Effect: effect  
            Action:  
              - '<service>:<API_action>'  
              - <...>  
            Resource: desiredResourceARN  
            Condition:  
              ConditionConfiguration:  
                conditionKey:  
                  - values  
              ConditionConfiguration2: <...>

참고: IamPolicyName을 IAM 정책 이름으로 바꾸십시오.