Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

AWS Lambdaで発生したKMS復号エラーの原因と対応手順

はじめに

先日、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復号エラーの原因分析と、実際に効果があった対応手順について詳しく解説しました。
条件として同じ事象に遭遇する人は少ないかもしれませんが、同じ問題に直面している方の参考になれば幸いです。