首页 文章

如何解析Terraform中的实例ID

提问于
浏览
1

我们希望不再使用增量数字作为实例的主机名 . 这些机器不在自动缩放组中,因此如果需要,我们可以保留 prod-webserver-001prod-webserver-002 等惯例,但只有标签可用才有意义 .

我们能够通过我们的ASG服务器使用post脚本完成此任务但不同于此,我希望Terraform跟踪DNS记录,以便在我发出 terraform destroy 时它们被销毁 .

理想情况下,我们希望 instance_id 中的连字符后面的前六个字符 . 例如,如果 instance_idi-0876cr2456 ,我们想在名称中使用 0876cr .

prod-webserver-0876cr
prod-webserver-09a24i

Terraform代码:

resource "aws_instance" "instance" {
  ...
  ...
}

resource "aws_route53_record" "instance_dns_a" {
  count   = "${var.num_instances}"
  zone_id = "${var.internal_zone_id}"

# New line but we want the parsed version
  name    = "${aws_instance.instance.id}"

# old that works
  name    = "${format(prod-${service_name}-%03d", count.index + 1)}"
}

1 回答

  • 1

    您可以使用substr从实例ID中提取前6个字符:

    $ terraform console
    > substr("i-123456adgcgabsadh", 2, 6)
    123456
    

    因此,要在Route53记录中使用它,您需要使用以下内容:

    resource "aws_instance" "instance" {
      ...
      ...
    }
    
    resource "aws_route53_record" "instance_dns_a" {
      count   = "${var.num_instances}"
      zone_id = "${var.internal_zone_id}"
    
      name    = "prod-${var.service_name}-${substr(aws_instance.instance.*.id[count.index], 2, 6}"
    }
    

    我会担心截断实例ID以寻找需要独特的东西,因为你将不可避免地得到带有 i-123456a...i-123456b 的ID的实例,然后你最终会用第二个IP地址覆盖 prod-webserver-123456 记录实例并丢失第一条记录 . 你需要截断这里的任何理由吗? DNS中的第一个标签可以使用63个字符,这应该足以让这个未被截断的没有?

相关问题