从Amazon Route 53导出DNS区域文件

cas*_*sen 37 dns amazon-web-services amazon-route53

我想从我的Amazon Route 53设置中导出DNS区域文件.这是可能的,还是只能手动创建zonefiles?(例如通过http://www.zonefile.org/?lang=en)

Ioa*_*ucu 23

这还不可能.你必须使用API ListResourceRecordSets并自己构建zonefile.

  • *grrrr*我无法相信开发人员想到了"导入"按钮并忘记了"导出!" (30认同)
  • 请参阅此工具:[https://github.com/barnybug/cli53](https://github.com/barnybug/cli53)这是一个命令行脚本,用于管理Amazon Route 53 dns服务.希望有所帮助 (26认同)
  • 它们具有不符合RFC的记录值.他们无法在不丢失数据的情况下进行导出. (9认同)
  • 有意义的是,他们想要引入业务,但是想要让业务变得困难.但是非常烦人!感谢您参考cli工具. (2认同)
  • 祝你好运!通过该 API 调用将所有记录获取到 JSON 文件中非常简单。不幸的是,您随后必须编辑该文件,包括编辑该文件中的每条记录,使其具有正确的格式,然后您可以使用它进行导入。就我而言,我们有 250 多条记录,这使得这完全不切实际。AWS 绝对是垃圾! (2认同)

小智 19

以下脚本从Route53以绑定格式导出区域详细信息.将域名作为参数传递给脚本.(这需要安装和配置awscli.)

#!/bin/bash

zonename=$1
hostedzoneid=$(aws route53 list-hosted-zones --output json | jq -r ".HostedZones[] | select(.Name == \"$zonename.\") | .Id" | cut -d'/' -f3)
aws route53 list-resource-record-sets --hosted-zone-id $hostedzoneid --output json | jq -jr '.ResourceRecordSets[] | "\(.Name) \t\(.TTL) \t\(.Type) \t\(.ResourceRecords[].Value)\n"'
Run Code Online (Sandbox Code Playgroud)

  • 上面的注释很有用,但没有转义 `(`。而是使用: `aws route53 list-resource-record-sets --hosted-zone-id $hostedzoneid --output json | jq -jr '.ResourceRecordSets[] | "\(.Name) \t\(.TTL) \t\(.Type) \t\(.ResourceRecords[]?.Value)\n"'` (7认同)
  • @adirabargil 创建一个 shell 文件并复制此文本。保存文件并使用“chmod +x filename.sh”授予文件可执行权限。通过运行命令“./filename.sh yourdomaintoexport.com”来执行此文件 (2认同)
  • 至少对我来说,这个命令会错过 CNAME“A”记录。如果我这样做: aws route53 list-resource-record-sets --hosted-zone-id $hostedzoneid --output json | jq -jr '.ResourceRecordSets[] | "\(.Name) \t\(.TTL) \t\(.Type) \t\(.AliasTarget?.DNSName)\n"' 它将拾取 A 记录。但无法弄清楚如何在一个命令中同时执行 AliasTarget 和 ResourceRecords... (2认同)

Bro*_*shi 14

您可以导出 JSON 文件: aws route53 list-resource-record-sets --hosted-zone-id <zone-id-here> --output json > route53-records.json


Sla*_* II 9

评论所述cli53是使用命令行界面与 Route 53 交互的绝佳工具。

首先,在~/.aws/config文件中配置您的帐户密钥:

[default]
aws_access_key_id = AK.....ZP
aws_secret_access_key = 8j.....M0
Run Code Online (Sandbox Code Playgroud)

然后,使用export命令:

$ cli53 export --full --debug example.com > example.com.zone 2> example.com.zone.log
Run Code Online (Sandbox Code Playgroud)

example.com.zone导出后验证文件以确保正确导出所有内容。

您最近可以导入区域:

$ cli53 import --file ./example.com.zone example.com
Run Code Online (Sandbox Code Playgroud)

如果您想将 Route53 区域从一个 AWS 账户转移到另一个账户,您可以使用该profile选项。只需将两个命名帐户添加到~/.aws/config文件中,并profile在导出和导入期间使用属性引用它们。您甚至可以通过管道传输这两个命令。


小智 8

您可以使用 aws api 导出

aws route53 list-resource-record-sets --hosted-zone-id YOUR_ZONE_ID


lil*_*ole 6

基于@szentmarjay 上面的答案,除了它显示用法并支持 zone_id 或 zone_name。这是我最喜欢的,因为它是标准的老式bind格式,因此其他工具可以用它来做事情。

#!/bin/bash
# r53_export

usage() {
  local cmd=$(basename "$0")
  echo -e >&2 "\nUsage: $cmd {--id ZONE_ID|--domain ZONE_NAME}\n"
  exit 1
}

while [[ $1 ]]; do
  if   [[ $1 == --id ]];     then shift; zone_id="$1"
  elif [[ $1 == --domain ]]; then shift; zone_name="$1"
  else usage
  fi
  shift
done

if [[ $zone_name ]]; then
  zone_id=$(
    aws route53 list-hosted-zones --output json \
      | jq -r ".HostedZones[] | select(.Name == \"$zone_name.\") | .Id" \
      | head -n1 \
      | cut -d/ -f3
  )
  echo >&2 "+ Found zone id: '$zone_id'"
fi
[[ $zone_id ]] || usage

aws route53 list-resource-record-sets --hosted-zone-id $zone_id --output json \
  | jq -jr '.ResourceRecordSets[] | "\(.Name) \t\(.TTL) \t\(.Type) \t\(.ResourceRecords[]?.Value)\n"'
Run Code Online (Sandbox Code Playgroud)