ablog

不器用で落着きのない技術者のメモ

CloudWatch アラームから SNS への通知で KMS から AccessDeniedException と怒られる

事象

  • CloudWatch アラームから SNS への通知で KMS から AccessDeniedException と怒られる
アクション arn:aws:sns:ap-northeast-1:123456789012:cloudwatch-test-sns の実行に失敗しました。エラーが発生しました: "null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: c97514c0-163d-4458-b18c-990a4a83214f; Proxy: null)"

f:id:yohei-a:20211027080553p:plain

原因

  • SNS トピックの暗号化で alias/aws/sns を指定すると、CloudWatch から SNS トピックへの書込みができない。
    • CloudWatch アラームは「kms:Decrypt」と「kms:GenerateDataKey」権限が必要。
  • SNS のデフォルトの AWS KMS キーはマネージドキーのためキーポリシーを編集できない。

f:id:yohei-a:20211027075851p:plain

解決策

  • KMS でカスタマー管理型キーを作成し、キーポリシーで CloudWatch からのアクセスを許可する。
{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudwatch.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*"
        }
    ]
}
  • 作成したカスタマー管理型キーを SNS トピックで暗号化キーに指定する。

f:id:yohei-a:20211027075721p:plain

参考

SNS トピックの暗号化が原因で、トリガーアクションが失敗している場合:

  • CloudWatch アラーム履歴に、次のようなメッセージが表示されます。

アクション arn:aws:sns: : : を実行できませんでした。受信したエラー: 「null (サービス: AWSKMS; ステータスコード: 400; エラーコード: AccessDeniedException;)」

  • SNS では、トピックの保管時の暗号化が許可されています。デフォルトの AWS Key Management Service (KMS) キー「alias/aws/sns」がこの暗号化に使用されている場合、CloudWatch アラームはメッセージを SNS トピックに発行できません。SNS のデフォルトの AWS KMS キーのキーポリシーでは、CloudWatch アラームが「kms:Decrypt」と「kms:GenerateDataKey」API 呼び出しを実行することを許可していません。このキーは AWS マネージドであるため、ポリシーを手動で編集することはできません。
  • SNS トピックを保存時に暗号化する必要がある場合は、カスタマーマネージドキーを使用できます。カスタマーマネージドキーには、キーポリシーのステートメントセクションに次の許可が含まれている必要があります。この許可により、CloudWatch アラームが、暗号化された SNS トピックにメッセージを発行できるようになります。
{
    "Sid": "Allow_CloudWatch_for_CMK",
    "Effect": "Allow",
    "Principal": {
        "Service":[
            "cloudwatch.amazonaws.com"
        ]
    },
    "Action": [
        "kms:Decrypt","kms:GenerateDataKey*"
    ],
    "Resource": "*"
}
CloudWatch アラームトリガーの SNS 通知を受信する際の問題を解決する