AWS セキュリティトークンサービス (AWS STS) の API コール AssumeRoleWithWebIdentity が「InvalidIdentityToken」エラーで失敗しました。
簡単な説明
AssumeRoleWithWebIdentity API 呼び出しが失敗した場合、次のメッセージのようなエラーが表示されることがあります。
「AssumeRoleWithWebIdentity 操作を呼び出すときエラー (InvalidIdentityToken) が発生しました。
ID プロバイダーから検証キーを取得できませんでした。」
このエラーは、次のシナリオで発生する可能性があります。
**注記:**この問題はクライアント側で失敗するため、AWS CloudTrail のイベント履歴にはこのエラーは記録されません。
解決策
.well\ _known と jwks\ _uri のパブリックアクセスを確認してください
IdP の.well\ _known URL と jwks\ _uri が公開されていることを確認してください。これは、ブラウザ、Windows コマンド、または Linux コマンドを使用して確認できます。これを行うには、次のいずれかの操作を行います。
アクセスを確認するには、ブラウザで次のリンクにアクセスしてください。
- https://BASE_SERVER_URL/.well-known/openid-configuration
- https://BASE_SERVER_URL/.well-known/jwks.json
-または-
以下のコマンドを実行します。
Windows:
wget https://BASE_SERVER_URL/.well-known/openid-configuration
wget https://BASE_SERVER_URL/.well-known/jwks.json
Linux:
curl https://BASE_SERVER_URL/.well-known/openid-configuration
curl https://BASE_SERVER_URL/.well-known/jwks.json
**注記:**リンクにアクセスできるかどうかを確認するには、リクエストレスポンスの [200] ステータスコードを確認してください。
ファイアウォールの設定を確認
IdP の.well\ _known URL と jwks\ _uri にアクセスできない場合は、ファイアウォールの設定を確認してください。ドメインが拒否リストに含まれていないことを確認してください。
ファイアウォールの現在の構成によっては、ドメインを許可リストに追加する必要がある場合があります。
ファイアウォールの設定にアクセスできない場合は、スマートフォンなど、別のネットワークのデバイスでブラウザを使用してください。ブラウザからのアクセスを確認するには、手順 1 の手順に従ってください。ウェブリクエストが成功すると、ファイアウォールがリクエストをブロックしていることになります。
AssumeRoleWithWebIdentity API 呼び出しを行うサーバーが Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの場合は、設定を確認してください。手順については、「EC2 インスタンスでホストされているウェブサイトに接続できないのはなぜですか?」 を参照してください。
操作のレイテンシーをチェック
操作全体のレイテンシーを確認してください。これには以下の属性が含まれます。
- STS からのリクエスト/レスポンス時間
- IdP からのリクエスト/レスポンス時間
STS レイテンシーを最小限に抑える
STS サービスには、グローバルエンドポイントの代わりに AWS リージョナルエンドポイントを使用してください。これにより、リクエストが地理的に最も近いサーバーにルーティングされ、レイテンシーが最小限に抑えられることが確認されます。詳細については、「AWS STS リージョンを使用するコードの記述」を参照してください。
**注記:**AWS SDK の場合、Region パラメータはリクエストの宛先エンドポイントを sts\ _region\ _endpoint 設定内で呼び出しが行われた場所にルーティングします。
IdP レイテンシーの評価
IdP は STS エンドポイントにリクエストを行います。STS エンドポイントへのリクエストに時間がかかりすぎるかどうかを確認するには、IdP ログ内の IdP の送信パケットを分析します。
**注記:**IdP から STS エンドポイントへのリクエストに 5 秒以上かかる場合、リクエストはタイムアウトして失敗する可能性があります。この API 呼び出しのレイテンシーを減らすために、ID プロバイダーに連絡して、地理的な可用性の向上をリクエストできます。
(オプション) 指数関数的バックオフを使用して再試行回数を増やす
AssumeRoleWithWebIdentityAPI は、アイデンティティプロバイダー (IdP) から情報を取得することに依存します。スロットリングエラーを回避するために、ほとんどの IdP には API 制限があり、API 呼び出しでは IdP から必要なキーが返されない場合があります。API が IdP に到達する際に断続的に問題が発生した場合に、正常に役割を引き継ぐには、次の手順を実行してください。
STS リクエストを.well\ _known と jwks\ _uri に減らす
JSON Web キーセット (JWKS) が Pragma: no-cache または Cache-Control: no-cache 応答ヘッダーのいずれかを設定している場合、STS は JWKS をキャッシュしません。ID\ _TOKEN で参照されているがキャッシュにはないキーについては、STS はコールバックを実行します。この場合、STS は.well\ _known URL と jwks\ _uri に対してあまりにも多くのリクエストを行う可能性があります。
そのため、STS からのコールバックを減らすには、JWKS がこれらの応答ヘッダーのどちらも設定していないことを確認してください。これにより、STS は JWKS をキャッシュできます。
関連情報
AWS セキュリティトークンサービス API リファレンスへようこそ
IAM と AWS STS の API スロットリングエラーまたは「レート超過」エラーを解決する方法を教えてください。