概要
CloudWatchアラームを使用してエラーが発生したらAmazonSNSでメール送信するように設定を行っていました。
ある日、思い立ってAmazonSNSを暗号化したらメールが届かなくなりましたので、その原因と解決法を記載します。
解決方法
デフォルトのalias/aws/snsではなく、カスタマーマネージドキーを使用する。
※キーポリシーにCloudWatchアラームからkms:Decryptとkms:GenerateDataKey*を使用する許可ポリシーが必要
詳細
調査
調べるとこちらやこちらに記事がありました。
公式にも書いてありますので、公式を参考に対応をしていきます。
アラーム履歴確認
SNS 通知の配信は、SNS トピックの設定と CloudWatch アラームによって異なります。SNS 通知が届かない理由を判断するには、CloudWatch アラームの履歴をチェックしてトリガーアクションのステータスを確認します。
上記指示に従い、履歴を確認します。
以下のログが出ていました。
アクション arn:aws:sns:{リージョン}:{アカウントID}:{SNSトピック名} の実行に失敗しました。エラーが発生しました: "CloudWatch Alarms does not have authorization to access the SNS topic encryption key."
公式にドンピシャな文言が書かれているわけではないですが、状況証拠からSNS トピックの暗号化が原因でトリガーアクションが失敗した場合の対応を行います。
対策
カスタマーマネージドキーの作成
設定は適宜ですが、私は以下のように設定しました。
| 項目 | 値 |
|---|---|
| キーのタイプ | 対称 |
| キーの使用法 | 暗号化および復号化 |
| キーマテリアルオリジン | KMS |
| リージョンごと | 単一リージョンキー |
キーポリシーに以下を追加することを忘れずに。(作成後でも追加できます)
{
"Sid": "Allow_CloudWatch_for_CMK",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*"
}
AmazonSNSの暗号化
AmazonSNSを開き対象トピックを選択します。
編集を開き、暗号化 -オプションの設定を開き、AWS KMSキーに先ほど作成したキーを指定します。

原因
KMS作成時にポリシーを追加したことからもわかりますが、alias/aws/snsはCloudWatchアラームがkms:Decryptとkms:GenerateDataKey*を使うことを許可していません。
一方、CloudWatchアラームはメッセージを SNS トピックに発行する際、これらのAPIを使用しますので、権限不足でエラーになっていたようです。
最後に
ちょっとした変更をするだけで今まで動いていたものが動かなくなるのはよくあるので、設定変更する場合は連携部分をチェックする必要があることを胸に刻みました。

