

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

# AWS 区域 为 AWS SDK for Java 2.x
<a name="region-selection"></a>

SDK 客户端会 AWS 服务 连接到您在创建客户端时指定的特定 AWS 区域 内容。借助此配置，您的应用程序可以与该地理区域中的 AWS 资源进行交互。当您在未明确设置区域的情况下创建服务客户端时，SDK 将使用外部配置中的默认区域。

## 显式配置 AWS 区域
<a name="region-selection-choose-region"></a>

要显式设置区域，建议您使用在 [Region](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/regions/Region.html) 类中定义的常量。这是所有公开可用区域的枚举。

要使用此类中的枚举区域创建客户端，请使用客户端生成器的 `region` 方法。

```
Ec2Client ec2 = Ec2Client.builder()
          .region(Region.US_WEST_2)
          .build();
```

如果您想要使用的区域不是 `Region` 类中的枚举之一，则可以使用静态 `of` 方法创建一个新区域。借助此方法，您可以访问新区域而无需升级 SDK。

```
Region newRegion = Region.of("us-east-42");
Ec2Client ec2 = Ec2Client.builder()
          .region(newRegion)
          .build();
```

**注意**  
使用构建器构建客户端后，它是*不可变*的，并且 AWS 区域 *无法更改。*如果您需要 AWS 区域 为同一服务使用多个客户端，则应创建多个客户端，每个区域一个。

## 让 SDK 自动确定环境 AWS 区域 中的默认值
<a name="automatically-determine-the-aws-region-from-the-environment"></a>

当您的代码在 Amazon EC2 或上运行时 AWS Lambda，您可能需要将客户端配置为使用与代码运行相同的 AWS 区域 内容。这样可以将您的代码与其运行的环境分离，并且可以更轻松地将应用程序部署到多个 AWS 区域 以降低延迟或冗余。

要使用默认 AWS 区域 提供商链从环境中确定区域，请使用客户端生成器的`create`方法。

```
Ec2Client ec2 = Ec2Client.create();
```

您也可以用其他方式配置客户端，但不能设置区域。SDK 使用 AWS 区域 默认的区域提供商链来获取：

```
Ec2Client ec2Client = Ec2Client.builder()
        .credentialsProvider(ProfileCredentialsProvider.builder()
                .profileName("my-profile")
                .build())
        .build();
```

如果您未使用该`region`方法明确设置，SDK 会咨询默认区域提供商链以确定要使用的区域。 AWS 区域 

### 了解默认 AWS 区域 提供商链
<a name="default-region-provider-chain"></a>

 **SDK 采用以下步骤来查找 AWS 区域：**

1. 通过生成器本身使用 `region` 方法明确设置的所有区域优先于任何其他区域。

1. SDK 会查找 JVM 系统属性 `aws.region`，如果找到则使用其值。

1. 系统会检查 `AWS_REGION` 环境变量。如果已设置该变量，将使用对应区域配置客户端。
**注意**  
 Lambda 容器设置此环境变量。

1. SDK 会检查 [AWS 共享配置和凭证文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)中的活动配置文件。如果 `region` 属性存在，则 SDK 会使用该属性。

   除非被 `AWS_PROFILE` 环境变量或 `aws.profile` JVM 系统属性覆盖，否则 `default` 配置文件是活动配置文件。如果 SDK 在两个文件中找到同一个配置文件（包括 `default` 配置文件）的 `region` 属性，则 SDK 将使用共享凭证文件中的值。

1. SDK 尝试使用 Amazon EC2 实例元数据服务 (IMDS) 来确定当前正在运行的 Amazon EC2 实例的区域。
   + 为了提高安全性，您应该禁止 SDK 尝试使用 IMDS 的版本 1。您可以使用 [安全获取 IAM 角色凭证](ec2-iam-roles.md#securely-read-IAM-role_credentials) 部分中描述的相同设置来禁用版本 1。

1. 如果 SDK 此时仍不能确定区域，客户端创建将失败并返回异常。

开发 AWS 应用程序时，常见的方法是使用*共享配置文件*为本地开发设置区域，并依靠默认的区域提供商链来确定应用程序在 AWS 基础设施上运行时的区域。这可以明显简化客户端创建，并保证应用程序的便携性。

## 检查某项服务在某个区域内是否可用
<a name="region-selection-query-service"></a>

要查看某个区域中是否有特定 AWS 服务 内容可用，请在服务客户端上使用静态`serviceMetadata`方法：

```
DynamoDbClient.serviceMetadata().regions().forEach(System.out::println);
```

前面的代码段打印出了一长串带有 DynamoDB 服务的 AWS 区域 代码：

```
af-south-1
ap-east-1
ap-northeast-1
ap-northeast-2
ap-northeast-3
ap-south-1
ap-south-2
ap-southeast-1
...
```

您可以使用代码来查找您希望服务客户端使用的区域的[区域类枚举](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/regions/Region.html)。

例如，如果您想在代码为 `ap-northeast-2` 的区域内使用 DynamoDB，请至少使用以下配置来创建 DynamoDB 客户端：

```
DynamoDbClient ddb = DynamoDbClient.builder()
    .region(Region.AP_NORTHEAST_2)
    .build();
```

## 选择特定端点
<a name="choosing-a-specific-endpoint"></a>

在某些情况下（例如在服务的预览功能正式发布之前进行测试），您可能需要在区域中指定特定端点。在这些情况下，可以通过调用 `endpointOverride` 方法配置服务客户端。

例如，要将 Amazon EC2 客户端配置为使用带有特定终端节点的欧洲（爱尔兰）区域，请使用以下代码。

```
Ec2Client ec2 = Ec2Client.builder()
               .region(Region.EU_WEST_1)
               .endpointOverride(URI.create("https://ec2.eu-west-1.amazonaws.com"))
               .build();
```

有关所有 AWS 服务的[区域及其相应终端节点](https://docs.aws.amazon.com/general/latest/gr/rande.html)的当前列表，请参阅区域和终端节点。