CloudFormation で「次の送信先設定を検証できません」というエラーを回避するにはどうすればよいですか?

所要時間6分
0

AWS サービスに登録しましたが、AWS CloudFormation で「次の送信先設定を検証できません」というエラーが表示されました。

解決策

エラーメッセージを解決するには、ご使用の構成に応じた以下のトラブルシューティング手順に従ってください。

注記: AWS コマンドラインインターフェイス (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 を Lambda 関数の 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 を Lambda 関数の ARN に、YOUR-REGION を AWS リージョンに置き換えてください。

  2. CloudFormation テンプレートに次のアクセス権限をアタッチして、ラムダ関数が 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 を Lamba 関数の 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-topics 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-NAMEYOUR-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-NAMEYOUR-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 configuration」というエラーを回避するには、次のいずれかの方法を使用してください。

  • 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"
                }
              ]
            }
          }
        }
      }
    }

関連情報

宛先にイベント通知メッセージを発行するアクセス許可の付与

AWS CloudFormation の Lambda イベント通知で「Unable to validate the following destination configurations (次の送信先設定を検証できません)」というエラーを回避するにはどうすればよいですか?

AWS CloudFormation スタックの更新

Amazon SNS 通知のセットアップ

AWS公式
AWS公式更新しました 7ヶ月前
コメントはありません

関連するコンテンツ