AWS Java SDK:使用新的 RDS 实例信息更新 Route53 区域记录 更新

问题描述

此处使用 AWS Java SDK 的 Java 8。我有一个私有托管区域 (PHZ),例如 myapp.example.com,并且我在该区域中有一个 A 记录,名为 db.myapp.example.com,它指向一个 RDS 实例。

我现在正在编写一个 Lambda (Java),它将创建一个新的 RDS 实例,并更新 db.myapp.example.com 区域记录以指向新的 RDS 实例。

到目前为止,我的代码的要点如下:

CreateDBInstanceRequest createDbRequest = getSomehow();
DBInstance rdsInstance = amazonRDS.createDBInstance(createDbRequest);

ListHostedZonesResult hostedZonesResult = amazonRoute53.listHostedZones();
Optional<HostedZone> hostedZoneOpt = hostedZonesResult.getHostedZones().stream()
    .filter(zone -> "db.myapp.example.com".equals(zone.getName())).findFirst();
if (hostedZoneOpt.isPresent()) {

    // Todo: how to update the record so that it points to 'rdsInstance'?
    ResourceRecordSet alias = new ResourceRecordSet(aliasName,"A");
    
    Change updatealias = new Change(ChangeAction.UPSERT,alias);
    List<Change> changes = Collections.singletonList(updatealias);
    ChangeBatch changeBatch = new ChangeBatch(changes);

    ChangeResourceRecordSetsRequest changeRecordRequest =
        new ChangeResourceRecordSetsRequest(hostedZoneOpt.get().getId(),changeBatch);
    amazonRoute53.changeResourceRecordSets(changeRecordRequest);
    
} else {
  // handle
}

我认为这在很大程度上是正确的。但是,在搜索 Route53 SDK API docs 之后,我终生无法弄清楚如何/在何处使用新的 RDS (alias : ResourceRecordSet) 信息配置 rdsInstance 实例db.myapp.example.com 现在指向它。

有任何想法吗?提前致谢!

更新

我看到 Route53 中有 TrafficPolicy 的概念,显然我可以将 JSON 文档发送到 AWS 并为我的 A 记录配置流量策略,所以也许这是正确的方法。但是查看 Traffic Policy document definition,我需要能够在其 Value 字段中指定 IP 地址,而且我认为 AWS 开发工具包不会在任何地方公开 IP 地址!

解决方法

根据别名路由上的 AWS docs,您无法创建指向 RDS 实例的别名 DNS 记录。但是,您可以做的是在 Route 53 中创建一个常规的 CNAME 记录,指向 RDS 实例的域名。您的记录类型为 CNAME,名称为 db.myapp.example.com,值为 RDS 实例的域名,即 some-instance.cxu5ec943k5u.us-east-1.rds.amazonaws.com。您可以从 rdsInstance.getEndpoint().getAddress() 获得。

,

一般来说,DNS A 记录只能指向 IP 地址(或者在 Route 53 的情况下,指向某些 AWS 资源的 AWS 别名 - 不包括 RDS)。 CNAME记录可以指向其他子域(包括RDS实例的域名)。