使用AWS Java SDK删除Route53资源记录遇问题求助
本人是Java新手,使用AWS Java SDK 1.x(Java 17环境)编写代码删除Route53特定资源记录,遇到两个问题:
- 初始代码编译运行正常,但没有删除效果;
- 修改代码后抛出异常:
[Tried to delete resource record set [name='abc.com.', type='TXT'] but the rdata provided is invalid] (Service: AmazonRoute53; Status Code: 400; Error Code: InvalidChangeBatch; Request ID: 3cccbde8-af09-42da-b894-cc53a1e1043f; Proxy: null)
附初始代码和修改后代码:
初始代码
package oe.k8s; import java.util.ArrayList; import java.util.List; import com.amazonaws.services.route53.AmazonRoute53; import com.amazonaws.services.route53.AmazonRoute53Client; import com.amazonaws.services.route53.model.*; public class TestName1 { public static void main(String[] args) { AmazonRoute53 route53Client = AmazonRoute53Client.builder().withRegion("us-east-1").build(); listZones(route53Client); } public static void listZones(AmazonRoute53 route53Client) { try { ResourceRecordSet rr = new ResourceRecordSet("abc.com", "A"); Change c = new Change(ChangeAction.DELETE, rr); List<Change> cc = new ArrayList<>(); cc.add(c); ChangeBatch cb = new ChangeBatch(cc); ChangeResourceRecordSetsRequest ccc = new ChangeResourceRecordSetsRequest("abc123", cb); ChangeResourceRecordSetsResult ccres = new ChangeResourceRecordSetsResult(); System.out.println("hiiiiiii"); System.out.println(ccres.getChangeInfo()); ListHostedZonesResult zonesResponse = route53Client.listHostedZones(); List<HostedZone> checklist = zonesResponse.getHostedZones(); for (HostedZone check : checklist) { DeleteTrafficPolicyInstanceRequest rq = new DeleteTrafficPolicyInstanceRequest(); System.out.println("id is " + rq.getId()); System.out.println("The name is : " + check.getName()); System.out.println("The resource count is : " + check.getResourceRecordSetCount()); } } catch (AmazonRoute53Exception e) { System.err.println(e.getMessage()); System.exit(1); } } }
修改后代码
public static void main(String[] args) { AmazonRoute53 route53Client = AmazonRoute53Client.builder().withRegion("us-east-1").build(); listZones(route53Client); } public static void listZones(AmazonRoute53 route53Client) { try { GetHostedZoneResult result = route53Client.getHostedZone(new GetHostedZoneRequest("Z0807dasdasasdNHP57O")); HostedZone zone = result.getHostedZone(); ResourceRecordSet recordSet = new ResourceRecordSet().withName("abc.com") .withType(RRType.TXT).withTTL(300L) .withResourceRecords(new ResourceRecord().withValue("abc.com")); ChangeResourceRecordSetsRequest req = new ChangeResourceRecordSetsRequest() .withHostedZoneId("Z0807dasdasasdNHP57O").withChangeBatch(new ChangeBatch().withChanges( new Change().withAction(ChangeAction.DELETE).withResourceRecordSet(recordSet))); route53Client.changeResourceRecordSets(req); List<Change> cc = new ArrayList<>(); ChangeBatch cb = new ChangeBatch(cc); ChangeResourceRecordSetsRequest ccc = new ChangeResourceRecordSetsRequest("Z0807dasdasasdNHP57O", cb); ChangeResourceRecordSetsResult ccres = route53Client.changeResourceRecordSets(ccc); System.out.println("hiiiiiii"); System.out.println(ccres.getChangeInfo()); ListHostedZonesResult zonesResponse = route53Client.listHostedZones(); List<HostedZone> checklist = zonesResponse.getHostedZones(); for (HostedZone check : checklist) { DeleteTrafficPolicyInstanceRequest rq = new DeleteTrafficPolicyInstanceRequest(); System.out.println("id is " + rq.getId()); System.out.println("The name is : " + check.getName()); System.out.println("The resource count is : " + check.getResourceRecordSetCount()); } } catch (AmazonRoute53Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
初始代码无删除效果的原因
初始代码仅创建了删除请求的对象,但从未调用route53Client.changeResourceRecordSets(ccc)方法向AWS发送请求,反而实例化了一个空的ChangeResourceRecordSetsResult,完全没和Route53服务交互,自然不会有删除效果。
修改后代码的异常原因
异常提示TXT记录的RData无效,核心问题是:Route53要求TXT类型的资源记录值必须用双引号包裹。你设置的withValue("abc.com")没有加引号,不符合DNS规范,触发了InvalidChangeBatch错误。
另外,修改后的代码存在冗余操作:发送有效删除请求后,又发送了一个空的ChangeBatch请求,完全没必要,建议删除。
修复后的代码示例
public static void main(String[] args) { AmazonRoute53 route53Client = AmazonRoute53Client.builder().withRegion("us-east-1").build(); deleteRoute53Record(route53Client); } public static void deleteRoute53Record(AmazonRoute53 route53Client) { try { // TXT记录值必须用双引号包裹 ResourceRecord record = new ResourceRecord().withValue("\"abc.com\""); ResourceRecordSet recordSet = new ResourceRecordSet() .withName("abc.com.") // 域名建议以点结尾,符合DNS规范 .withType(RRType.TXT) .withTTL(300L) .withResourceRecords(record); Change change = new Change() .withAction(ChangeAction.DELETE) .withResourceRecordSet(recordSet); ChangeBatch changeBatch = new ChangeBatch().withChanges(change); ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest() .withHostedZoneId("Z0807dasdasasdNHP57O") .withChangeBatch(changeBatch); // 发送删除请求 ChangeResourceRecordSetsResult result = route53Client.changeResourceRecordSets(request); System.out.println("删除请求提交成功,变更信息:" + result.getChangeInfo()); // 可选:验证记录是否删除 ListResourceRecordSetsRequest listRequest = new ListResourceRecordSetsRequest() .withHostedZoneId("Z0807dasdasasdNHP57O") .withStartRecordName("abc.com.") .withStartRecordType(RRType.TXT); ListResourceRecordSetsResult listResult = route53Client.listResourceRecordSets(listRequest); if (listResult.getResourceRecordSets().isEmpty()) { System.out.println("记录已成功删除"); } else { System.out.println("记录仍存在:" + listResult.getResourceRecordSets()); } } catch (AmazonRoute53Exception e) { System.err.println("删除失败:" + e.getMessage()); System.err.println("错误代码:" + e.getErrorCode()); System.exit(1); } }
获取AWS SDK详细日志的方法
要开启AWS Java SDK 1.x的详细日志,可通过以下两种方式:
1. 日志配置文件(以Log4j为例)
在项目的log4j.properties中添加:
# 开启AWS SDK核心日志 log4j.logger.com.amazonaws=DEBUG # 开启HTTP请求/响应日志(包含请求体、响应体) log4j.logger.com.amazonaws.request=DEBUG
2. JVM启动参数临时开启
不想修改配置文件的话,启动程序时添加以下参数:
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.showdatetime=true -Dorg.apache.commons.logging.simplelog.log.com.amazonaws=DEBUG -Dorg.apache.commons.logging.simplelog.log.com.amazonaws.request=DEBUG
这些日志会输出请求细节、服务响应内容,方便排查API调用问题。
内容的提问来源于stack exchange,提问作者user2315104

