【问题标题】:How to create multiple resources in a for loop with terraform?如何使用 terraform 在 for 循环中创建多个资源?
【发布时间】:2020-04-02 10:31:02
【问题描述】:

我查看了一些文档以及关于 terraform 的 udemy 课程,但我不明白如何做我想做的事情。我想创建一个 for 循环,并在其中创建一个 S3 事件通知,创建一个监听该通知的 Sns 主题,创建一个 Sqs 队列,然后将队列订阅到 sns 主题。似乎 terraform 中的 for 循环还不够先进,无法做到这一点。我错了吗,是否有任何文档或示例可以解释如何在此用例中使用 for 循环?

提前致谢。

【问题讨论】:

  • 迭代器在资源范围内,而不是在资源范围之外。鉴于此,完全有可能在功能上按照您的描述进行操作。可以通过您在此尝试的 MCVE 提供更多帮助。
  • 是的,这就是我从文档中看到的。我希望能够在循环中动态创建资源。我在另一篇 SO 帖子上看到,人们一直在使用 python 创建自己的包装器来基本上生成 tf 文件,这是实现这一目标的一种方式。
  • terraform.io/docs/configuration/…。每个资源类型将使用各自的 for_each 独立创建。如果您期望在其中创建 S3 事件,则不要在大的 for 循环中,然后将其提供给 SNS,以便在循环中创建。

标签: terraform


【解决方案1】:

创建 AWS VPC 子网然后将其提供给 AWS EC2 实例的示例。

resource "aws_subnet" "public" {
  count = length(var.public_subnet_cidr_blocks)
  vpc_id     = var.vpc_id
  cidr_block = var.public_subnet_cidr_blocks[count.index]
}

resource "aws_instance" "public_ec2" {
  count = length(var.public_subnet_ids)
  subnet_id = var.public_subnet_ids[count.index]
  ami           = var.ami_id
  instance_type = "t2.micro"
  tags = {
    Name = "PublicEC2${count.index}}"
  }
  provisioner "local-exec" {
    command = <<EOF
echo "Public EC2 ${count.index} ID is ${self.id}"
EOF
  }
}

没有像下面这样的语法来创建资源。

[ for name in var.names:
 aws_s3_bucket {...} 
 aws_sns_topic {...}
]

For 表达基本上是为了价值,而不是为了创造资源。

  • for Expressions

    for 表达式通过转换另一个复杂类型值来创建一个复杂类型值。

要创建多个资源,如下文中使用 for_each 或 count。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 2021-05-21
    • 2018-11-24
    • 1970-01-01
    • 2018-06-26
    • 2019-12-25
    • 2021-11-25
    • 2021-11-04
    相关资源
    最近更新 更多