在AWS SDK for Java 2.x 中配置客户端端点
适用于 Java 的 SDK 2.x 提供了多种配置服务端点的方法。端点是 SDK 用来向 AWS 服务进行 API 调用的 URL。默认情况下,SDK 会根据您配置的 AWS 区域自动为每项服务确定适合的端点。但在某些情况下,您可能需要自定义或覆盖这些端点:
-
使用本地或第三方服务实现(例如 LocalStack)
-
通过代理或 VPC 端点连接到 AWS 服务
-
针对测试版或预发布版服务端点进行测试
端点配置选项
AWS SDK for Java 2.x 提供了几种配置端点的方法:
-
使用服务客户端生成器进行代码内配置
-
使用环境变量进行外部配置
-
使用 JVM 系统属性进行外部配置
-
使用共享 AWS 配置文件进行外部配置
代码内端点配置
使用 endpointOverride
配置端点的最直接方法是在服务客户端生成器中使用 endpointOverride 方法。此方法接受表示自定义端点 URL 的 URI 对象。
例 为 Amazon S3 客户端设置自定义端点
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import java.net.URI; S3Client s3 = S3Client.builder() .region(Region.US_WEST_2) .endpointOverride(URI.create("https://my-custom-s3-endpoint.example.com")) .build();
使用 endpointOverride 时,即使已明确设置端点,您仍必须为客户端指定区域。区域用于对请求进行签名。
端点发现
有些 AWS 服务支持端点发现,SDK 可以自动发现要使用的最佳端点。您可以在服务客户端生成器中使用 endpointDiscoveryEnabled 方法来启用或禁用此功能。
例 为 DynamoDB 客户端启用端点发现
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; DynamoDbClient dynamoDb = DynamoDbClient.builder() .region(Region.US_WEST_2) .endpointDiscoveryEnabled(true) .build();
请求级别端点配置
在某些情况下,您可能需要覆盖特定请求的端点,而为其他具有默认端点的请求使用相同的客户端。AWS SDK for Java 2.x 通过请求覆盖来支持此功能。
例 覆盖特定请求的端点
import software.amazon.awssdk.core.SdkRequest; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.http.SdkHttpRequest; S3Client s3 = S3Client.builder() .region(Region.US_WEST_2) .build(); // Create a request GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket("amzn-s3-demo-bucket") .key("my-key") .overrideConfiguration(c -> c.putHeader("Host", "custom-endpoint.example.com")) .build(); // Execute the request with the custom endpoint s3.getObject(getObjectRequest);
请注意,请求级别的端点覆盖受到限制,可能并不适用于所有服务或场景。在大多数情况下,建议使用客户端级别端点配置。
外部端点配置
使用环境变量
您可以使用环境变量来配置端点。SDK 支持通过 AWS_ENDPOINT_URL_[SERVICE] 格式的环境变量来配置服务特定的端点,其中 [SERVICE] 是大写服务标识符。
例 使用环境变量设置 S3 端点
# For Linux/macOS export AWS_ENDPOINT_URL_S3=https://my-custom-s3-endpoint.example.com # For Windows set AWS_ENDPOINT_URL_S3=https://my-custom-s3-endpoint.example.com
您还可以使用以下环境变量设置全局端点 URL 前缀或后缀:
-
AWS_ENDPOINT_URL- 为所有服务设置全局端点 -
AWS_ENDPOINT_URL_PREFIX- 为所有服务端点添加前缀 -
AWS_ENDPOINT_URL_SUFFIX- 为所有服务端点添加后缀
使用 JVM 系统属性
您也可以使用 JVM 系统属性来配置端点。其格式与环境变量类似,但使用不同的命名约定。
例 使用 JVM 系统属性设置 S3 端点
java -Daws.endpointUrl.s3=https://my-custom-s3-endpoint.example.com -jar your-application.jar
也可以通过系统属性进行全局端点配置:
-
aws.endpointUrl- 为所有服务设置全局端点 -
aws.endpointUrl.prefix- 为所有服务端点添加前缀 -
aws.endpointUrl.suffix- 为所有服务端点添加后缀
使用共享 AWS 配置文件
AWS SDK for Java 2.x 还支持通过共享 AWS 配置文件进行端点配置,该文件通常位于 ~/.aws/config(Linux/macOS)或 %USERPROFILE%\.aws\config(Windows)。有关信息和示例,请参阅《AWS SDK 和工具参考指南》。
配置优先级
当存在多个端点配置时,SDK 遵循以下优先顺序(从最高到最低):
-
请求级别覆盖(如果适用)
-
通过
endpointOverride进行客户端级别配置 -
环境变量
-
JVM 系统属性
-
共享 AWS 配置文件
-
基于已配置 AWS 区域的默认端点
特定于服务的端点配置
有些 AWS 服务还具有特定于该服务的额外端点配置选项。下面是几个示例:
Amazon S3 端点配置
Amazon S3 通过 S3Configuration 类支持几种端点配置:
-
dualstackEnabled- 启用 IPv6 支持 -
accelerateModeEnabled- 启用 S3 Transfer Acceleration -
pathStyleAccessEnabled- 使用路径风格访问方式而不是虚拟托管风格 -
useArnRegionEnabled- 为跨区域请求使用 ARN 中的区域 -
fipsModeEnabled- 将请求路由到符合 FIPS 标准的端点
例 配置特定于 S3 的端点选项
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3Configuration; S3Client s3 = S3Client.builder() .region(Region.US_WEST_2) .serviceConfiguration(S3Configuration.builder() .accelerateModeEnabled(true) .dualstackEnabled(true) .pathStyleAccessEnabled(false) .fipsModeEnabled(true) .build()) .build();
DynamoDB 端点配置
对于 DynamoDB,您可能需要使用端点发现或连接到 DynamoDB local 进行测试:
例 连接到 DynamoDB local
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import java.net.URI; DynamoDbClient dynamoDb = DynamoDbClient.builder() .endpointOverride(URI.create("http://localhost:8000")) // The region is meaningless for DynamoDB local but required for the client builder. .region(Region.US_WEST_2) .build();
DynamoDB 还支持使用基于账户的端点,您可以在代码中配置或使用外部设置进行配置。以下示例说明如何在创建客户端时在代码中禁用基于账户的端点(默认设置为首选):
DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .region(Region.US_EAST_1) .accountIdEndpointMode(AccountIdEndpointMode.DISABLED) .build();
最佳实践
在AWS SDK for Java 2.x 中配置端点时,请考虑以下最佳实践:
-
为环境特定的端点使用外部配置 - 使用环境变量、系统属性或 AWS 配置文件来配置不同环境(开发、测试、生产)的端点。
-
对特定于应用程序的端点使用代码内配置 - 使用客户端生成器的
endpointOverride方法来处理特定于应用程序设计的端点。 -
始终指定区域 - 即使在覆盖端点时,也始终指定用于请求签名的区域。
-
请谨慎使用全局端点覆盖 - 使用全局端点覆盖会影响所有服务,而这可能不是您想要的结果。
-
考虑安全影响 - 使用自定义端点时,请确保为这些端点采取了适当的安全措施,尤其是对于生产工作负载。