【AWS】CloudWatchアラームで、KMS暗号化したSNSメールの送信エラーが発生する【解決方法】

KMS暗号化したSNSメールの送信エラー

こんにちは、Daniel (@daniel__blog) です。

今回は、こんな事象についてです。

AWS環境にて、以下の設定をしています。
・CloudWatchアラームで、EC2インスタンスなどのメトリクスを監視する
・アラーム状態時に、SNSでメールが送信される
・指定するSNSトピックは、KMS暗号化を有効化している

上記の通り、メトリクスがアラーム状態になったら、メール通知が行われる想定でした。

しかし、メトリクスがアラーム状態になってもSNSメールは届きませんでした。いったい何が原因なの?解決方法を教えて下さい!

上記の問題にお答えしていきます。

この記事の内容
  1. CloudWatchアラームでメール送信されない事象
  2. 結論は、KMSの権限不足です
  3. CloudWatchの問題発生時に確認すべきポイント

この記事を書いている僕は、現在インフラエンジニア歴4年。AWS経験は2年ほどあり、実際にこれまで複数のプロジェクトで、AWSでのシステム設計・構築をしてきました。

CloudWatchのアラームでSNSトピックを指定することはよくあります。今回の構成で言うと、SNSトピックがKMS(CMK)で暗号化されている点が肝ですね。

以前、僕もこの問題にぶち当たって無事解決できたので、参考にしていただけますと幸いです。

CloudWatchアラームのメール送信エラーを解決する

以下のポイントに分けてご説明します。

  • 結論:CMK側のポリシー内容不備です
  • 解決方法

結論:CMK側のポリシー内容不備です

結論から言うと、SNSトピックで使用するKMS(CMK)キーのポリシー内容に不備があるからです。あるいは、その可能性が高いです。

エラーの詳しい原因・理由

冒頭で述べましたとおり、今回の問題はSNSトピックでKMS暗号化が有効になっている点が肝です。

通常であれば、CloudWatchのアラームアクションでメールを送信する場合は、SNSへ直接やり取りされます。

CloudWatchサービス ➔ SNSサービス

しかし、対象SNSでKMSキーが指定されていると、CloudWatchサービスは対象KMSキーを使用して、メッセージを暗号化することになります。

CloudWatchサービス ➔ KMSサービス(キーの利用) ➔ SNSサービス

このKMSキーを使う権限はデフォルトでは付与されません。

そのため、指定したKMSキーが使用する権限がなく、送信エラーとなったのでした。

ということで、対象KMSキーのポリシー内容に、「CloudWatchサービスがこのキーを使ってデータキーの生成と、データの復号をしてもいいですよ。」という内容を追記してあげることで、問題は解決します。

エラー内容の出力を見てみる(根拠)

下記の通り、CloudWatchアラームのアクション履歴にも、KMSでアクセス拒否された旨のエラーが確認できます。

アクション arn:aws:sns:ap-northeast-1:<アカウントID>:<SNSトピック名> の実行に失敗しました。エラーが発生しました: “null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: <リクエストID>;Proxy: null)”

解決方法

KMSポリシーに権限を追記する

CloudWatchサービスがKMSキーを使えるように、以下の内容を追記します。

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

正常にメール送信でき、アクション履歴も正常に

正常に送信できていれば、アラームのアクション履歴にも以下の内容が出力されます。

正常に実行されたアクションarn:aws:sns:ap-northeast-1:<アカウントID>:<SNSトピック名>

CloudWatchアラームのエラー発生時にセットで確認すべきポイント

今回の件以外でも、CloudWatchアラームがうまく送信できないときは、
以下のポイントを見てみるのが良いかもです。

  • アラームのアクション履歴
  • アラーム設定の内容
  • SNSで設定しているメールアドレス
  • 関係のあるサービスの挙動を確認

アラームのアクション履歴

まずは、こちらを最初に確認するのが良いかと思います。

アラーム設定内容

アラームの設定内容に不備がないか確認します。特に対象SNSトピックに間違っているとメール送信先も変わってきます。

SNSで設定しているメールアドレス

SNSトピックのSNSサブスクリプションにて登録しているメールアドレスに間違いがないか

関係のあるサービスの挙動をもう一度確認

どこまで問題なく動いていて、どこから想定どおりじゃなくなったかを再度整理することをおすすめします。

参考サイト

https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudwatch-receive-sns-for-alarm-trigger/

この記事のまとめ

ということで、最後にまとめです。

◆今回の設定内容

・CloudWatchアラームで、EC2インスタンスなどのメトリクスを監視する。
・アラーム状態時に、SNSでメールが送信される。
・指定するSNSトピックは、KMS暗号化を有効化している。

◆エラーの原因

対象CMKキーにCloudWatchサービスへの使用権限がなく、処理エラーとなる。

◆解決方法

対象CMKのポリシー内容を追記する。

というわけで、今回は以上です!
最後までお読み頂きありがとうございました!

Writtten by Daniel