繁体   English   中英

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

[英]Which region endpoint should AWS Java SDK v2 be using for Route 53?

On Windows 10 I'm using the AWS Java SDK v2 ( software.amazon.awssdk:route53:2.8.3 ) and I'm trying to merely connect and list all my Route 53 hosted zones. 我在我的用户配置(在我的.aws/config文件中)中指定了us-west-1作为默认区域。

我使用以下内容创建了一个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

诚然,我现在的 Internet 连接参差不齐。 那是正确的端点吗? 如果是,为什么不在https://docs.aws.amazon.com/general/latest/gr/rande.html中列出该端点? 如果不是,为什么它要尝试连接到us-west1端点,如果我遵循在线文档(如我上面引用的),这表明不需要指定区域? 或者问题仅仅是我的 Internet 连接和目前零星的 DNS 查找?

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

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

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

简而言之,必须像这样创建 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]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM