事象
- 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)"
原因
- SNS トピックの暗号化で alias/aws/sns を指定すると、CloudWatch から SNS トピックへの書込みができない。
- CloudWatch アラームは「kms:Decrypt」と「kms:GenerateDataKey」権限が必要。
- SNS のデフォルトの AWS KMS キーはマネージドキーのためキーポリシーを編集できない。
解決策
- 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 トピックで暗号化キーに指定する。
参考
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 通知を受信する際の問題を解決する