CloudWatch Events または Alarm で条件に一致したにも関わらず Amazon SNS トピックで通知が送信されないときの対処法

CloudWatch Events または Alarm のターゲットに Amazon SNS を指定したが送信できない場合、2点ご確認ください。1. Amazon SNS トピックのアクセスポリシーに、CloudWatch サービスから SNS トピックにメッセージを発行することが許可されているか。2. SNS トピック の暗号化設定として AWS Key Management Service (KMS) キー「alias/aws/sns」が指定されている場合、暗号化を無効化するか、顧客管理型 CMK をご利用ください。
2020.11.10

困っていた内容

CloudWatch Events または CloudWatch Alarm で条件に一致した場合に、ターゲットとして指定した Amazon SNS トピックで通知が送信されるように設定しました。

しかし、条件に一致しても Amazon SNS トピックで通知が送信されません。

CloudWatch メトリクスでは、当該の Amazon SNS トピック に FailedInvocations と Invocations に値が記録されておりました。

どう対応すればいいの?

以下の 2 点を確認してください。

Amazon SNS トピックのアクセスポリシー

Amazon SNS トピックのアクセスポリシーに、CloudWatch サービスから SNS トピックにメッセージを発行することが許可されているかをご確認ください。

なお、デフォルトでは同一アカウントからのサービスから、SNS トピックにメッセージを発行することは許可されています。

Amazon SNS トピックのアクセスポリシーのデフォルト

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish",
        "SNS:Receive"
      ],
      "Resource": "arn:aws:sns:<リージョン>:<アカウント ID>:<SNS トピック名>",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "<アカウント ID>"
        }
      }
    }
  ]
}

デフォルトから変更した場合は、以下の例のように CloudWatch サービスから、SNS トピックにメッセージを発行することが許可されているかをご確認ください。

{
    "Sid": "Allow_Publish_Alarms",
    "Effect": "Allow",
    "Principal":
    {
        "Service": [
            "cloudwatch.amazonaws.com"
        ]
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:<リージョン>:<アカウント ID>:<SNS トピック名>"
}

Amazon SNS トピックの暗号化

SNS トピック AWS Key Management Service (KMS) キー「alias/aws/sns」がこの暗号化に使用されている場合、CloudWatch アラームはメッセージを SNS トピックに発行できません。

この場合、暗号化を無効化するか、顧客管理型 CMK をご利用ください。

顧客管理型 CMK には、キーポリシーのステートメントセクションに次のアクセス許可が含まれている必要があります。

{
    "Sid": "Allow_CloudWatch_for_CMK",
    "Effect": "Allow",
    "Principal": {
        "Service":[
            "cloudwatch.amazonaws.com"
        ]
    },
    "Action": [
        "kms:Decrypt","kms:GenerateDataKey"
    ],
    "Resource": "*"
}

参考資料

CloudWatch アラームトリガーの SNS 通知を受信する際の問題を解決する

テクニカルサポートノートとは?

クラスメソッドのカルチャー(CLP) の「情報発信を通じて、全ての人々の創造活動に貢献し続ける」という考えから、クラスメソッド メンバーズをご利用のお客様よりいただいたお問い合わせより、他の AWS ユーザーにとっても 有益な情報を一般的な TIPS としてご紹介しています。