AWS Java SDK v2 应将哪个区域终端节点用于 Route 53?



在 Windows 10 上,我使用的是 AWS Java SDK v2 (software.amazon.awssdk:route53:2.8.3(,我尝试仅连接并列出我所有的 Route 53 托管区域。我us-west-1在我的用户配置(在我的.aws/config文件中(指定为默认区域。

我使用以下方法创建一个Route53Client

Route53Client route53Client = Route53Client.builder().build();

请注意,我没有指出区域,因为在在线文档中它说:

当您使用 AWS CLI 或开发工具包提交请求时,请保留未指定区域和终端节点,或指定 us-east-1 作为区域。

然后,我尝试使用如下所示的内容列出托管区域:

Set<HostedZone> hostedZones = client.listHostedZonesPaginator().stream()
.flatMap(response -> response.hostedZones().stream())
.collect(Collectors.toSet());

在日志中,我看到如下调试消息:

[DEBUG] Unable to load region from software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@...:Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region).

然后它为route53.us-west-1.amazonaws.com抛出了一个java.net.UnknownHostException.

当然,我现在的互联网连接不稳定。这是正确的终点吗?如果是,为什么该端点未列在 https://docs.aws.amazon.com/general/latest/gr/rande.html ?如果不是,如果我遵循在线文档(如上所述(,为什么它会尝试连接到us-west1终结点,该文档指示不需要指示区域?或者问题只是我的互联网连接和目前不稳定的DNS查找?

AWS 开发工具包开发团队决定要求 Route53 请求明确指示Region.AWS_GLOBAL或请求不起作用,正如有人在开发工具包的问题 #456 中指出的那样:

要访问 Route53,您当前需要指定AWS_GLOBAL区域。这样做是为了防止客户使用全球服务,并且没有意识到对于此服务,您的呼叫可能不会停留在区域,并且可能跨越全球。

不幸的是,亚马逊没有费心在SDK中记录这一点(我可以找到(,也没有提供有用的错误消息,而是假设开发人员会在SDK尝试访问不存在的端点时以某种方式猜测问题,即使SDK是根据API和在线文档使用的。

简而言之,必须按如下方式创建 Route53 客户端:

route53Client = Route53Client.builder().region(Region.AWS_GLOBAL).build();

以下是列出托管区域的 AWS Route 53 V2 代码示例:

package com.example.route;
//snippet-start:[route.java2.list_zones.import]
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.route53.Route53Client;
import software.amazon.awssdk.services.route53.model.HostedZone;
import software.amazon.awssdk.services.route53.model.Route53Exception;
import software.amazon.awssdk.services.route53.model.ListHostedZonesResponse;
import java.util.List;
//snippet-end:[route.java2.list_zones.import]
public class ListHostedZones {
public static void main(String[] args) {
Region region = Region.AWS_GLOBAL;
Route53Client route53Client = Route53Client.builder()
.region(region)
.build();
listZones(route53Client);
}
//snippet-start:[route.java2.list_zones.main]
public static void listZones(Route53Client route53Client) {
try {
ListHostedZonesResponse zonesResponse = route53Client.listHostedZones();
List<HostedZone> checklist = zonesResponse.hostedZones();
for (HostedZone check: checklist) {
System.out.println("The name is : "+check.name());
}
} catch (Route53Exception e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
//snippet-end:[route.java2.list_zones.main]
}

最新更新