AWS Identity and Access Management (IAM) の役割を引き受けたところ、API コールでエラーが返されました。 "An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials."
簡単な説明
デフォルトでは、 AWS は新しい AWS リージョンをアクティブ化せず、新しいリージョンはバージョン 2 トークンのみを受け入れます。バージョン 1 のトークンが、AWS がアクティブ化していないリージョンのサービスエンドポイントにリクエストを行うと、次のエラーが発生します。
"An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials."
AWS Security Token Service (AWS STS) のリージョナルエンドポイントを使用するのがベストプラクティスです。STS リージョナルエンドポイントからのセッショントークンはバージョン 2 のトークンであり、すべてのリージョンで有効だからです。または、グローバルエンドポイントからセッショントークンのリージョン互換性設定を変更できます。
解決策
リージョナルエンドポイントからトークンを取得する
**重要:**AWS がデフォルトでアクティブ化しているリージョンの場合は、リクエストを行うアカウントに関係なく、一時的な認証情報を生成する AWS アカウントの STS リージョナルエンドポイントをアクティベートする必要があります。手動で有効化したリージョンの場合は、リクエストを行うアカウント、認証情報を生成するアカウントの両方でリージョンを有効にします。両方のアカウントでリージョンをアクティブ化しないと、"InvalidClientTokenId" エラーが表示されます。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
AWS SDK または AWS CLI のいずれかを使用してトークンを取得できます。
たとえば、次の AWS SDK for Python (Boto3) コマンドを実行できます。
# Replace existing code to create STS client with the following:
sts_client = boto3.client('sts', region_name='your-region', endpoint_url='https://sts.your-region.amazonaws.com')
注: your-region リージョンをご使用のリージョンに、endpoint_url を実際のエンドポイントに置き換えます。
または、次の assume-role コマンドを実行します。
aws sts assume-role --role-arn arn:aws:iam::444455556666:role/RoleName --role-session-name RoleName --region your-region --endpoint-url https://sts.your-region.amazonaws.com
注: your-region をご使用のリージョンに、role-arn を実際の IAM Amazon リソースネーム (ARN) に、endpoint_url をエンドポイントに置き換えます。
グローバルエンドポイントからのセッショントークンのリージョン互換性設定の変更
デフォルトでは、グローバルエンドポイントに対して行う STS 呼び出しはバージョン 1 トークンを発行します。すべてのリージョンでセッショントークンを使用するには、バージョン 2 のトークンを発行するように STS グローバルエンドポイントを設定します。
重要: バージョン 2 のトークンには、バージョン 1 よりも多くの文字が含まれます。トークンサイズの増加は、セッショントークンを一時的に保存する既存のシステムに影響を与える可能性があります。トークンを保存するシステムが、増加したトークンサイズを管理できることを確認してください。