AWS APIの呼び出し時に `InvalidClientTokenId` エラーが発生した。このエラーが示す問題として最も適切なものはどれか?
解説
正解と要点正解は「使用しているAWSアクセスキーIDが無効または削除済みである」です。InvalidClientTokenIdは、API呼び出しに使用されたアクセスキーID(AKIA...で始まる文字列)をAWS側が認識できない場合に発生するエラーです。なぜその答えなのかセッションの同時接続数超過は誤りです。AWSには同時接続数によるこの種のエラーはなく、スロットリング系のエラー(ThrottlingException)とは原因がまったく異なります。一時トークンの有効期限切れの場合はExpiredTokenExceptionが発生します。「InvalidClientTokenId ExpiredTokenException 違い」は重要な区別で、前者はアクセスキーID自体が無効、後者はSTS(Security Token Service)が発行した一時認証情報の期限切れを意味します。IAMロールのポリシーが空の場合は、認証は成功しますがAccessDeniedExceptionとして権限不足のエラーになります。つまり「誰であるかは分かるが、権限がない」という状態であり、キーの有効性とは別の問題です。背景・仕組みAWSの認証は大きく2段階に分かれます。まず認証(Authentication)で「誰がリクエストしたか」を確認し、次に認可(Authorization)で「その操作が許可されているか」を判定します。InvalidClientTokenIdは認証の段階で失敗しており、アクセスキーIDが存在しない・無効化されている・削除済みのいずれかです。このエラーが発生する主な状況は、キーローテーション後に古いキーが環境変数や~/.aws/credentialsに残っている場合、またはIAMコンソールでキーのステータスが「非アクティブ」に変更されている場合です。よくあるミスとエラー最も多いのが、キーローテーション後の更新漏れです。ローカル環境は更新したがCI/CDのシークレットが古いまま、というケースが頻発します。# エラー例 $ aws s3 ls An error occurred (InvalidClientTokenId) when calling the ListBuckets operation: The security token included in the request is invalid. # まず現在使用中の認証情報を確認 $ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************ABCD shared-credentials-file secret_key ****************EFGH shared-credentials-file region ap-northeast-1 config-file ~/.aws/configもう一つ注意すべきなのが、環境変数AWS_ACCESS_KEY_IDが~/.aws/credentialsより優先される点です。意図しない環境変数が残っていると、正しいcredentialsファイルを設定しても古いキーが使われ続けます。# 環境変数に古いキーが残っていないか確認 $ env | grep AWS_ACCESS AWS_ACCESS_KEY_ID=AKIAOLD12345EXAMPLE # 不要なら削除 $ unset AWS_ACCESS_KEY_ID $ unset AWS_SECRET_ACCESS_KEY実務での活用例キーローテーションの運用: IAMのベストプラクティスとして90日ごとのキーローテーションが推奨される。更新時はCI/CD、ローカル環境、サーバーすべてのキーを一括で更新するチェックリストを用意しておくIAM Identity Centerの活用: 長期的なアクセスキーの代わりにIAM Identity Center(旧AWS SSO)を使い、一時認証情報で運用すればキー管理自体が不要になるトラブルシュートの手順: このエラーが出たら、(1) aws configure listで使用中のキーを確認、(2) IAMコンソールでキーのステータスを確認、(3) 環境変数の優先順位を確認、という3ステップで原因を特定できる