

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用适用于 Java 的 SDK 2.x 在 Amazon EC2 上读取 IAM 角色凭证
<a name="ec2-iam-roles"></a>

 您可以使用 IAM 角色管理在 EC2 实例上运行并发出 AWS CLI 或 AWS API 请求的应用程序的临时证书。这优先于在 EC2 实例中存储访问密钥。要向 EC2 实例分配 AWS 角色并使其可供其所有应用程序使用，您需要创建附加到该实例的实例配置文件。实例配置文件包含角色，并使 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 服务客户端，则 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 实例运行 IMDS 的两个版本：
+ 实例元数据服务版本 1 (IMDSv1)-一种 request/response 方法
+ 实例元数据服务版本 2 (IMDSv2)-一种面向会话的方法

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

默认情况下，Java SDK 首先 IMDSv2 尝试获取 IAM 角色，但如果失败，则会尝试 IMDSv1。但是，由于 IMDSv1 不太安全，因此 AWS 建议 IMDSv2 仅使用并禁用 SDK 进行尝试 IMDSv1。

要使用更安全的方法，请提供以下设置之一，禁用 SDK 的使用 IMDSv1 ，其值为`true`。
+ 环境变量：`AWS_EC2_METADATA_V1_DISABLED`
+ JVM 系统属性：aws.`disableEc2MetadataV1`
+ 共享配置文件设置：`ec2_metadata_v1_disabled`

 IMDSv1 如果其中一个设置设置为`true`，则在初始 IMDSv2 调用失败时，SDK 不会通过使用来加载 IMDS 角色凭证。