如何通过aws cli在Route53中删除DNS记录?

6

我正在使用aws cli在 Route 53中创建和删除DNS记录。我不确定需要使用哪个负载或命令。根据这个链接,我创建了这个负载,但它没有起作用。该负载为:

{
"Comment": "Delete single record set",
"Changes": [
    {
        "Action": "DELETE",
        "ResourceRecordSet": {
            "Name": "$DNS_NAME.",
            "Type": "$RECORD_TYPE",
            "TTL": $TTL,
            "ResourceRecords": [
                {
                    "Value": "${RESOURCE_VALUE}"
                }
            ]                
        }
    }
]

我将其存储在一个名为“payload”的变量中。 AWS cli命令如下:

aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch payload

有任何想法我做错了什么?请问有人可以确认一下命令和载荷是否正确吗?


2
你试过了吗?你说的“不工作”是什么意思?你收到了错误消息吗?你替换了$DNS_Name$RECORD_TYPE$TTL${RESOURCE_VALUE}${HOSTED_ZONE_ID}吗?你能告诉我们它是什么类型的记录吗? - John Rotenstein
你如何指定 --change-batch payload? 在Bash中,payload是文件还是字符串? - Marcin
@Marcin payload是一个变量,基本上就是我上面创建的有效载荷。我们不能这样发送吗?或者我们必须通过文件发送它? - Saurav Dutta
@JohnRotenstein 是的,我替换了这些值,并且它是记录类型“A”。但它一直提示“InvalidChangeBatch”错误。 - Saurav Dutta
1
你提供的示例正在使用 file://,这可能更好。如果它是一个变量,你可能会遇到引号、空格等问题。尝试从文件中读取可能会更好。 - Marcin
4个回答

7
将有效负载保存为JSON文件并输入文件名。使用file://协议引用有效负载路径。
aws route53 change-resource-record-sets --hosted-zone-id ZSDAGFDG35GS --change-batch file://tmp/payload.json

2

我使用命令和内联的json成功删除了DNS资源记录的名称:

aws route53 change-resource-record-sets --hosted-zone-id XXXXXXXXYYY --change-batch "{\"Changes\": [{\"Action\": \"DELETE\",\"ResourceRecordSet\": {\"Name\": \"app.my-test.com.\",\"Type\": \"A\",\"AliasTarget\": {\"HostedZoneId\": \"xxxxyyyyzzzwww\",\"DNSName\": \"my-test-elb-xxxxxx.region.elb.amazonaws.com.\",\"EvaluateTargetHealth\": true}}}]}"


问题已经在2020年被deepanmurugan正确回答了,你的回答并没有改进任何内容。 - Colin Moreno Burgess
这个机制在代码中使用起来更加方便,无需编写文件。 - undefined

1

我有一个模板playload.json.tmpl,用于更改值

cat playload.json.tmpl 
{
    "Comment": "some comment here",
    "Changes": [
        {
            "Action": "TEMPLATE_ACTION",
            "ResourceRecordSet": {
                "Name": "TEMPLATE_CName_Name",
                "Type": "CNAME",
                "TTL": 300,
                "ResourceRecords": [
                    {
                        "Value": "TEMPLATE_CName_Value"
                    }
                ]
            }
        }
    ]
}

然后我可以使用 sed 命令替换 playload.json.tmplvalues。 注意:删除记录集使用 DELETE 操作。
sed \
-e "s%TEMPLATE_ACTION%DELETE%g" \
-e "s%TEMPLATE_CName_Name%$(echo $CName_Name)%g" \
-e "s%TEMPLATE_CName_Value%$(echo $CName_Value)%g" \
./playload.json.tmpl > ./playload.json

如果您的文件具有DELETE操作,则可以使用AWS CLI删除记录集

aws route53 change-resource-record-sets --hosted-zone-id $DefaultHostedZoneId --change-batch file://playload.json

0
在我的情况下,我需要删除标准地址记录(而不是别名),但每个记录中有多个地址。
这个bash脚本解决了我的问题,并希望通过在这里提供它来帮助其他人:
zid=MYZONEID

function listrrs() {
  aws route53 list-resource-record-sets --hosted-zone-id $zid
}

function changerr() {
  aws route53 change-resource-record-sets --hosted-zone-id $zid --change-batch "$1"
}

listrrs | jq -r '                
    .ResourceRecordSets[]|select(.Type!="NS")|select(.Type!="SOA")|
    "\(.Name) \(.Type) \(.TTL) \([.ResourceRecords[]|.Value]|join(","))"' | \
    while read name type ttl addr
  do
  echo Removing $name
  changerr '{
    "Changes":[
      {"Action":"DELETE","ResourceRecordSet":{
        "Name":"'"$name"'",
        "Type":"'"$type"'",
        "TTL":'"$ttl"',
        "ResourceRecords":[
          '"$(
               IFS=, read -a l<<<"$addr"
               for v in "${l[@]}"
               do echo -n '{"Value":"'$v'"},'
               done | sed 's/,$//'
          )"'
        ]}}
      ]
    }'
done

需要注意的重要事项是,如果您有多个相同名称的资源记录,您必须发送一个删除命令来删除它们所有。

如果您只想删除一个资源记录,您需要使用一个新集合执行 UPSERT 命令,其中包含要保留的所有记录。这真的很烦人,你期望 API 开发人员构建更好的 API,但这是一个 Route53 的问题,AWS CLI 开发人员本可以在其之上提供更友好的 API,但他们选择只提供纯粹的 Route53 JSON 请求,带有所有复杂性,使得 Route53 CLI 成为 AWS 中最令人痛苦的 CLI(这可不是说笑)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接