

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

# 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 ロール認証情報のロードを実行しません。