

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用適用於 Java 的 SDK 2.x 在 Amazon EC2 上讀取 IAM 角色憑證
<a name="ec2-iam-roles"></a>

 您可以使用 IAM 角色來管理在 EC2 執行個體上執行之應用程式的臨時登入資料，以及提出 AWS CLI 或 AWS API 請求。這是在 EC2 執行個體內儲存存取金鑰的較好方式。若要將 AWS 角色指派給 EC2 執行個體並將其提供給其所有應用程式，您可以建立連接至執行個體的執行個體描述檔。執行個體設定檔包含該角色，並且可讓 EC2 執行個體上執行的程式取得臨時憑證。如需詳細資訊，請參閱 *IAM 使用者指南*中的[使用 IAM 角色來授予許可權給 Amazon EC2 執行個體上執行的應用程式](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)。

本主題提供如何設定您的 Java 應用程式以在 EC2 執行個體上執行，並讓 AWS SDK for Java 2.x 取得 IAM 角色登入資料的相關資訊。

## 從環境取得 IAM 角色登入資料
<a name="default-provider-chain"></a>

如果您的應用程式使用 `create`方法 （或 `builder().build()`方法） 建立 AWS 服務用戶端，適用於 Java 的 SDK 會使用*預設憑證提供者鏈結*。預設登入資料提供者鏈結會搜尋執行環境，尋找 SDK 可以用來交換臨時登入資料的組態元素。[中的預設登入資料提供者鏈結 AWS SDK for Java 2.x](credentials-chain.md) 本節說明完整的搜尋程序。

預設提供者鏈中的最後一個步驟只有在您的應用程式在 Amazon EC2 執行個體上執行時才能使用。在此步驟中，軟體開發套件會使用 `InstanceProfileCredentialsProvider`來讀取 EC2 執行個體描述檔中定義的 IAM 角色。開發套件接著會取得該 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) (Instance Metadata Service)，允許 SDK `InstanceProfileCredentialsProvider`存取資訊，例如已設定的 IAM 角色。EC2 執行個體預設會執行兩個版本的 IMDS：
+ 執行個體中繼資料服務第 1 版 (IMDSv1) – 請求/回應方法
+ 執行個體中繼資料服務第 2 版 (IMDSv2) – 工作階段導向方法

[IMDSv2 是比 IMDSv1 更安全的方法](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)。 IMDSv1

根據預設，Java 開發套件會先嘗試 IMDSv2 來取得 IAM 角色，但如果失敗，則會嘗試 IMDSv1。不過，由於 IMDSv1 較不安全， AWS 因此建議僅使用 IMDSv2，並停用 SDK 來嘗試 IMDSv1。

若要使用更安全的方法，請透過提供下列其中一個值為 的設定，停用 SDK 來停用 IMDSv1`true`。
+ 環境變數： `AWS_EC2_METADATA_V1_DISABLED`
+ JVM 系統屬性：aws。`disableEc2MetadataV1`
+ 共用組態檔案設定： `ec2_metadata_v1_disabled`

當其中一個設定設為 時`true`，如果初始 IMDSv2 呼叫失敗，開發套件不會使用 IMDSv1 載入 IMDSv2角色登入資料。