CloudFormation で「次の宛先設定を検証できません」というエラーを回避する方法を教えてください。

所要時間6分
0

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

解決策

検証できません」というエラーを解決するには、構成に応じてトラブルシューティングアクションを実行します。

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

Lambda 通知設定に関する問題

Lambda 関数 ARN が存在しないか無効である

Amazon Simple Storage Service (Amazon S3) バケットが AWS Lambda プロパティ LambdaConfigurations を使用している場合、Lambda 関数が存在しないというエラーが表示されることがあります。このエラーは、CloudFormation テンプレートの Lambda 関数に設定された ARN が存在しないか、有効でない場合に発生します。

Lambda 関数の有無を確認するには、get-function コマンドを実行します。

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

注: YOUR-FUNCTION-ARN-VALUE は、お使いの Lambda 関数の ARN に置き換えます。

コマンド出力でエラーが発生した場合、関数の ARN は有効でないか、存在しません。テンプレートを更新して正しい ARN を含めるようにします。次に、更新されたテンプレートを使用して新しいスタックを作成するか、既存のスタックを更新します。

Lambda 関数に Amazon S3 を呼び出すアクセス許可がない

リクエストしたリソースが存在しないというエラーが表示された場合、Lambda 関数に必要なアクセス許可がありません。この問題を解決するには、次の手順を実行します。

  1. Lambda 関数のアクセス許可を確認するには、get-policy コマンドを実行します。
    aws lambda get-policy
    --function-name YOUR-FUNCTION-ARN-VALUE
    --region YOUR-REGION
    注: お使いのものでそれぞれ、FUNCTION-ARN-VALUE を Lambda 関数の ARN に、REGION を AWS リージョンに置き換えます。
  2. Lambda 関数が Amazon S3 を呼び出せるようにするために、CloudFormation テンプレートを更新し、次のアクセス許可をアタッチします。
    S3Permission:    
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: YOUR-FUNCTION-ARN-VALUE
        Action: lambda:InvokeFunction
        Principal: s3.amazonaws.com
        SourceAccount: !Ref 'AWS::AccountId'
    注: FUNCTION-ARN-VALUE は関数の ARN に、AccountID は関数を所有する AWS アカウントに置き換えます。AWS::AccountId 疑似パラメータを使用すると、CloudFormation がスタックを作成するアカウントの ID を自動的に置き換えることができます。
  3. Lambda 関数に必要なアクセス許可が付与された後でのみ CloudFormation が S3 バケットを作成するようにするには、DependsOn 属性を追加します。
    S3Bucket:    
      Type: AWS::S3::Bucket
      DependsOn: "S3Permission"
      Properties:
        NotificationConfiguration:
          LambdaConfigurations:
            - Function: YOUR-FUNCTION-ARN-VALUE
                Event: "s3:ObjectCreated:Put"
    
    注: FUNCTION-ARN-VALUE は、お使いの関数の ARN に置き換えます。

Amazon SNS 通知設定に関する問題

Amazon SNS ARN が存在しないか無効である

S3 バケットが TopicConfigurations プロパティを使用している場合、次の宛先設定を検証できませんというエラーが表示されることがあります。このエラーは、Amazon Simple Notification Service (Amazon SNS) トピックが存在しないか、無効な場合に発生します。ARN の形式と値は、SNS トピックの ARN と一致する必要があります。

SNS トピックの ARN がアカウントに存在するかどうかを確認するには、list-topics コマンドを実行します。

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

注: YOUR-REGION をお使いのリージョンに、YOUR-TOPIC-ARN-VALUE を該当するトピックの ARN に置き換えます。

コマンド出力にレコードが何も表示されない場合、SNS トピックは存在しないか、無効です。この問題を解決するには、SNS トピックを作成します。TopicConfigurations プロパティに有効なトピック ARN を指定していることを確認してください。

SNS トピックに必要なアクセスポリシーがない

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. アクセスポリシーで、Amazon S3 サービスによるトピックへの発行を許可する必要があります。ポリシーにこれらのアクセス許可がない場合は、トピックのアクセスポリシーを編集して次のアクセス許可を含めます。
    {     
          "Sid": "S3AccessForNotification",      
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SNS:Publish",
          "Resource": "YOUR-TOPIC-ARN-VALUE"
    }
    注: YOUR-TOPIC-ARN-VALUE は、実際のトピック ARN に置き換えます。
  3. 新しいスタックを作成したり、既存のスタックを更新したりできることを確認します。

SNS トピックに関連付けられている AWS KMS キーポリシーに関する問題

AWS Key Management Service (AWS KMS) ポリシーは、Amazon S3 が AWS KMS キーにアクセスすることを許可する必要があります。暗号化設定と最低限必要なポリシーを確認するには、次の手順を実行します。

SNS トピックが AWS KMS キーで暗号化されているかどうかを確認するには、get-topic-attributes コマンドを実行します。

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

注: YOUR-TOPIC-ARN-VALUE をトピック ARN に、YOUR-REGION をお使いのリージョンに置き換えます。SNS トピックが暗号化されている場合、コマンドの出力には AWS KMS キー ARN が表示されます。

AWS KMS キーポリシーを確認するには、get-key-policy コマンドを実行します。

aws kms get-key-policy \
--key-id YOUR-KMS-KEY-ARN \
--policy-name default \
--region YOUR-REGION | jq -r '.Policy' | jq .

注: YOUR-KMS-KEY-ARN を実際の ARN に、 YOUR-REGION をお使いのリージョンに置き換えます。可読性のため、jq コマンドを使用してポリシーの内容を JSON 形式で表示するのがベストプラクティスです。詳細については、jq のウェブサイトで ./jq を参照してください。

以下のポリシー例は、最低限必要な AWS KMS キーポリシーを示しています。

{
    "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 に置き換えます。

ポリシーに必要なアクセス許可がない場合は、AWS KMS キーポリシーを更新します。

Amazon SQS 通知設定に関する問題

Amazon SQS ARN が存在しないか無効である

S3 バケットが QueueConfigurations プロパティを使用している場合、SQS キューが存在しませんというエラーが表示されることがあります。このエラーは、Amazon Simple Queue Service (Amazon SQS) の ARN が存在しないか有効でない場合に発生します。

アカウントに Amazon SQS キューが存在するかどうかを確認するには、list-queues コマンドを実行します。

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

注: お使いのものでそれぞれ、YOUR-SQS-QUEUE-NAME を SQS キュー名に、YOUR-REGION をリージョンに置き換えます。

SQS キューが存在しない場合は、新しいキューを作成するか、既存のキューを使用してテンプレートを更新します。

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: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl

SQS キューに必要なアクセスポリシーがない

SQS キューに必要なアクセスポリシーがあることを確認するには、AWS CLI または CloudFormation コンソールを使用します。

AWS CLI を使用してキューのアクセスポリシーを確認するには、次の手順を実行します。

  1. SQS キューポリシーを確認するには、get-queue-attributes コマンドを実行します。
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names Policy | jq .
    注: お使いのものでそれぞれ、YOUR-SQS-QUEUE-NAME を SQS キュー名に、YOUR-REGION をリージョンに、YOUR-SQS-QUEUE-URL をキューの URL に置き換えます。可読性のため、jq コマンドを使用してポリシーの内容を JSON 形式で表示するのがベストプラクティスです。詳細については、jq のウェブサイトで ./jq を参照してください。
  2. ポリシーに Amazon S3 へのアクセス許可がない場合は、JSON ファイルに新しいアクセスポリシーを作成します。
    {"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":
    [{\"Sid\":\"S3AccessForNotification\",\"Effect\":\"Allow\",\"Principal\":
    {\"Service\":\"s3.amazonaws.com\"},\"Action\":\"SQS:SendMessage\",\"Resource\":\"YOUR-SQS-QUEUE-ARN\"}]}"}
    注: YOUR-SQS-QUEUE-ARN をキューの ARN に置き換えます。
  3. ポリシーを更新するには、set-queue-attributes コマンドを実行します。
    aws sqs set-queue-attributes
    --queue-url YOUR-SQS-QUEUE-URL
    --attributes file://sqs-policy.json
    注: YOUR-SQS-QUEUE-URL をキューの URL に、sqs-policy.json をお使いのポリシー JSON ファイルに置き換えます。

CloudFormation コンソールを使用してキューのアクセスポリシーを確認するには、CloudFormation テンプレートを更新して次のリソースを含めます。

SampleSQSPolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    Queues:
      - YOUR-SQS-QUEUE-URL
    PolicyDocument:
      Statement:
        -
          Action:
            - "SQS:SendMessage"
          Effect: "Allow"
          Resource: YOUR-SQS-QUEUE-ARN
          Principal:  
            Service:
              - "s3.amazonaws.com"

注: YOUR-SQS-QUEUE-URL をキューの URL に、YOUR-SQS-QUEUE-ARN をキューの ARN に置き換えます。

ポリシーを作成または更新した後、新しいスタックを作成したり、既存のスタックを更新したりできることを確認します。

詳細については、「Amazon SQS キューにアクセスするために必要なアクセス許可を教えてください」を参照してください。 それでも問題が解決しない場合は、「Amazon SQS での "パラメータポリシーの値が無効です" というエラーのトラブルシューティング方法を教えてください」を参照してください。

SQS キューに関連付けられた AWS KMS キーポリシーに関する問題

AWS KMS キーポリシーの問題を解決するには、次の手順を実行します。

  1. SQS キュー URL を取得するには、list-queues コマンドを実行します。
    aws sqs list-queues
    --queue-name-prefix YOUR-SQS-QUEUE-NAME
    --region YOUR-REGION
    注: お使いのものでそれぞれ、YOUR-SQS-QUEUE-NAME を SQS キュー名に、YOUR-REGION をリージョンに置き換えます。
  2. AWS KMS キー ID を取得するには、get-queue-attributes コマンドを実行します。
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names KmsMasterKeyId
    注: YOUR-SQS-QUEUE-URL をキューの URL に、YOUR-REGION をリージョンに置き換えます。
  3. AWS KMS キー ARN を取得するには、describe-key コマンドを実行します。
    aws kms describe-key --key-id YOUR-KMS-KEY-ID
    注: YOUR-KMS-KEY-ID を実際のキー ID に置き換えます。
  4. 完全なキーポリシーを表示するには、get-key-policy コマンドを実行します。
    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION
    注: YOUR-KMS-KEY-ARN を実際の ARN に、 YOUR-REGION をお使いのリージョンに置き換えます。
  5. 出力で、ポリシーが Amazon S3 に AWS KMS キーの使用を許可していることを確認します。アクセス許可の例:
    {
        "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 に置き換えます。

ポリシーに必要なアクセス許可がない場合は、キーポリシーを更新します。

リソース間の循環依存

重要: SNS トピックを S3 イベント通知にサブスクライブする前に、必要なアクセス許可を持つ AWS::SNS::TopicPolicy を作成する必要があります。トピックポリシーは、サブスクリプションを作成する前に必要です。

最初にトピックポリシーを作成するには、AWS::S3::Bucket リソースの DependsOn 属性を使用する必要があります。この属性は、バケットの前にトピックポリシーを作成します。または、2 つのスタック操作を使用して最初にすべてのリソースを作成し、次に S3Bucket リソースを更新して NotificationConfiguration プロパティを含めることもできます。次のアクションのいずれかを実行します。

CloudFormation テンプレートの BucketName に値を指定する

CloudFormation テンプレートの S3Bucket リソースで、BucketName プロパティに S3 バケットの静的な名前を使用します。静的な S3 バケット名により、SNS トピックポリシーと Amazon S3 の間の本質的な依存関係がなくなります。

重要: 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: !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 リソースを作成することを指定します。

BucketName にパラメータを使用する

パラメータを使用すると、名前が異なる 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: !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 リソースには、SNSTopicPolicy に設定された明示的な DependsOn 属性があります。

スタックを作成し、更新する

注: この方法では、S3Bucket リソースに BucketName プロパティが含まれていません。その結果、CloudFormation がユーザーに代わって一意のバケット名を作成します。循環依存を避けるには、DependsOn 属性を使用しないでください。

まず、S3Bucket リソースに NotificationConfiguration プロパティを指定せずにスタックを作成します。例:

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: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl

S3Bucket リソースに NotificationConfiguration プロパティを追加してから、スタックを更新します。例:

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: !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 イベント通知での "次の送信先設定を検証できません" というエラーを回避する方法を教えてください

AWS CloudFormation スタックを使用して AWS リソースを単一ユニットとして管理する

Amazon SNS 通知のセットアップ

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

関連するコンテンツ