Terraform 0.12:桶的输出列表,用作另一个模块的输入并迭代
Posted
技术标签:
【中文标题】Terraform 0.12:桶的输出列表,用作另一个模块的输入并迭代【英文标题】:Terraform 0.12: Output list of buckets, use as input for another module and iterate 【发布时间】:2020-07-26 17:08:47 【问题描述】:我正在使用 Tf 0.12。我有一个输出存储桶列表的 s3 模块,我想将其用作我拥有的云端模块的输入。
我面临的问题是,当我执行terraform plan/apply
时,出现以下错误count.index is 0 |var.redirect-buckets is tuple with 1 element
我尝试了各种移动 count.index 调用的方法,但均无济于事。我的示例代码如下。
module.s3
resource "aws_s3_bucket" "redirect"
count = length(var.redirects)
bucket = element(var.redirects, count.index)
mdoule.s3.output
output "redirect-buckets"
value = [aws_s3_bucket.redirect.*]
module.cdn.variables
...
variable "redirect-buckets"
description = "Redirect buckets"
default = []
....
错误在这里抛出
module.cdn
resource "aws_cloudfront_distribution" "redirect"
count = length(var.redirect-buckets)
default_cache_behavior
// Line below throws the error, one amongst many
target_origin_id = "cloudfront-distribution-origin-$var.redirect-buckets[count.index].s3.amazonaws.com"
....
//Another error throwing line
target_origin_id = "cloudfront-distribution-origin-$var.redirect-buckets[count.index].s3.amazonaws.com"
非常感谢任何帮助。
【问题讨论】:
如果您查看 s3 模块的输出,您会看到什么?你能把它编辑成问题吗? 【参考方案1】:module.s3
resource "aws_s3_bucket" "redirects"
for_each = var.redirects
bucket = each.value
redirects 的变量定义需要更改为:
variable "redirects"
type = map(string)
模块.s3.输出:
output "redirect_buckets"
value = aws_s3_bucket.redirects
模块.cdn
resource "aws_cloudfront_distribution" "redirects"
for_each = var.redirect_buckets
default_cache_behavior
target_origin_id = "cloudfront-distribution-origin-$each.value.id.s3.amazonaws.com"
redirect-buckets 的变量定义需要更改为这样的内容(注意下划线,在某些情况下使用 skewercase 会表现得很奇怪,不值得):
variable "redirect_buckets"
type = map(object(
id = string
))
根模块
module "s3"
source = "../s3" // or whatever the path is
redirects =
site1 = "some-bucket-name"
site2 = "some-other-bucket"
module "cdn"
source = "../cdn" // or whatever the path is
redirects_buckets = module.s3.redirect_buckets
从示例的角度来看,这很有趣,但您不需要在此处使用 S3 的输出,因为您只需将相同的重定向映射交给 cdn 模块并在这些映射上使用 for_each。
有一个名为 Terragrunt 的工具,它封装了 Terraform 并支持依赖项。
https://terragrunt.gruntwork.io/docs/features/execute-terraform-commands-on-multiple-modules-at-once/#dependencies-between-modules
【讨论】:
感谢您的提示。我不知道在 Terraform 中表达事物的不同和/或更新的方式。特别是我的输入变量的map
声明。我认为它有助于提高可读性,而不会泄露太多正在传递的内容。
很高兴它对您有所帮助。我通常会使用 for 循环或 splat 索引来使输出只是存储桶的名称或其 ARN 泄漏更少。虽然它确实有点棘手,并使示例更加复杂。以上是关于Terraform 0.12:桶的输出列表,用作另一个模块的输入并迭代的主要内容,如果未能解决你的问题,请参考以下文章
Terraform 模块输出用作其他模块中的输入,特别是 for_each