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. (DescribeInstances オペレーションの呼び出し時に次のエラー (AuthFailure) が発生しました: AWS は提供されたアクセス認証情報を検証できませんでした。)」
簡単な説明
AWS Security Token Service (AWS STS) は、セッショントークンの更新バージョンであるバージョン 2 をサポートしています。新しい AWS リージョン (例えば、バーレーン) はデフォルトでは有効になっておらず、セッショントークンの更新バージョンのみを受け入れます。このエラーは、バージョン 1 セッショントークンを使用して、デフォルトでは有効になっていない AWS リージョンのサービスエンドポイントに対してリクエストを実行する場合に発生する可能性があります。詳細については、「Managing AWS STS in an AWS Region」(AWS リージョンでの AWS STS の管理) を参照してください。
解決方法
リージョンレベルの AWS STS エンドポイントから取得したセッショントークンはバージョン 2 で、すべての AWS リージョンで有効です。ベストプラクティスとして、リージョンレベルの STS エンドポイントを使用することをお勧めします。アプリケーションに地理的に近いエンドポイントを使用すると、レイテンシーが減少し、応答時間が短縮されます。
ここでの問題を解決するには、次のいずれかの方法を実行します。
各リージョンのエンドポイントからトークンを取得する
次のコマンド例は、AWS SDK for Python (Boto3) を使用しています。
注:
- 環境に応じて、your-region、AccountID、RoleName を置き換えます。
- リージョンレベルのエンドポイント用に STS クライアントを設定するには、endpoint_url を設定する必要があります。
# 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')
リージョンレベルのエンドポイントを使用するには、既存の bash スクリプト/コマンドにリージョンとエンドポイント URL のオプションを含めます。
aws sts assume-role --role-arn arn:aws:iam::AccountID:role/RoleName --role-session-name RoleName --region your-region --endpoint-url https://sts.your-region.amazonaws.com
グローバルエンドポイントのためにセッショントークンのリージョンの互換性を変更する
デフォルトでは、グローバルエンドポイントに対する AWS STS コールは、バージョン 1 のセッショントークンを発行します。バージョン 1 トークンは、デフォルトで有効になっている AWS リージョンでのみ有効です。ただし、すべての AWS リージョンで使用できるバージョン 2 のトークンを発行するように STS グローバルエンドポイントを設定することもできます。
この手順については、「 change the Region compatibility of session tokens for the global endpoint」(グローバルエンドポイントに対するセッショントークンのリージョンの互換性を変更する) を参照してください。
重要: バージョン 2 のトークンには、バージョン 1 よりも多くの文字が含まれています。これは、既存のシステムに一時的にトークンを保存する際、影響を与える可能性があります。
関連情報
AWS Security Token Service (STS) で、すべての AWS リージョンと互換性のあるセッショントークンがグローバル STS エンドポイントにより発行されるようになりました
リージョンとエンドポイント