Terraform 为创建的每个 aws_instance 创建 Route53 记录

Posted

技术标签:

【中文标题】Terraform 为创建的每个 aws_instance 创建 Route53 记录【英文标题】:Terraform Create Route53 record for each aws_instance crreated 【发布时间】:2021-11-13 22:44:53 【问题描述】:

我已经编写了以下 Terraform 代码:​​

resource "aws_instance" "agents" 
  count = 100
  key_name = var.Jenkins_Controller_KeyName

  instance_type = "t2.micro"

  ami = data.aws_ami.latest-amazonlinux2.id

我的目标是创建 100 个 Jenkins 代理 EC2 实例。我想为每一个创建 Route53 记录。因此,如果我有count = 100,它将创建 100 条这样的 A 记录(在伪代码中):

for i in 0..100
   create_a_name("worker" + i.to_string)

如何在 Terraform 中做到这一点?有可能吗?

【问题讨论】:

就像你在aws_instance 上拥有count=100 一样,将这个计数放在reoute 53 记录上。那么记录的目标应该是aws_instance.slaves[count.index].something Jenkins uses the terms controller and agents 而不是 master 和 slaves(AFAIK 从未使用过 slaves 这个词),所以我更新了这个术语,让人们更容易使用正确的术语来找到这个问题。跨度> 【参考方案1】:

而不是使用count,最好使用aws_autoscaling_group 和desired_capacitymax_size 100。这样可以确保高可用性和容错您的从属实例。可能需要考虑的事情。

但无论如何,回答您关于aws_route53_record 的问题。您可以按照以下方式进行操作:

resource "aws_route53_record" "www" 
 
  count = length(aws_instance.agents)
 
  zone_id = aws_route53_zone.primary.zone_id
  name    = "worker$count.index.example.com"
  type    = "A"
  ttl     = "300"

  # not clear from your question if you want to use public or private ip?
  records = [aws_instance.agents[count.index].public_ip]

【讨论】:

records 中似乎缺少右方括号。 :) @MarkoE 感谢您发现这一点。我刚刚解决了这个问题。 有点想知道为什么记录是一个数组。为什么你需要不止一个? @RyanGlen 您可以返回多个 IP 以实现冗余或负载平衡。所以客户端可以尝试第一个IP,如果它不起作用,然后尝试第二个备用。 有趣,我不知道这样会起作用,哈哈。

以上是关于Terraform 为创建的每个 aws_instance 创建 Route53 记录的主要内容,如果未能解决你的问题,请参考以下文章

Terraform - 在每个可用区创建 ec2 实例

terraform:根据资源计数创建列表

定义:Terraform - AWS - aws_instance - user_data

如何确定 terraform 中 aws_instance.main.*.public_ip 中的数字

我可以在 terraform 创建的 ec2 实例中执行 ssh 吗?

避免更新 Terraform 中的资源