CloudFormation で「次の送信先設定を検証できません」というエラーを回避するにはどうすればよいですか?
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 関数にアクセス権限が付与されていません。
この問題を解決するには、次のステップを実行してください。
-
次のコマンドを実行して Lambda 関数の権限を確認します。
aws lambda get-policy --function-name YOUR-FUNCTION-ARN-VALUE --region YOUR-REGION
**注記:**YOUR-FUNCTION-ARN-VALUE を Lambda 関数の ARN に、YOUR-REGION を AWS リージョンに置き換えてください。
-
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 に置き換えてください。
-
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 トピックにアタッチされているアクセスポリシーを確認してください。
次の手順を実行します。
-
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 を自分のリージョンに置き換えてください。
-
ポリシーに 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 を自分のリージョンに置き換えてください。
-
新しいスタックを作成するか、既存のスタックを更新します。
SNS トピックに関連付けられている AWS KMS キーポリシーに関する問題
この問題を解決するには、次のステップを実行してください。
-
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 を自分のリージョンに置き換えてください。
-
ポリシーのアクセス権限を確認するには、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 が存在しないか有効でない場合に発生します。
この問題を解決するには、次のステップを実行してください。
-
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 リージョンに置き換えてください。
-
Amazon SQS キューが存在しない場合は、新しいキューを作成するか、既存のキューを使用してテンプレートを更新します。
Amazon SQS アクセスポリシーには S3 サービスへのアクセス権限がない
QueueConfigurations プロパティで設定されている Amazon SQS キューが有効な場合は、アクセスポリシーの権限を確認してください。
次の手順を実行します。
-
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-REGION、YOUR-QUEUE-URLは、Amazon SQS の値に置き換えてください。
-
ポリシーに 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 に置き換えてください。
-
スタックを作成または更新します。
SQS キューに関連付けられた AWS KMS キーポリシーに関する問題
-
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-REGION、YOUR-QUEUE-URLは、Amazon SQS の値に置き換えてください。
-
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 を自分のリージョンに置き換えてください。
-
出力で、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 イベント通知を追加します。
-
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" } } } }
-
スタックを更新して 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" } ] } } } } }
関連情報
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 3ヶ月前lg...
- AWS公式更新しました 1年前