CloudFormation에서 “Unable to validate the following destination configurations.” 오류를 수정하려면 어떻게 해야 합니까?

8분 분량
0

AWS 서비스를 구독했는데 AWS CloudFormation에서 “Unable to validate the following destination configurations.” 라는 오류 메시지를 받았습니다.

해결 방법

오류 메시지를 해결하려면 해당 구성에 대한 다음 문제 해결 단계를 따르세요.

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

Lambda 알림 구성 관련 문제

오류: “notification lambda function not exist”

이 오류는 AWS Lambda 속성 LambdaConfigurations를 사용하는 Amazon Simple Storage Service(Amazon S3) 버킷을 생성하거나 업데이트할 때 발생합니다. CloudFormation 템플릿에 구성된 Lambda 함수의 ARN이 존재하지 않거나 유효하지 않은 경우 이 오류 메시지가 표시될 수 있습니다.

LambdaConfigurations 속성이 존재하는지 확인하려면 다음 AWS CLI 명령을 실행합니다.

aws lambda get-function --function-name YOUR-FUNCTION-ARN-VALUE

참고: YOUR-FUNCTION-ARN-VALUE를 Lamda 함수의 ARN으로 바꿉니다.

명령 출력에서 오류를 수신하면 Lambda 함수의 ARN이 유효하지 않거나 존재하지 않는 것입니다. 올바른 ARN을 포함하도록 템플릿을 업데이트합니다. 그런 다음 새 스택을 생성하거나 기존 스택을 업데이트합니다.

Lambda 함수에 Amazon S3를 호출할 권한이 없습니다

오류: "The resource you requested does not exist"

이 오류가 발생하면 권한이 Lambda 함수에 연결되지 않은 것입니다.

이 문제를 해결하려면, 다음 단계를 완료하세요.

  1. 다음 명령을 실행하여 Lambda 함수 권한을 확인합니다.

    aws lambda get-policy --function-name YOUR-FUNCTION-ARN-VALUE --region YOUR-REGION

    참고: YOUR-FUNCTION-ARN-VALUE를 Lamda 함수의 ARN으로, YOUR-REGION을 AWS 리전으로 바꿉니다.

  2. CloudFormation 템플릿에 다음 권한을 첨부하여 Lambda 함수가 Amazon S3를 호출하도록 허용하세요.

    S3Permission:
        Type: AWS::Lambda::Permission
        Properties:
         FunctionName: YOUR-FUNCTION-ARN-VALUE
         Action: lambda:InvokeFunction
         Principal: s3.amazonaws.com
         SourceAccount: !Ref 'AWS::AccountId'

    참고: YOUR-FUNCTION-ARN-VALUE를 :Lamda 함수의 ARN으로, AccountID를 AWS 계정 ID로 바꿉니다.

  3. Lambda 함수에 권한이 부여된 후에만 S3 버킷이 생성되도록 하려면 DependsOn 속성을 추가하세요.

    S3Bucket:
        Type: AWS::S3::Bucket
        DependsOn:
             - "S3Permission"
        Properties:
         NotificationConfiguration:
           LambdaConfigurations:
            - Function: <<FUNCTION-ARN-VALUE>>
              Event: "s3:ObjectCreated:Put"

Amazon SNS 알림 구성 관련 문제

오류: "SNS Topic does not exist or invalid"

이 오류는 S3 버킷이 TopicConfigurations 속성을 사용하고 Amazon Simple Notification Service(Amazon SNS) 주제가 존재하지 않거나 유효하지 않을 때 발생합니다. ARN 형식 및 값은 Amazon SNS 주제의 ARN과 일치해야 합니다.

list-topic AWS CLI 명령을 실행하여 계정에 SNS 주제의 ARN이 존재하는지 확인합니다.

aws sns list-topics \
--region YOUR-REGION \
--query "Topics[?TopicArn=='YOUR-TOPIC-ARN-VALUE']"

참고: YOUR-REGION을 해당 리전으로, YOUR-TOPIC-ARN-VALUE를 SNS 주제의 ARN으로 바꿉니다.

명령 출력에서 레코드를 받지 못했다면 SNS 주제가 존재하지 않거나 유효하지 않은 것입니다. SNS 주제를 생성하고 주제가 유효한지 확인합니다.

SNS 주제 액세스 정책 관련 문제

TopicConfigurations 속성에 구성된 주제가 유효하면 SNS 주제에 연결된 액세스 정책을 확인하세요.

다음 단계를 완료합니다.

  1. get-topic-attributes AWS CLI 명령을 실행하여 SNS 주제에 연결된 액세스 정책을 확인합니다.

    aws sns get-topic-attributes \
    --topic-arn YOUR-TOPIC-ARN-VALUE \
    --region YOUR-REGION \
    --query 'Attributes.Policy'

    참고: YOUR-TOPIC-ARN-VALUE를 ARN으로, YOUR-REGION을 해당 리전으로 바꿉니다.

  2. 정책에 SNS 주제에 대한 액세스 권한이 없는 경우 정책을 다음 정책으로 바꿉니다.

    {
          "Sid": "S3AccessForNotification",
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SNS:Publish",
          "Resource": "YOUR-TOPIC-ARN-VALUE"
     }

    참고: YOUR-TOPIC-ARN-VALUE를 ARN으로, YOUR-REGION을 해당 리전으로 바꿉니다.

  3. 새 스택을 만들거나 기존 스택을 업데이트합니다.

SNS 주제와 관련된 AWS KMS 키 정책 관련 문제

이 문제를 해결하려면, 다음 단계를 완료하세요.

  1. get-topic-attributes AWS CLI 명령을 실행하여 NotificationConfiguration 속성과 연결된 AWS Key Management Service(AWS KMS) 정책을 확인합니다.

    aws sns get-topic-attributes \
    --topic-arn YOUR-TOPIC-ARN-VALUE \
    --region YOUR-REGION \
    --query "Attributes.KmsMasterKeyId"

    참고: YOUR-TOPIC-ARN-VALUE를 ARN으로, YOUR-REGION을 해당 리전으로 바꿉니다.

  2. 정책 권한을 확인하려면 get-key-policy AWS CLI 명령을 실행합니다.

    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION

    참고: YOUR-KMS-KEY-ARN을 ARN으로, YOUR-REGION을 해당 리전으로 바꿉니다.

    {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": {"Service": "s3.amazonaws.com"},
            "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
            "Resource": "<<YOUR-KMS-KEY-ARN>>"
        }]
    }

Amazon SQS 알림 구성 관련 문제

오류: "SQS queue does not exist"

이 오류는 S3 버킷이 QueueConfigurations 속성을 사용하는데 Amazon SNS ARN이 존재하지 않거나 유효하지 않을 때 발생합니다.

이 문제를 해결하려면, 다음 단계를 완료하세요.

  1. list-queues AWS CLI 명령을 실행하여 계정에 Amazon SQS 대기열이 있는지 확인합니다.

    aws sqs list-queues --queue-name-prefix YOUR-SQS-QUEUE-NAME --region YOUR-REGION

    참고: YOUR-SQS-QUEUE-NAME을 Amazon SQS 대기열 이름으로, YOUR-REGION을 AWS 리전으로 바꿉니다.

  2. Amazon SQS 대기열이 없는 경우 새 대기열을 생성하거나 기존 대기열로 템플릿을 업데이트하세요.

Amazon SQS 액세스 정책에 S3 서비스에 대한 권한이 없습니다

QueueConfigurations 속성에 구성된 Amazon SQS 대기열이 유효한 경우 액세스 정책 권한을 확인하세요.

다음 단계를 완료합니다.

  1. list-queues AWS CLI 명령을 실행하여 Amazon SQS 대기열 정책을 확인합니다.

    aws sqs list-queues --queue-name-prefix YOUR-SQS-QUEUE-NAME --region YOUR-REGION
    
    aws sqs get-queue-attributes \
    --queue-url YOUR-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names Policy

    참고: YOUR-SQS-QUEUE-NAME, YOUR-REGIONYOUR-QUEUE-URL을 Amazon SQS 값으로 바꿉니다.

  2. 정책에 Amazon S3에 대한 액세스 권한이 없는 경우 정책을 다음 정책으로 바꾸세요.

    {
          "Sid": "S3AccessForNotification",
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SQS:SendMessage",
          "Resource": "YOUR-SQS-QUEUE-ARN-VALUE"
     }

    참고: YOUR-SQS-QUEUE-ARN-VALUE를 ARN으로 바꿉니다.

  3. 스택을 생성하거나 업데이트합니다.

SQS 대기열과 관련된 AWS KMS 키 정책 관련 문제

  1. list-queues AWS CLI 명령을 실행하여 NotificationConfiguration 속성에 구성된 AWS KMS 키를 가져옵니다.

    aws sqs list-queues --queue-name-prefix YOUR-SQS-QUEUE-NAME --region YOUR-REGION
    
    aws sqs get-queue-attributes \
    --queue-url YOUR-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names KmsMasterKeyId

    참고: YOUR-SQS-QUEUE-NAME, YOUR-REGIONYOUR-QUEUE-URL을 Amazon SQS 값으로 바꿉니다.

  2. get-key-policy AWS CLI 명령을 실행하여 Amazon S3 서비스에서 키에 액세스할 수 있는지 확인합니다.

    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION

    참고: YOUR-KMS-KEY-ARN을 ARN으로, YOUR-REGION을 해당 리전으로 바꿉니다.

  3. 출력에 AWS KMS 키 정책에 Amazon S3가 키를 사용하도록 허용할 권한이 있는지 확인하세요.

    {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": {"Service": "s3.amazonaws.com"},
            "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
            "Resource": "YOUR-KMS-KEY-ARN"
        }]
    }

    참고: YOUR-KMS-KEY-ARN을 AWS KMS 키의 ARN으로 바꿉니다.

리소스 간 순환 종속성

CloudFormation이 종속성 순서를 관리하는 방식 때문에 Amazon S3 이벤트 알림은 S3 버킷의 속성으로 정의됩니다. 이러한 알림은 S3 버킷 리소스를 생성할 때 설정됩니다.

오류를 방지하려면 다음과 같은 순서로 리소스를 생성해야 합니다.

  • S3 버킷이 SNS 주제를 참조하므로 SNS 주제를 생성합니다.
  • SNS 주제 정책이 S3 버킷과 SNS 주제를 모두 참조하므로 S3 버킷을 생성합니다.

SNS 주제를 S3 이벤트 알림에 구독하기 전에 올바른 권한으로 AWS::SNS::TopicPolicy를 지정해야 합니다. 구독을 생성하기 전에 주제 정책이 있어야 합니다.

“Unable to validate the following destination configurations.” 라는 오류를 피하려면 다음 방법 중 하나를 사용하세요.

  • CloudFormation 템플릿에서 BucketName의 값을 지정합니다.
  • 스택을 생성한 다음 스택 업데이트를 수행합니다.

CloudFormation 템플릿에서 BucketName의 값을 지정합니다

S3 버킷에 정적 이름을 사용하려면 CloudFormation 템플릿의 S3Bucket 리소스에 BucketName 속성의 값을 지정합니다. 더 이상 SNS 주제 정책에 {"Ref": "paramBucketName"} 을 포함할 필요가 없습니다. S3 버킷 이름 값의 정적 이름은 SNS 주제 정책과 Amazon S3 간의 본질적인 종속성을 제거합니다.

다음 예제 CloudFormation 템플릿은 BucketName 속성에 대해 하드코딩된 값(-Bucket-Name-)을 지정합니다.

{
  "Resources": {
    "SNSTopic": {
      "Type": "AWS::SNS::Topic"
    },
    "SNSTopicPolicy": {
      "Type": "AWS::SNS::TopicPolicy",
      "Properties": {
        "PolicyDocument": {
          "Id": "MyTopicPolicy",
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "Statement-id",
              "Effect": "Allow",
              "Principal": {
                "Service": "s3.amazonaws.com"
              },
              "Action": "sns:Publish",
              "Resource": {
                "Ref": "SNSTopic"
              },
              "Condition": {
                "ArnLike": {
                  "aws:SourceArn": {
                    "Fn::Join": [
                      "",
                      [
                        "arn:aws:s3:::",
                        "-Bucket-Name-"
                      ]
                    ]
                  }
                }
              }
            }
          ]
        },
        "Topics": [
          {
            "Ref": "SNSTopic"
          }
        ]
      }
    },
    "S3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DependsOn": [
        "SNSTopicPolicy"
      ],
      "Properties": {
        "AccessControl": "BucketOwnerFullControl",
        "BucketName": "-Bucket-Name-",
        "NotificationConfiguration": {
          "TopicConfigurations": [
            {
              "Topic": {
                "Ref": "SNSTopic"
              },
              "Event": "s3:ObjectCreated:Put"
            }
          ]
        }
      }
    }
  }
}

참고: 버킷 이름을 bucket-name으로 바꿉니다. S3Bucket 리소스에는 SNSTopicPolicy로 설정된 명시적 DependsOn 속성이 있습니다. 이 속성은 템플릿이 S3Bucket 리소스보다 먼저 SNSTopicPolicy 리소스를 생성하도록 지정합니다.

이름이 다른 S3 버킷에 동일한 CloudFormation 템플릿을 사용하려면 버킷 이름에 대한 파라미터를 정의하세요. 스택 생성 중에 버킷 이름을 파라미터로 전달하면 다른 버킷 이름에 동일한 템플릿을 사용할 수 있습니다.

다음 예제 템플릿을 사용하려면 스택 생성 중에 버킷 이름을 paramBucketName 파라미터로 전달해야 합니다.

{
  "Parameters": {
    "paramBucketName": {
      "Type": "String",
      "Description": "Bucket Name"
    }
  },
  "Resources": {
    "SNSTopic": {
      "Type": "AWS::SNS::Topic"
    },
    "SNSTopicPolicy": {
      "Type": "AWS::SNS::TopicPolicy",
      "Properties": {
        "PolicyDocument": {
          "Id": "MyTopicPolicy",
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "Statement-id",
              "Effect": "Allow",
              "Principal": {
                "Service": "s3.amazonaws.com"
              },
              "Action": "sns:Publish",
              "Resource": {
                "Ref": "SNSTopic"
              },
              "Condition": {
                "ArnLike": {
                  "aws:SourceArn": {
                    "Fn::Join": [
                      "",
                      [
                        "arn:aws:s3:::",
                        {
                          "Ref": "paramBucketName"
                        }
                      ]
                    ]
                  }
                }
              }
            }
          ]
        },
        "Topics": [
          {
            "Ref": "SNSTopic"
          }
        ]
      }
    },
    "S3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DependsOn": [
        "SNSTopicPolicy"
      ],
      "Properties": {
        "AccessControl": "BucketOwnerFullControl",
        "BucketName": {
          "Ref": "paramBucketName"
        },
        "NotificationConfiguration": {
          "TopicConfigurations": [
            {
              "Topic": {
                "Ref": "SNSTopic"
              },
              "Event": "s3:ObjectCreated:Put"
            }
          ]
        }
      }
    }
  }
}

스택을 생성한 다음 스택을 업데이트합니다

먼저 스택을 생성하되 S3Bucket 리소스에 NotificationConfiguration 속성을 지정하지 마세요. 그런 다음 스택을 업데이트하여 S3 이벤트 알림을 추가합니다.

  1. SNS 주제 정책을 포함한 모든 리소스를 생성합니다.

    {
      "Resources": {
        "SNSTopic": {
          "Type": "AWS::SNS::Topic"
        },
        "SNSTopicPolicy": {
          "Type": "AWS::SNS::TopicPolicy",
          "Properties": {
            "PolicyDocument": {
              "Id": "MyTopicPolicy",
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Sid": "Statement-id",
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "s3.amazonaws.com"
                  },
                  "Action": "sns:Publish",
                  "Resource": {
                    "Ref": "SNSTopic"
                  },
                  "Condition": {
                    "ArnLike": {
                      "aws:SourceArn": {
                        "Fn::Join": [
                          "",
                          [
                            "arn:aws:s3:::",
                            {
                              "Ref": "S3Bucket"
                            }
                          ]
                        ]
                      }
                    }
                  }
                }
              ]
            },
            "Topics": [
              {
                "Ref": "SNSTopic"
              }
            ]
          }
        },
        "S3Bucket": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "AccessControl": "BucketOwnerFullControl"
          }
        }
      }
    }
  2. 스택을 업데이트하여 S3 이벤트 알림을 추가합니다.

    {
      "Resources": {
        "SNSTopic": {
          "Type": "AWS::SNS::Topic"
        },
        "SNSTopicPolicy": {
          "Type": "AWS::SNS::TopicPolicy",
          "Properties": {
            "PolicyDocument": {
              "Id": "MyTopicPolicy",
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Sid": "Statement-id",
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "s3.amazonaws.com"
                  },
                  "Action": "sns:Publish",
                  "Resource": {
                    "Ref": "SNSTopic"
                  },
                  "Condition": {
                    "ArnLike": {
                      "aws:SourceArn": {
                        "Fn::Join": [
                          "",
                          [
                            "arn:aws:s3:::",
                            {
                              "Ref": "S3Bucket"
                            }
                          ]
                        ]
                      }
                    }
                  }
                }
              ]
            },
            "Topics": [
              {
                "Ref": "SNSTopic"
              }
            ]
          }
        },
        "S3Bucket": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "AccessControl": "BucketOwnerFullControl",
            "NotificationConfiguration": {
              "TopicConfigurations": [
                {
                  "Topic": {
                    "Ref": "SNSTopic"
                  },
                  "Event": "s3:ObjectCreated:Put"
                }
              ]
            }
          }
        }
      }
    }

관련 정보

대상에 이벤트 알림 메시지를 게시할 수 있는 권한 부여

CloudFormation의 Lambda 이벤트 알림에서 “다Unable to validate the following destination configurations” 오류가 발생하지 않도록 하려면 어떻게 해야 합니까?

AWS CloudFormation 스택 업데이트

Amazon SNS 알림 설정

AWS 공식
AWS 공식업데이트됨 5달 전