AWS SDK Route53:尝试创建一条记录,但获取泛型InvalidInputException:无效的请求

问题描述:

有人可以帮助我处理这个泛型异常吗?有任何想法吗?到目前为止,AWS消息非常有帮助,但现在我陷入困境。AWS SDK Route53:尝试创建一条记录,但获取泛型InvalidInputException:无效的请求

com.amazonaws.services.route53.model.InvalidInputException: Invalid request (Service: AmazonRoute53; Status Code: 400; Error Code: InvalidInput; Request ID: UUID) 

我已经修复了权限问题。 withTTL的javadoc说:“如果您正在创建或更新别名资源记录集,请省略TTL。Amazon Route 53将TTL的值用于别名目标。”,但别名目标不提供这种方法。

AmazonRoute53 route53 = AmazonRoute53ClientBuilder.standard() // 
    .withRegion(Regions.EU_CENTRAL_1) // I thought Route53 is region-independent? 
    .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY))) 
    .build(); 

AliasTarget aliasTarget = new AliasTarget() // 
    .withHostedZoneId(HOSTED_ZONE_ID) // 
    .withEvaluateTargetHealth(false) // 
    .withDNSName("1.2.3.4"); // using a valid IP here 

ResourceRecordSet recordSet = new ResourceRecordSet() // 
    .withType(RRType.A) // 
    .withName("sub.domain.com") // using my own domain here 
    .withTTL(300L) // 
    .withAliasTarget(aliasTarget); 

Change change = new Change() // 
    .withAction(ChangeAction.UPSERT) // 
    .withResourceRecordSet(recordSet); 

route53.changeResourceRecordSets(new ChangeResourceRecordSetsRequest() // 
    .withHostedZoneId(HOSTED_ZONE_ID) // 
    .withChangeBatch(new ChangeBatch().withChanges(change))); 

好吧,我终于明白了。我所做的一切都是错误的,没有别名的目标需要(API吸引我下了那条胡同)。

AmazonRoute53 route53 = AmazonRoute53ClientBuilder.standard() // 
    .withRegion(REGION) // 
    .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY))) 
    .build(); 

ResourceRecordSet recordSet = new ResourceRecordSet() // 
    .withType(RRType.A) // 
    .withName("sub.domain.com") // 
    .withTTL(300L) // 
    .withResourceRecords(new ResourceRecord().withValue("1.2.3.4")); 

Change change = new Change() // 
    .withAction(ChangeAction.UPSERT) // 
    .withResourceRecordSet(recordSet); 

route53.changeResourceRecordSets(new ChangeResourceRecordSetsRequest() // 
    .withHostedZoneId(HOSTED_ZONE_ID) // 
    .withChangeBatch(new ChangeBatch().withChanges(change))); 
+1

如果使用别名目标而不是文字静态A记录,则需要A记录,该A记录镜像不管其他A记录的值是什么。当目标是CloudFront,S3或ELB时,通常使用这种方法。这些服务不会为您提供IP地址以指向...并且由于别名目标区域支付查询帐单,所以指向这些服务的任何主机名在使用别名时都是免费的。它也可以指向同一区域中的另一个名称,类似于CNAME,但在CNAME不可用的情况下可用。 –

+1

谢谢Michael!很高兴知道。 – Zalumon

+0

如果您有一个复杂的DNS路由配置,您正在铺设lbr/geo和潜在的elb/cf并希望隐藏客户端的复杂性,别名也可以派上用场。我喜欢把它看作是另一个记录,服务器端cname的指针。 – imperalix