はじめに
今回は、社内でAWS Jamを実施する際に遭遇した問題点をまとめた記事を提供します。
元々のシナリオでは、KMSでS3とSNSを個々に設定することが求められるものでしたが、本記事ではSNSのKMSに焦点を当てています。
S3イベント通知でSNSトピックを設定するフローの内容になります。
結論
SNSの暗号化には、AWS マネージド型キー(デフォルトの AWS KMS キー)ではなく、カスタマーマネージド型のキー(CMK)を使用する必要があります。
これは、マネージドキーではキーポリシーを修正できないためです。
詳細な解説はこの記事で確認できます。
SNS用のKMS
SNSトピックを作成する際の暗号化には、このKMSを指定します。
キーポリシーのステートメントには以下の内容を含めるよう設定します。
なぜDecrypt
が必要なのかは完全には理解できていないので、これは今後の課題です。
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey*",
"kms:Decrypt"
],
"Resource": "*"
}
SNSトピックのアクセスポリシー
アクセスポリシーには、以下の内容を含めるよう設定します。
これは、S3イベント通知がSNSにメッセージを送信できるようにするための設定です。
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:us-west-1:123456789012:demo"
}
S3イベント通知
特に注意すべき点はありません。通常のS3イベント通知で、宛先としてSNSトピックを指定するだけです。
この時点でアクセスポリシーが正しく設定されていないとエラーが発生します。
S3をKMSで暗号化する場合、そのS3にオブジェクトを保存するユースケースに合わせて、KMSのキーポリシーを修正する必要があると思います。
おわりに
SNSの暗号化にマネージドキーを指定した際に明確なエラーが表示されず、原因追求が難しかったです。現状では、S3イベント通知→SNSトピック→サブスクライバーのアクションという一連の流れをデバッグする方法が不明なので、この問題が解決されれば構築がより容易になると考えています。
また、S3からSNSへの一連の流れにおいて、暗号化と復号化がどのように行われているのかを理解する必要があると感じました。