

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# での認証情報プロバイダーの使用 AWS SDK for Java 2.x
<a name="credentials"></a>

の認証情報プロバイダーの役割 AWS SDK for Java 2.x は、認証情報を調達して SDK の AWS のサービス クライアントに提供することです。SDK は取得した認証情報を使用して、各リクエストに暗号によって署名することでサービスへの認証を行います。認証情報は通常、アクセスキー、つまりアクセスキー ID とシークレットアクセスキーの組み合わせで構成されます。

[SSO トークンプロバイダー設定](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sso-credentials.html#sso-token-config)を設定するとき、または [IAM (AWS Identity and Access Management) ロールを引き受け](https://docs.aws.amazon.com/sdkref/latest/guide/access-assume-role.html#credOrSourceAssumeRole)るようにランタイムを設定するときに使用する一時的な認証情報を使用すると、セッショントークンがアクセスキーに追加され、 AWS リソースへの時間制限付きアクセスが提供されます。

このトピックでは、SDK が認証情報にアクセスできるようにするいくつかの方法について説明します。

**Topics**
+ [インタラクティブな開発作業](credentials-temporary.md)
+ [デフォルトの認証情報プロバイダーチェーン](credentials-chain.md)
+ [認証情報キャッシュ](credential-caching.md)
+ [特定の認証情報プロバイダーの指定](credentials-providers.md)
+ [共有設定プロファイルの使用](credentials-profiles.md)
+ [外部プロセスの使用](credentials-process.md)
+ [コードで認証情報を指定する](credentials-explicit.md)
+ [Amazon EC2 で IAM ロール認証情報を読み取る](ec2-iam-roles.md)

# を使用してインタラクティブ開発作業の認証情報にアクセスする AWS SDK for Java 2.x
<a name="credentials-temporary"></a>

セキュリティを強化するために、 では、存続期間の長い[認証情報ではなく一時的な認証情報を使用する](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)ように SDK for Java を設定する AWS ことをお勧めします。一時的な認証情報は、アクセスキー (アクセスキー ID とシークレットアクセスキー) およびセッショントークンで構成されています。

一時的な認証情報を使用するには、いくつかのアプローチを使用できます。使用するアプローチ、つまり SDK に提供する設定は、ユースケースに応じて異なります。

Java SDK でインタラクティブな開発作業を行う場合は、 AWS コンソールのログイン認証情報を使用することをお勧めします。

## コンソールのログイン認証情報の使用
<a name="using-con-login-creds"></a>

既存の AWS マネジメントコンソールのサインイン認証情報を使用して、 AWS サービスにプログラムでアクセスできます。ブラウザベースの認証フローの後、 は AWS CLI や SDK for Java 2.x などのローカル開発ツールで動作する一時的な認証情報 AWS を生成します。

このプロセスでは、最初のアカウント設定時に作成されたルート認証情報、IAM ユーザー、または ID プロバイダーからのフェデレーティッド ID を使用して認証でき、 によって一時的な認証情報 AWS CLI が自動的に管理されます。このアプローチにより、長期的な認証情報をローカルに保存する必要がなくなるため、セキュリティが強化されます。

`aws login` コマンドを実行すると、アクティブなコンソールセッションから選択することも、ブラウザベースの認証フローを使用してサインインすることもできます。これにより、一時的な認証情報が自動的に生成されます。SDK for Java 2.x は、これらの認証情報を最大 12 時間自動的に更新します。

**重要**  
すべてのプロジェクトで動作する共有設定ファイルで設定した設定に加えて、個々の Java プロジェクトごとに Maven `pom.xml` ファイルで次の依存関係が必要です。  

```
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>signin</artifactId>
</dependency>
```
`signin` 依存関係は、SDK for Java 2.x がコンソールのログイン認証情報にアクセスして使用できるようにするコードを提供します。

前提条件、ログインおよびサインアウトの詳細については、 *AWS SDK およびツールリファレンスガイド*の[「コンソール認証情報を使用した AWS ローカル開発のログイン](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html)」を参照してください。

## Single-sign-onアプローチ
<a name="single-sign-on-approach"></a>

Java SDK でインタラクティブな開発作業を行う場合は、シングルサインオンアプローチを使用することもできます。このアプリケーションには、次の設定が必要になります。
+ [IAM Identity Center による設定](get-started-auth.md#setup-auth)
+ [AWS 共有設定ファイルでプロファイルを設定する](get-started-auth.md#setup-credentials) 
+ を使用して コマンド AWS CLI を実行してログインし、アクティブなセッションを作成する [3. を使用してサインインする AWS CLI](get-started-auth.md#setup-login-sso) 

### IAM Identity Center の設定
<a name="credentials-temporary-idc"></a>

このガイドの [設定の概要](setup.md#setup-overview) で説明されているように IAM Identity Center シングルサインオンアクセスを使用するように SDK を設定すると、SDK は一時的な認証情報を使用します。

SDK は IAM Identity Center アクセストークンを使用して、`config`ファイルの `sso_role_name` 設定で設定された IAM ロールにアクセスします。SDK はこの IAM ロールを引き受け、 AWS のサービス リクエストに署名するための一時的な認証情報を取得します。

SDK が設定から一時的な認証情報を取得する方法の詳細については、「 AWS SDKs and Tools リファレンスガイド」の「[Understanding IAM Identity Center authentication](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html)」セクションを参照してください。

**重要**  
すべてのプロジェクトで動作する、共有 `config` ファイルで設定した設定に加えて、個々の Java プロジェクトごとに Maven `pom.xml` ファイルに次の依存関係が必要です。  

```
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>sso</artifactId>
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>ssooidc</artifactId>
</dependency>
```
`sso` と `ssooidc` の依存関係は、SDK for Java 2.x が一時的な認証情報にアクセスできるようにするコードを提供します。

### AWS アクセスポータルから一時的な認証情報を取得する
<a name="credentials-temporary-from-portal"></a>

IAM Identity Center シングルサインオン設定の代わりに、 AWS アクセスポータルで利用可能な一時的な認証情報をコピーして使用できます。一時的な認証情報は、プロファイルで使用することも、システムプロパティや環境変数の値として使用することもできます。

**一時的な認証情報用のローカルの認証情報ファイルを設定する**

1. [認証情報の共有ファイルを作成する](https://docs.aws.amazon.com/sdkref/latest/guide/file-location.html)

1. 認証情報ファイルに、作業用の一時的な認証情報を貼り付けるまで、次のプレースホルダーテキストを貼り付けます。

   ```
   [default]
   aws_access_key_id=<value from AWS access portal>
   aws_secret_access_key=<value from AWS access portal>
   aws_session_token=<value from AWS access portal>
   ```

1. ファイルを保存します。これで、ファイル `~/.aws/credentials` はローカルの開発システムに存在しているはずです。このファイルには、特定の名前付きプロファイルが指定されていない場合に SDK for Java が使用する [[default] プロファイル](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html#file-format-profile)が含まれています。

1. [AWS アクセスポータルにサインインする](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosignin.html)

1. アクセス AWS ポータルから IAM ロールの認証情報をコピーするには、[「手動認証情報更新](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtogetcredentials.html#how-to-get-temp-credentials)」の見出しにある手順に従ってください。

   1. リンク先の手順のステップ 2 で、開発ニーズに合ったアクセスを許可する IAM ロールの名前に `Access keys` を選択します。通常、このロールには **PowerUserAccess** や **Developer** などの名前が付いています。

   1. モーダルダイアログボックスでお使いのオペレーティングシステムを選択し、**[ AWS 認証情報ファイルにプロファイルを追加する]** からコンテンツをコピーします。

1. コピーした認証情報をローカル `credentials` ファイルに貼り付け、生成されたプロファイル名を削除します。ファイルは以下のようになります。

   ```
   [default]
   aws_access_key_id=AKIAIOSFODNN7EXAMPLE
   aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   aws_session_token=IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
   ```

1. `credentials` ファイルを保存します。

SDK for Java は、サービスクライアントを作成するときに、これらの一時的な認証情報にアクセスしてリクエストごとに使用します。ステップ 5a で選択した IAM ロールの設定により、[一時的な認証情報の有効期間](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosessionduration.html)が決まります。最大期間は 12 時間です。

一時的な認証情報の有効期限が切れたら、ステップ 4～7 を繰り返します。

# のデフォルトの認証情報プロバイダーチェーン AWS SDK for Java 2.x
<a name="credentials-chain"></a>

のデフォルトの認証情報プロバイダーチェーンは、事前定義された場所のシーケンスで AWS 認証情報 AWS SDK for Java 2.x を自動的に検索するため、アプリケーションは認証情報ソースを明示的に指定 AWS のサービス せずに で認証できます。

デフォルトの認証情報プロバイダーチェーンは [DefaultCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html) クラスによって実装されます。さまざまな場所で設定をチェックする他の認証情報プロバイダーの実装に順番に委任されます。必要な設定要素をすべて見つけることができる認証情報プロバイダーがあると、チェーンが終了します。

デフォルトの認証情報プロバイダチェーンを使用して一時的な認証情報を提供するには、サービスクライアントビルダーを作成しますが、認証情報プロバイダーは指定しません。次のコードスニペットでは、デフォルトの認証情報プロバイダーチェーンを使用して設定を検索して取得する `DynamoDbClient` を作成します。

```
// Any external Region configuration is overridden.
// The SDK uses the default credentials provider chain because no specific credentials provider is specified.
Region region = Region.US_WEST_2;
DynamoDbClient ddb = 
    DynamoDbClient.builder()
                  .region(region)
                  .build();
```

## 認証情報の設定の取得順序
<a name="credentials-default"></a>

SDK for Java 2.x のデフォルトの認証情報プロバイダーチェーンは、事前定義されたシーケンスを使用して、環境内の設定を検索します。

1. Java のシステムプロパティ
   + SDK は、[SystemPropertyCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/SystemPropertyCredentialsProvider.html) クラスを使用して、`aws.accessKeyId`、`aws.secretAccessKey` および `aws.sessionToken` Java システムプロパティから一時的な認証情報をロードします。
**注記**  
Java システムプロパティの設定方法の詳細については、*Java Tutorials* の公式ウェブサイトにある[システムプロパティ](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)のチュートリアルを参照してください。

1. 環境変数
   + SDK は、[EnvironmentVariableCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/EnvironmentVariableCredentialsProvider.html) クラスを使用して、`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` および `AWS_SESSION_TOKEN` システム環境変数から一時的な認証情報をロードします。

1. ウェブ ID トークンと IAM ロールの ARN
   + SDK は [WebIdentityTokenFileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.html) クラスを使用して、ウェブ ID トークンを使用してロールを引き受けることで認証情報をロードします。
   + 認証情報プロバイダーは、次の環境変数または JVM システムプロパティを検索します。
     + `AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile`
     + `AWS_ROLE_ARN`、または `aws.roleArn`
     + `AWS_ROLE_SESSION_NAME` または `aws.roleSessionName` (オプション)
   + SDK が値を取得すると、 AWS Security Token Service (STS) を呼び出し、返される一時的な認証情報を使用してリクエストに署名します。
   + Amazon Elastic Kubernetes Service (EKS) などのランタイム環境は、 AWS SDKs でウェブ ID トークンを自動的に利用可能にし、アプリケーションが一時的な AWS 認証情報を取得できるようにします。

1. 共有 `credentials` および `config` ファイル
   + SDK は [ProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProfileCredentialsProvider.html) を使用して、IAM Identity Center のシングルサインオン設定または一時的な認証情報を共有 `credentials` と `config` ファイル内の `[default]` プロファイルから読み込みます。

      AWS SDKs およびツールリファレンスガイドには、SDK for Java が IAM Identity Center シングルサインオントークンと連携し、SDK が呼び出しに使用する一時的な認証情報を取得する方法に関する詳細[情報](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html#idccredres)が記載されています AWS のサービス。
**注記**  
`credentials` および `config`ファイルは、さまざまな AWS SDKsとツールによって共有されます。詳細については、「 AWS SDKs and Tools リファレンスガイド」の「[.aws/credentials and .aws/config files](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)」を参照してください。
   + 共有 `credentials` および `config` ファイルのプロファイルにはさまざまな設定セットを含めることができるため、`ProfileCredentialsProvider` は `[default]` プロファイルの設定を探すために他の一連のプロバイダーに委任します。
     + **ウェブ ID トークン認証情報** (クラス `WebIdentityTokenCredentialsProvider`): プロファイルに `role_arn` と `web_identity_token_file` が含まれている場合。
     + **SSO 認証情報** (クラス `SsoCredentialsProvider`): プロファイルに `sso_role_name`、`sso_account_id` などの SSO 関連のプロパティが含まれている場合。
     + **ソースプロファイルを使用したロールベースの認証情報** (クラス `StsAssumeRoleCredentialsProvider`): プロファイルに `role_arn` と `source_profile` が含まれている場合。
     + **認証情報ソースを使用したロールベースの認証情報** (クラス `StsAssumeRoleWithSourceCredentialsProvider`): プロファイルに `role_arn` と `credential_source` が含まれている場合。
       + `credential_source = Environment` の場合: `SystemPropertyCredentialsProvider` と `EnvironmentVariableCredentialsProvider` のチェーンを使用
       + `credential_source = Ec2InstanceMetadata` の場合: `InstanceProfileCredentialsProvider` を使用
       + `credential_source = EcsContainer` の場合: `ContainerCredentialsProvider` を使用
     + **コンソールログイン認証情報** (クラス `LoginCredentialsProvider`): プロファイルに が含まれている場合 `login_session` 
     + **プロセス認証情報** (クラス `ProcessCredentialsProvider`): プロファイルに `credential_process` が含まれている場合。
     + **セッション認証情報** (クラス `StaticSessionCredentialsProvider`): プロファイルに `aws_access_key_id`、`aws_secret_access_key`、`aws_session_token` が含まれている場合。
     + **基本的な認証情報** (クラス `StaticCredentialsProvider`): プロファイルに `aws_access_key_id` と `aws_secret_access_key` が含まれている場合。

1.  Amazon ECS コンテナ認証情報
   + SDK は、[ContainerCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ContainerCredentialsProvider.html) クラスを使用して、 以下の環境変数を使用しtえ一時的な認証情報をロードします。

     1. `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 、、または `AWS_CONTAINER_CREDENTIALS_FULL_URI`

     1. `AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE` 、、または `AWS_CONTAINER_AUTHORIZATION_TOKEN`

   ECS コンテナエージェントは、ECS 認証情報エンドポイントを指す `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 環境変数を自動的に設定します。その他の環境変数は通常、標準の ECS 認証情報エンドポイントが使用されない特定のシナリオで設定されます。

1.  Amazon EC2 インスタンス IAM ロール提供の認証情報
   + SDK は [InstanceProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProvider.html) クラスを使用して、 Amazon EC2 メタデータサービスから一時的な認証情報をロードします。

1. SDK が上記のすべてのステップで必要な構成設定を見つけられない場合、次のような出力の例外がスローされます。

   ```
   software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers 
   in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), 
   EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), 
   ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()])
   ```

## コードでの `DefaultCredentialsProvider` の使用
<a name="default-credentials-provider-in-code"></a>

コードでデフォルトの認証情報プロバイダーチェーンを明示的に使用できます。SDK はデフォルトで `DefaultCredentialsProvider` を使用するため、これは認証情報プロバイダーをまったく指定しないことと機能的には同じです。ただし、これを明示的に使用すると、コードの可読性が向上し、自己文書化にもつながります。デフォルトの認証情報チェーンを使用する意図を明確に示します。

```
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

public class ExplicitDefaultCredentialsExample {
    public static void main(String[] args) {
        // Explicitly create the DefaultCredentialsProvider.
        DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider
                                                                    .builder().build();

        // Use it with any service client.
        S3Client s3Client = S3Client.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(defaultCredentialsProvider)
            .build();

        // Now you can use the client with the default credentials chain.
        s3Client.listBuckets();
    }
}
```

デフォルトの認証情報プロバイダーを構築するときに、より多くの設定を指定できます。

```
DefaultCredentialsProvider customizedProvider = DefaultCredentialsProvider.builder()
    .profileName("custom-profile")  // Use a specific profile if the chain gets to the `ProfileCredentialsProvider` stage.
    .asyncCredentialUpdateEnabled(true)  // Enable async credential updates.
    .build();
```

このアプローチにより、デフォルトの認証情報チェーンの利便性を維持しながら、より細かく制御できます。

# での認証情報キャッシュ AWS SDK for Java 2.x
<a name="credential-caching"></a>

は、認証情報キャッシュ AWS SDK for Java 2.x を実装してパフォーマンスを向上させ、認証情報ソースへの呼び出しを減らします。このセクションでは、認証情報キャッシュの仕組みと、アプリケーションに合わせて設定する方法について説明します。

## 認証情報プロバイダーのキャッシュについて
<a name="understanding-credential-provider-caching"></a>

SDK for Java 2.x の認証情報プロバイダーは、さまざまなキャッシュ戦略を使用します。
+ **内部認証情報キャッシュ**: 多くのプロバイダーは、取得した認証情報をキャッシュします。
+ **自動更新**: 認証情報をキャッシュするプロバイダーは、更新メカニズムを実装しています。

### 内部で認証情報をキャッシュするプロバイダー
<a name="providers-with-internal-caching"></a>

次の認証情報プロバイダーは、新しいインスタンスを作成する場合でも、認証情報を内部でキャッシュします。
+ **インスタンスプロファイル認証情報プロバイダー**: Amazon EC2 メタデータサービスから認証情報をキャッシュします。
+ **コンテナ認証情報プロバイダー**: コンテナメタデータエンドポイントから認証情報をキャッシュします。
+ **STS ベースのプロバイダー**: AWS Security Token Service (STS) から一時的な認証情報をキャッシュします。
+ **ウェブ ID トークンプロバイダー**: ウェブ ID トークンから取得した認証情報をキャッシュします。
+ **プロセス認証情報プロバイダー**: 外部プロセスから認証情報をキャッシュします。

### 内部キャッシュを使用しないプロバイダー
<a name="providers-without-caching"></a>

以下のプロバイダーは内部キャッシュを実装していません。
+ **環境変数認証情報プロバイダー**
+ **システムプロパティ認証情報プロバイダー**
+ **静的認証情報プロバイダー**

## 認証情報キャッシュの設定
<a name="configuring-credential-caching"></a>

認証情報プロバイダーを構築するときに、キャッシュ動作をカスタマイズできます。

### 失効時間
<a name="stale-time"></a>

認証情報が失効し、更新が必要なタイミングを制御します。

```
.staleTime(Duration.ofMinutes(2))  // Consider stale 2 minutes before expiration.
```

### プリフェッチ時間
<a name="prefetch-time"></a>

有効期限が切れる前に認証情報の更新を開始するタイミングを決定します。

```
.prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration.
```

### 非同期更新
<a name="async-updates"></a>

バックグラウンドでの認証情報の更新を有効にします。

```
.asyncCredentialUpdateEnabled(true)  // Refresh credentials in background thread.
```

### セッション期間
<a name="session-duration"></a>

STS ベースのプロバイダーで、一時的な認証情報が有効な期間を制御します。

```
.refreshRequest(r -> r.durationSeconds(3600))  // 1 hour session.
```

## 認証情報キャッシュの設定例
<a name="example-optimized-sts-config"></a>

認証情報プロバイダーの実装用にキャッシュを設定する例として、SDK でバックグラウンドスレッドを使用して、有効期限が切れる前に認証情報をプリフェッチ (事前に取得) できます。これにより、新しい認証情報を取得するブロッキング呼び出しを回避できます。

ビルダーで `[asyncCredentialUpdateEnabled](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#asyncCredentialUpdateEnabled(java.lang.Boolean))` プロパティを `true` に設定することで、バックグラウンドスレッドを使用して認証情報をプリフェッチする `[StsAssumeRoleCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsAssumeRoleCredentialsProvider.html)` を作成する例を次に示します。

```
StsAssumeRoleCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
    .refreshRequest(r -> r
        .roleArn("arn:aws:iam::111122223333:role/example-role")
        .roleSessionName("example-session")
        .durationSeconds(3600))  // 1 hour session
    .staleTime(Duration.ofMinutes(5))  // Consider stale 5 minutes before expiration
    .prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration
    .asyncCredentialUpdateEnabled(true)  // Refresh in background
    .build();

S3Client s3 = S3Client.builder()
    .credentialsProvider(provider)
    .build();
```

`s3Client` で オペレーションを初めて呼び出すと、 `[AssumeRoleRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/model/AssumeRoleRequest.html)`が AWS Security Token Service (STS) に送信されます。STS は、15 分 (900 秒) 有効な一時的な認証情報を返します。`s3Client` インスタンスは、15 分経過する前に更新するまで、キャッシュされた認証情報を使用します。デフォルトでは、SDK は現在のセッションの有効期限の 5 分から 1 分前に新しいセッションの新しい認証情報を取得しようとします。プリフェッチウィンドウは、 `[prefetchTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#prefetchTime(java.time.Duration))` および `[staleTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#staleTime(java.time.Duration))` プロパティを使用して設定できます。

次のセッションベースの認証情報プロバイダーも同様に設定できます。
+ `StsWebIdentityTokenFileCredentialsProvider`
+ `StsGetSessionTokenCredentialsProvider`
+ `StsGetFederationTokenCredentialsProvider`
+ `StsAssumeRoleWithWebIdentityCredentialsProvider`
+ `StsAssumeRoleWithSamlCredentialsProvider`
+ `StsAssumeRoleCredentialsProvider`
+ `DefaultCredentialsProvider` (セッションを使用する認証情報プロバイダーに委任する場合)
+ `ProcessCredentialsProvider`
+ `WebIdentityTokenFileCredentialsProvider`
+ `ContainerCredentialsProvider`
+ `InstanceProfileCredentialsProvider`

認証情報キャッシュを理解すると、 を使用する際のアプリケーションのパフォーマンスと信頼性を最適化できます AWS のサービス。

# で特定の認証情報プロバイダーを指定する AWS SDK for Java 2.x
<a name="credentials-providers"></a>

デフォルトの認証情報プロバイダーチェーンは多くのシナリオで便利ですが、認証情報プロバイダーを明示的に指定すると、認証の動作、パフォーマンス、セキュリティをより詳細に制御できます。

認証情報プロバイダーを指定する理由には、次のようなものがあります。
+ デフォルトのプロバイダーチェーンは複数のソースを順番にチェックするため、レイテンシーが増加する可能性があります。

  ```
  // The default provider chain checks might check multiple sources until it finds
  // sufficient configuration.
  S3Client s3Client = S3Client.builder().build();
  
  // You can specify exactly where to look.
  S3Client optimizedClient = S3Client.builder()
      .credentialsProvider(InstanceProfileCredentialsProvider.create())
      .build();
  ```
+ 認証情報設定にアクセスするには、標準意外の場所を使用する必要があります。

  ```
  // Use configuration from a custom file location.
  S3Client s3Client = S3Client.builder()
      .credentialsProvider(ProfileCredentialsProvider.builder()
              .profileFile(ProfileFile.builder()
                      .content(Paths.get("/custom/path/to/configuration/file"))
                      .type(ProfileFile.Type.CONFIGURATION) // Expects all non-default profiles to be prefixed with "profile".
                      .build())
              .profileName("custom")
              .build())
      .build();
  ```
+ サービスクライアントごとに異なる認証情報を使用します。たとえば、アプリケーションが複数の AWS アカウントにアクセスしたり、異なるサービスに異なるアクセス許可を使用する必要がある場合です。

  ```
  // S3 client using one set of credentials.
  S3Client s3Client = S3Client.builder()
      .credentialsProvider(ProfileCredentialsProvider.create("s3-readonly"))
      .build();
  
  // DynamoDB client using different credentials.
  DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
      .credentialsProvider(ProfileCredentialsProvider.create("dynamodb-admin"))
      .build();
  ```
+ 認証情報の更新動作を制御します。

  ```
  // Create a provider with custom refresh behavior.
  StsAssumeRoleCredentialsProvider customRefreshProvider = 
      StsAssumeRoleCredentialsProvider.builder()
          .refreshRequest(AssumeRoleRequest.builder()
              .roleArn("arn:aws:iam::123456789012:role/my-role")
              .roleSessionName("custom-session")
              .build())
          .stsClient(StsClient.create())
          .asyncCredentialUpdateEnabled(true) // Use a background thread to prefetch credentials.
          .build();
  
  S3Client s3Client = S3Client.builder()
      .credentialsProvider(customRefreshProvider)
      .build();
  ```

# で AWS 共有設定プロファイルを使用する AWS SDK for Java 2.x
<a name="credentials-profiles"></a>

共有 `config` と `credentials` ファイルを使用して、複数のプロファイルを設定できます。これにより、アプリケーションは複数の認証情報設定を使用できます。`[default]` プロファイルについては前述に記載したとおりです。SDK は、[ProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProfileCredentialsProvider.html) クラスを使用して、共有 `credentials` ファイルで定義されたプロファイルから設定をロードします。

次のコードスニペットは、`my_profile` というプロファイルの一部として定義された認証情報を使用するサービスクライアントを構築する方法を示しています。

```
Region region = Region.US_WEST_2;
DynamoDbClient ddb = DynamoDbClient.builder()
      .region(region)
      .credentialsProvider(ProfileCredentialsProvider.create("my_profile"))
      .build();
```

## 別のプロファイルをデフォルトとして設定する
<a name="set-a-custom-profile-as-the-default"></a>

`[default]` プロファイル以外のプロファイルをアプリケーションのデフォルトとして設定するには、`AWS_PROFILE` 環境変数をカスタムプロファイルの名前に設定します。

この変数を Linux、macOS、または Unix で設定するには、`export` を使用します。

```
export AWS_PROFILE="other_profile"
```

Windows でこれらの変数を設定するには、`set` を使用します。

```
set AWS_PROFILE="other_profile"
```

または、`aws.profile` Java システムプロパティをプロファイルの名前に設定します。

## プロファイルの認証情報を再ロード
<a name="profile-reloading"></a>

ビルダーにプロファイル認証情報を再ロードする `profileFile()` メソッドを持つ認証情報プロバイダーならどれでも設定できます。これらの認証情報プロファイルクラスは `ProfileCredentialsProvider`、`DefaultCredentialsProvider`、`InstanceProfileCredentialsProvider`、および `ProfileTokenProvider.` です。

**注記**  
プロファイル認証情報の再ロードは、プロファイルファイル内の設定でのみ機能します。`aws_access_key_id`、`aws_secret_access_key`、および `aws_session_token`。  
`region`、`sso_session`、`sso_account_id`、および `source_profile` などの設定は無視されます。

サポートされている認証情報プロバイダーがプロファイル設定を再ロードするように設定するには、`profileFile()` ビルダーメソッドに [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/profiles/ProfileFileSupplier.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/profiles/ProfileFileSupplier.html) のインスタンスを指定します。次のコード例は、`[default]` プロファイルから認証情報設定を再ロードする `ProfileCredentialsProvider` を示しています。

```
ProfileCredentialsProvider provider = ProfileCredentialsProvider
    .builder()
    .profileFile(ProfileFileSupplier.defaultSupplier())
    .build();

// Set up a service client with the provider instance.
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
                    .region(Region.US_EAST_1)
                    .credentialsProvider(provider)
                    .build();

/*
    Before dynamoDbClient makes a request, it reloads the credentials settings 
    by calling provider.resolveCredentials().
*/
```

`ProfileCredentialsProvider.resolveCredentials()` が呼び出されると、SDK for Java は設定を再ロードします。`ProfileFileSupplier.defaultSupplier()` は SDK が提供する`ProfileFileSupplier` の[いくつかの便利な実装](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/profiles/ProfileFileSupplier.html)の 1 つです。ユースケースで必要な場合は、独自の実装を提供できます。

次の例は、`ProfileFileSupplier.reloadWhenModified()` の便利なメソッドの使用方法を示しています。`reloadWhenModified()` は `Path` パラメータを取るので、標準 `~/.aws/credentials` (または`config`) 場所ではなく、設定のソースファイルを柔軟に指定できます。

ファイルの内容が変更されたと SDK が判断した場合にのみ、`resolveCredentials()` が呼び出されたときに設定が再ロードされます。

```
Path credentialsFilePath = ...

ProfileCredentialsProvider provider = ProfileCredentialsProvider
    .builder()
    .profileFile(ProfileFileSupplier.reloadWhenModified(credentialsFilePath, ProfileFile.Type.CREDENTIALS))
    .profileName("my-profile")
    .build();
/*
    A service client configured with the provider instance calls provider.resolveCredential()
    before each request.
*/
```

`ProfileFileSupplier.aggregate()` メソッドは複数の設定ファイルの内容をマージします。`resolveCredentials()` への呼び出しごとにファイルを再ロードするか、ファイルの設定を最初に読み取った時点で固定するかを決めることができます。

次の例は、プロファイル設定を含む 2 つのファイルの設定を結合する `DefaultCredentialsProvider` を示しています。SDK は、`resolveCredentials()` が呼び出されて設定が変更されるたびに、`credentialsFilePath` 変数が指すファイル内の設定を再ロードします。`profileFile` オブジェクトの設定は変わりません。

```
Path credentialsFilePath = ...;
ProfileFile profileFile = ...;

DefaultCredentialsProvider provider = DefaultCredentialsProvider
        .builder()
        .profileFile(ProfileFileSupplier.aggregate(
                ProfileFileSupplier.reloadWhenModified(credentialsFilePath, ProfileFile.Type.CREDENTIALS),
                ProfileFileSupplier.fixedProfileFile(profileFile)))
        .profileName("my-profile")
        .build();
/*
    A service client configured with the provider instance calls provider.resolveCredential()
    before each request.
*/
```

# を使用して外部プロセスから認証情報をロードする AWS SDK for Java 2.x
<a name="credentials-process"></a>

**警告**  
以下では、外部プロセスから一時的な認証情報を調達する方法について説明します。これは危険な場合があるため、注意して進めてください。可能であれば、他の認証情報プロバイダーを使用することをお勧めします。このオプションを使用する場合は、使用しているオペレーティングシステムのセキュリティ上のベストプラクティスに従って、`config` ファイルができるだけロックされていることを確認してください。  
カスタム認証情報ツールが `StdErr` に秘密情報を書き込まないようにしてください。SDKsと AWS CLI は、そのような情報をキャプチャしてログに記録し、不正なユーザーに公開する可能性があります。

SDK for Java 2.x では、カスタムユースケース用に外部プロセスから一時的な認証情報を取得できます。この機能を設定するには、次の 2 つの方法があります。

## `credential_process` 設定を使用する
<a name="credentials-credential_process"></a>

一時的な認証情報を提供する方法がある場合は、その `credential_process` 設定を `config` ファイル内のプロファイル定義の一部として追加することで統合できます。指定する値には、コマンドファイルへのフルパスを使用する必要があります。ファイルパスにスペースが含まれている場合は、引用符で囲む必要があります。

SDK は指定されたとおりにコマンドを呼び出し、`stdout` から JSON データを読み取ります。

次の例は、スペースを含まないファイルパスとスペースを含むファイルパスにこの設定を使用する方法を示しています。

------
#### [ Linux/macOS ]

**ファイルパス内にスペースを含まない**  

```
[profile process-credential-profile]
credential_process = /path/to/credential/file/credential_file.sh --custom-command custom_parameter
```

**ファイルパス内のスペースを含む**  

```
[profile process-credential-profile]
credential_process = "/path/with/space to/credential/file/credential_file.sh" --custom-command custom_parameter
```

------
#### [ Windows ]

**ファイルパス内にスペースを含まない**  

```
[profile process-credential-profile]
credential_process = C:\Path\To\credentials.cmd --custom_command custom_parameter
```

**ファイルパス内のスペースを含む**  

```
[profile process-credential-profile]
credential_process = "C:\Path\With Space To\credentials.cmd" --custom_command custom_parameter
```

------

次のコードスニペットは、`process-credential-profile` というプロファイルの一部として定義された一時的な認証情報を使用するサービスクライアントを構築する方法を示しています。

```
Region region = Region.US_WEST_2;
S3Client s3Client = S3Client.builder()
      .region(region)
      .credentialsProvider(ProfileCredentialsProvider.create("process-credential-profile"))
      .build();
```

一時的な認証情報のソースとして外部プロセスを使用する方法の詳細については、 AWS SDKs[「プロセス認証情報」セクション](https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html)を参照してください。

## `ProcessCredentialsProvider` を使用する
<a name="credentials-procredprovider"></a>

`config` ファイル内の設定を使用する代わりに、SDK の `[ProcessCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProcessCredentialsProvider.html)` を使用して Java を使用して一時的な認証情報を読み込むこともできます。

以下の例は、`ProcessCredentialsProvider` を使用して外部プロセスを指定する方法と、一時的な認証情報を使用するサービスクライアントを設定する方法のさまざまなバージョンを示しています。

------
#### [ Linux/macOS ]

**ファイルパス内にスペースを含まない**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path/to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**ファイルパス内のスペースを含む**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path\\ with\\ spaces\\ to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------
#### [ Windows ]

**ファイルパス内にスペースを含まない**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("C:\\Path\\To\\credentials.exe optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**ファイルパス内のスペースを含む**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("\"C:\\Path\\With Spaces To\\credentials.exe\" optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------

## 認証に IAM Roles Anywhere を使用する
<a name="credentials-iam-roles-anywhere"></a>

[IAM Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html) は、 の外部で実行 AWS のサービス されているワークロードの一時的な AWS 認証情報を取得できる です AWS。これにより、オンプレミスや他のクラウド環境から AWS リソースへの安全なアクセスが可能になります。

IAM Roles Anywhere でリクエストを認証する前に、必要な情報を収集し、[認証情報ヘルパーツール](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html)をダウンロードする必要があります。「IAM Roles Anywhere ユーザーガイド」の「[開始方法](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html)」の手順に従って、必要なアーティファクトを作成できます。

SDK for Java には、IAM Roles Anywhere から一時的な認証情報を取得するための専用の認証情報プロバイダーはありませんが、認証情報ヘルパーツールと、[外部プロセスから認証情報を取得する](#credentials-process)いずれかのオプションを使用できます。

### プロファイルでの `credential_process` 設定の使用
<a name="credentials-iam-roles-anywhere-config"></a>

共有設定ファイルの次のスニペットは、 AWS `credential_process`設定`roles_anywhere`を使用する という名前のプロファイルを示しています。

```
[profile roles_anywhere]
credential_process = ./aws_signing_helper credential-process \
  --certificate /path/to/certificate \
  --private-key /path/to/private-key \
  --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
  --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
  --role-arn arn:aws:iam::account:role/role-name-with-path
```

すべてのアーティファクトを集めた後、赤で表示されているテキストを自分の値に置き換える必要があります。設定の最初の要素である `aws_signing_helper` は、認証情報ヘルパーツールの実行可能ファイルであり、`credential-process` はコマンドです。

次のコードに示すように、`roles_anywhere` プロファイルを使用するようにサービスクライアントを設定すると、SDK は一時的な認証情報をキャッシュし、有効期限が切れる前に更新します。

```
S3Client s3Client = S3Client.builder()
    .credentialsProvider(ProfileCredentialsProvider.builder()
        .profileName("roles_anywhere").build())
    .build();
```

### `ProcessCredentialsProvider` の設定
<a name="credentials-iam-roles-anywhere-process"></a>

次に示すように、プロファイル設定を使用する代わりに、`ProcessCredentialsProvider` でコードのみのアプローチを使用できます。

```
ProcessCredentialsProvider processCredentialsProvider = ProcessCredentialsProvider.builder()
    .command("""
            ./aws_signing_helper credential-process \
            --certificate /path/to/certificate \
            --private-key /path/to/private-key \
            --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
            --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
            --role-arn arn:aws:iam::account:role/role-name-with-path
        """).build();

S3Client s3Client = S3Client.builder()
    .credentialsProvider(processCredentialsProvider)
    .build();
```

すべてのアーティファクトを集めた後、赤で表示されているテキストを自分の値に置き換えます。

# を使用してコードで認証情報を指定する AWS SDK for Java 2.x
<a name="credentials-explicit"></a>

デフォルトの認証情報チェーン、または特定あるいはカスタムのプロバイダーやプロバイダーチェーンがアプリケーションに対して機能しない場合は、一時的な認証情報をコードで直接指定できます。これらは、[上記の ](credentials-temporary.md#credentials-temporary-from-portal)[IAM ロール認証情報](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtogetcredentials.html)、または AWS Security Token Service () から取得した一時的な認証情報ですAWS STS。を使用して一時的な認証情報を取得した場合は AWS STS、次のコード例に示すように、 AWS のサービス クライアントに渡します。

1. `StsClient.assumeRole()` を呼び出してロールを委任されます。

1. [StaticCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/StaticCredentialsProvider.html) オブジェクトを作成し、`AwsSessionCredentials` オブジェクトとともに提供します。

1. `StaticCredentialsProvider` を使用してサービスクライアントビルダーを設定し、クライアントを構築します。

次の例では、IAM が引き受けたロール AWS STS に対して から返された一時的な認証情報を使用して Amazon S3 サービスクライアントを作成します。

```
    // The AWS IAM Identity Center identity (user) who executes this method does not have permission to list buckets.
    // The identity is configured in the [default] profile.
    public static void assumeRole(String roleArn, String roleSessionName) {
        // The IAM role represented by the 'roleArn' parameter can be assumed by identities in two different accounts
        // and the role permits the user to only list buckets.

        // The SDK's default credentials provider chain will find the single sign-on settings in the [default] profile.
        // The identity configured with the [default] profile needs permission to call AssumeRole on the STS service.
        try {
            Credentials tempRoleCredentials;
            try (StsClient stsClient = StsClient.create()) {
                AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                        .roleArn(roleArn)
                        .roleSessionName(roleSessionName)
                        .build();

                AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
                tempRoleCredentials = roleResponse.credentials();
            }
            // Use the following temporary credential items for the S3 client.
            String key = tempRoleCredentials.accessKeyId();
            String secKey = tempRoleCredentials.secretAccessKey();
            String secToken = tempRoleCredentials.sessionToken();

            // List all buckets in the account associated with the assumed role
            // by using the temporary credentials retrieved by invoking stsClient.assumeRole().
            StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create(
                    AwsSessionCredentials.create(key, secKey, secToken));
            try (S3Client s3 = S3Client.builder()
                    .credentialsProvider(staticCredentialsProvider)
                    .build()) {
                List<Bucket> buckets = s3.listBuckets().buckets();
                for (Bucket bucket : buckets) {
                    System.out.println("bucket name: " + bucket.name());
                }
            }
        } catch (StsException | S3Exception e) {
            logger.error(e.getMessage());
            System.exit(1);
        }
    }
```

## 許可セット
<a name="credentials-explicit-permission-set"></a>

で定義された次のアクセス許可セット AWS IAM アイデンティティセンター により、ID (ユーザー) は次の 2 つのオペレーションを実行できます。

1. Amazon Simple Storage Service の `GetObject` オペレーション。

1.  AWS Security Token Serviceの `AssumeRole` オペレーション。

ロールを引き受けない場合は、この例に示した `s3.listBuckets()` メソッドは失敗します。

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:GetObject",
				"sts:AssumeRole"
			],
			"Resource": [
				"*"
			]
		}
	]
}
```

------

## 役割を引き受けた
<a name="credentials-explicit-role-to-assume"></a>

### 委任されたロールのアクセス許可ポリシー
<a name="credentials-explicit-role-policy"></a>

前の例で委任されたロールには、次のアクセス許可ポリシーがアタッチされています。このアクセス許可ポリシーでは、ロールと同じアカウントのすべてのバケットを一覧表示できます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

### 委任されたロールの信頼ポリシー
<a name="credentials-explicit-trust-policy"></a>

次の信頼ポリシーは、前の例で委任されたロールにアタッチされています。このポリシーでは、2 つのアカウントの ID (ユーザー) がロールを委任されることができます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::555555555555:root"
                ]
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}
```

------

# SDK for Java 2.x を使用して Amazon EC2 で IAM ロール認証情報を読み取る
<a name="ec2-iam-roles"></a>

 IAM ロールを使用して、EC2 インスタンスで実行され、 AWS CLI または AWS API リクエストを行うアプリケーションの一時的な認証情報を管理できます。これは、EC2 インスタンス内でのアクセスキーの保存に推奨されます。EC2 インスタンスに AWS ロールを割り当て、そのすべてのアプリケーションで使用できるようにするには、インスタンスにアタッチされたインスタンスプロファイルを作成します。インスタンスプロファイルにはロールが含まれ、EC2 インスタンスで実行されるプログラムは一時的な認証情報を取得できます。詳細については、「*IAM ユーザーガイド*」の「[Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用して許可を付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)」を参照してください。

このトピックでは、EC2 インスタンスで実行するように Java アプリケーションをセットアップし、 AWS SDK for Java 2.x が IAM ロール認証情報を取得できるようにする方法について説明します。

## 環境から IAM ロールの認証情報を取得する
<a name="default-provider-chain"></a>

アプリケーションが `create`メソッド (または `builder().build()`メソッド) を使用して AWS サービスクライアントを作成する場合、SDK for Java は*デフォルトの認証情報プロバイダーチェーン*を使用します。デフォルトの認証情報プロバイダーチェーンは、SDK が一時的な認証情報と交換できる構成要素を実行環境内で検索します。[のデフォルトの認証情報プロバイダーチェーン AWS SDK for Java 2.x](credentials-chain.md) セクションでは、検索プロセス全体について説明します。

デフォルトのプロバイダーチェーンの最後のステップは、アプリケーションが Amazon EC2 インスタンスで実行されている場合にのみ使用できます。このステップでは、SDK は `InstanceProfileCredentialsProvider` を使用して EC2 インスタンスプロファイルで定義されている IAM ロールを読み取ります。次に SDK はその IAM ロールの一時的な認証情報を取得します。

これらの認証情報は一時的なもので、最終的には失効しますが、`InstanceProfileCredentialsProvider` によって定期的に更新されるため、 AWSにアクセスを許可し続けることができます。

## IAM ロールの認証情報をプログラムで取得する
<a name="programmatic-configuration-for-IAM-role"></a>

EC2 で最終的に `InstanceProfileCredentialsProvider` を使用するデフォルトの認証情報プロバイダーチェーンの代わりに、`InstanceProfileCredentialsProvider` を使用してサービスクライアントを明示的に設定できます。このアプローチは次のスニペットに示されています。

```
S3Client s3 = S3Client.builder()
       .credentialsProvider(InstanceProfileCredentialsProvider.create())
       .build();
```

## IAM ロールの認証情報を安全に取得する
<a name="securely-read-IAM-role_credentials"></a>

デフォルトでは、EC2 インスタンスは [IMDS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) (インスタンスメタデータサービス) を実行し、SDK の `InstanceProfileCredentialsProvider` が設定された IAM ロールなどの情報にアクセスできるようにします。EC2 インスタンスは、デフォルトで 2 つのバージョンの IMDS を実行します。
+ インスタンスメタデータサービスバージョン 1 (IMDSv1) – リクエスト/レスポンスメソッド
+ インスタンスメタデータサービスバージョン 2 (IMDSv2) – セッション指向メソッド

IMDSv1 よりも、[IMDSv2 の方が安全なアプローチ](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)です。

デフォルトでは、Java SDK は最初に IMDSv2 を使用して IAM ロールを取得しますが、失敗した場合は IMDSv1 を試行します。ただし、IMDSv1 は安全性が低いため、 では IMDSv2 のみを使用し、SDK が IMDSv1 を試さないように AWS することをお勧めします。

より安全なアプローチを使用するには、次のいずれかの設定に `true` の値を指定して、SDK が IMDSv1 を使用しないようにします。
+ 環境変数: `AWS_EC2_METADATA_V1_DISABLED`
+ JVM システムプロパティ: aws.`disableEc2MetadataV1`
+ 共有設定ファイルの設定: `ec2_metadata_v1_disabled`

これらの設定のいずれかを `true` に設定すると、最初の IMDSv2 呼び出しが失敗した場合、SDK は IMDSv1 を使用した IMDS ロール認証情報のロードを実行しません。