使用terraform在aws route53托管区域中生成批量记录

使用terraform在aws route53托管区域中生成批量记录,terraform,amazon-route53,terraform-provider-aws,Terraform,Amazon Route53,Terraform Provider Aws,对Terraform世界还很陌生,想知道通过Terraform将dns区域数据批量导入aws_route53的最佳方式是什么吗 我主要是想看看如何通过Terraform在route53中复制Import Zone File功能 例如,假设分区数据是由dig axfr…生成的一个相当大的文件,如下所示: ; <<>> DiG 9.10.6 <<>> axfr zonetransfer.me @nsztm1.digi.ninja. ;; global

对Terraform世界还很陌生,想知道通过Terraform将dns区域数据批量导入aws_route53的最佳方式是什么吗

我主要是想看看如何通过Terraform在
route53
中复制
Import Zone File
功能

例如,假设分区数据是由
dig axfr…
生成的一个相当大的文件,如下所示:


; <<>> DiG 9.10.6 <<>> axfr zonetransfer.me @nsztm1.digi.ninja.
;; global options: +cmd
zonetransfer.me.    7200    IN  SOA nsztm1.digi.ninja. robin.digi.ninja. 2019100801 172800 900 1209600 3600
zonetransfer.me.    301 IN  TXT "google-site-verification=tyP28J7JAUHA9fw2sHXMgcCC0I6XBmmoVi04VlMewxA"
zonetransfer.me.    7200    IN  MX  0 ASPMX.L.GOOGLE.COM.
zonetransfer.me.    7200    IN  MX  10 ALT1.ASPMX.L.GOOGLE.COM.
zonetransfer.me.    7200    IN  MX  10 ALT2.ASPMX.L.GOOGLE.COM.
zonetransfer.me.    7200    IN  MX  20 ASPMX2.GOOGLEMAIL.COM.
zonetransfer.me.    7200    IN  MX  20 ASPMX3.GOOGLEMAIL.COM.
zonetransfer.me.    7200    IN  MX  20 ASPMX4.GOOGLEMAIL.COM.
zonetransfer.me.    7200    IN  MX  20 ASPMX5.GOOGLEMAIL.COM.
zonetransfer.me.    7200    IN  A   5.196.105.14
zonetransfer.me.    7200    IN  NS  nsztm1.digi.ninja.
zonetransfer.me.    7200    IN  NS  nsztm2.digi.ninja.
_acme-challenge.zonetransfer.me. 301 IN TXT "6Oa05hbUJ9xSsvYy7pApQvwCUSSGgxvrbdizjePEsZI"
... (and much more)

理想情况下,我会选择以下内容:

//main.tf
resource "aws_route53_zone" "example" {
  name = "zonetransfer.me."
}

resource "aws_route53_record" "all_records" {
    file = "<path_to_zone_data_file.txt>"
}

//main.tf
资源“aws\U路由53\U区域”示例{
name=“ZonetTransfer.me。”
}
资源“aws\U路由53\U记录”“所有\U记录”{
file=“”
}

如果您可以将其导出为JSON,您可以对其进行转换(例如,使用
jq
或其他工具),以获得一个记录列表,您可以使用类似工具进行转换,并将结果馈送到一个terraform模块,该模块将记录作为列表

我用这种方式将多个域(每个域有数百条记录)从Digital Ocean迁移到AWS;只需要很少的体力劳动。由于这是一项一次性任务,我不再有确切的转换命令行

棘手的部分是使用
jq
groupby()
类型和
名称对记录进行分组(例如,对于MX记录),从而产生以下结果:

    {
      name = ""
      type = "MX"
      records = [
        "1 aspmx.l.google.com",
        "10 aspmx2.googlemail.com",
        "10 aspmx3.googlemail.com",
        "5 alt1.aspmx.l.google.com",
        "5 alt2.aspmx.l.google.com"
      ]
    },

你不能在地形中这样做。你必须使用你的第一个选择。您可以使用或之类的工具来大量导入大量现有资源。除了这个优秀的解决方案之外,还有一个很有前途的、但非常新的、未经查看的NodeJS工具,名为dns zonefile,它声称可以将原始区域文件转换为JSON。警告:我并没有出于健身目的或安全性的考虑对其进行审查。它可能是恶意的,所以在使用它之前,请自己进行尽职调查!
module "repository" {
  source  = "mineiros-io/route53/aws"
  version = "0.1.0"

  name = "zonetransfer.me"

  records = [
    {
      name    = "www"
      type    = "A"
      records = ["127.0.0.1"]
    },{
      ....
    },
    ....
  ]
}
    {
      name = ""
      type = "MX"
      records = [
        "1 aspmx.l.google.com",
        "10 aspmx2.googlemail.com",
        "10 aspmx3.googlemail.com",
        "5 alt1.aspmx.l.google.com",
        "5 alt2.aspmx.l.google.com"
      ]
    },