はじめに
先日、Lambda環境を整理していた際に予期しないKMS復号エラーが発生しました。
最初はよくあるIAMロールの権限不足やKMSキーのリソースポリシー設定ミスを疑い、一般的なトラブルシューティング手順にしたがって対応を進めました。
しかし、権限設定やリソース設定に問題は見当たらず、通常の復旧手順では解決に至りませんでした。
結果的に、このエラーは従来の対応手順とは異なるアプローチで解決することができましたが、
同様の問題に遭遇した際に参考となる情報が少なかったため、今回の経験を記録として残すことにしました。
事象発生の経緯
先日、Lambda関数とそれに関連するIAMロールを整理していました。
不要と判断したLambda関数群と併せて、関連するIAMロールも削除したところ、
確認不足により、削除対象のIAMロールの中に稼働中のLambda関数にアタッチされているロールが含まれていました。
問題を解決するため、削除してしまったIAMロールと同じ名前・同じポリシー内容で新しいIAMロールを再作成しました。
設定内容は以前とまったく同じであることを確認しており、通常であればこれで問題なく動作するはずでした。
しかし、Lambda関数を実行したところ、KMS復号エラーが発生するようになりました。
このエラーは削除前には発生していなかったため、IAMロールの再作成に何らかの問題があることが推測されましたが、設定内容に差異は見当たらず、原因の特定に時間を要することになりました。
発生した問題
今回発生したエラーは以下の通りです。
Lambda関数を実行したところ、環境変数の復号時に権限「kms:Decrypt」が不足していると言われています。
API アクションの呼び出しに失敗しました。エラーメッセージ: Lambda was unable to decrypt the environment variables because KMS access was denied. Please check the function's KMS key settings. KMS Exception: AccessDeniedExceptionKMS Message: User: arn:aws:sts::<AWSアカウントID>:assumed-role/<ロール名>/<Lambda関数名> is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:ap-northeast-1:<AWSアカウントID>:key/<KMS Key ID> because no resource-based policy allows the kms:Decrypt action (Service: Kms, Status Code: 400, Request ID: <Request ID>) (SDK Attempt Count: 1)
対応方法
一般的なトラブルシューティングとしては、IAMロールやKMS権限の確認ですが、これらは問題ないことが確認できていました。
そこで、ふと環境変数の暗号化設定をカスタマー管理のKMSキーからAWSマネージドキーに変更したところエラーが解消しました。
具体的には、Lambda関数の設定画面で以下の変更を実施します。
- 「設定」タブの「環境変数」⇒「編集」を押下
- 「保管時に暗号化する AWS KMS キー」設定を「カスタマーマスターキーの使用」から「(デフォルト) aws/lambda」にチェックを入れる
- 「保存」押下
※暗号化設定を別の設定に一度変更することで解消されます(詳細は原因とAWSの挙動を参照)。つまり、現在の設定が「カスタマーマスターキーの使用」であれば「(デフォルト) aws/lambda」へ、「(デフォルト) aws/lambda」であれば「カスタマーマスターキーの使用」へ変更してください。解消後は元の暗号化設定に戻しても正常に動作します。
原因とAWSの挙動
事象として不可解であったため、本件をAWSに問い合わせたところ以下のような回答がありました。
Lambda環境変数の暗号化メカニズム
- Lambda関数の環境変数は常にKMSキーで暗号化されて保存される
- デフォルトではAWS管理キー「aws/lambda」が使用される
- 環境変数の参照には実行ロールにKMS復号権限が必要
KMSグラントによる権限管理
- 環境変数を新規設定した際、KMSキーへのグラントが自動付与される
- この仕組みにより、通常は特別な設定なしで環境変数が動作する
IAMロール再作成時の問題
- 同名でIAMロールを再作成しても、KMSからは別のプリンシパルとして認識される
- 各IAMロールは内部的に一意のプリンシパルIDを持つため
- 結果として以下の流れで問題が発生:
- 元のロール:KMSキーにグラントが付与済み
- ロール削除・再作成:新しいプリンシパルIDで作成
- エラー発生:KMSグラントは古いプリンシパルIDに対してのみ存在し、新しいロールには権限が付与されていない
制約事項
- AWS管理キー・カスタマー管理キーのどちらでも同様に発生
- 現時点でこの事象を回避する設定は提供されていない
- IAMロール削除・再作成時は必ず本問題が再発する
まとめ
本記事では、今回発生したKMS復号エラーの原因分析と、実際に効果があった対応手順について詳しく解説しました。
条件として同じ事象に遭遇する人は少ないかもしれませんが、同じ問題に直面している方の参考になれば幸いです。