You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS Java SDK删除Route53资源记录遇问题求助

问题描述

本人是Java新手,使用AWS Java SDK 1.x(Java 17环境)编写代码删除Route53特定资源记录,遇到两个问题:

  1. 初始代码编译运行正常,但没有删除效果;
  2. 修改代码后抛出异常:

[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:37:35