【问题标题】:Bulk record generation in aws route53 hosted zone with terraform使用 terraform 在 aws route53 托管区域中生成批量记录
【发布时间】:2020-08-07 10:52:49
【问题描述】:

对 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" "A" {
    zone_id = aws_route53_zone.example.zone_id
    name = aws_route53_zone.example.name
    type = "A"
    ttl = "7200"
    records = ["5.196.105.14"]
}

resource "aws_route53_record" "MX" {
 //
}

// all records here

理想情况下,我想使用类似的东西:

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

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

任何有关如何处理此问题的建议/指针将不胜感激

【问题讨论】:

标签: terraform amazon-route53 terraform-provider-aws


【解决方案1】:

如果您可以将其导出为 JSON,您可以对其进行转换(例如使用jq 或其他工具)以获取可以使用json2hcl 等工具转换的记录列表,并将结果输入到 terraform 模块中记录为列表 - 例如mineiros-io/route53/aws

module "repository" {
  source  = "mineiros-io/route53/aws"
  version = "0.1.0"

  name = "zonetransfer.me"

  records = [
    {
      name    = "www"
      type    = "A"
      records = ["127.0.0.1"]
    },{
      ....
    },
    ....
  ]
}

我通过这种方式将具有数百条记录的多个域从 Digital Ocean 迁移到 AWS;只涉及最少的手工工作。由于这是一项一次性任务,我不再有确切的转换命令行。

棘手的部分是使用jqgroup_by()typename(例如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。警告:我没有审查这个是否适合目的或安全。它可能是恶意的,所以在使用它之前做你自己的尽职调查! github.com/elgs/dns-zonefile/blob/master/README.md
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 2017-07-25
  • 2015-12-06
  • 2016-05-13
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多