首页 > 解决方案 > Terraform 0.12:桶的输出列表,用作另一个模块的输入并迭代

问题描述

我正在使用 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"

任何帮助是极大的赞赏。

标签: amazon-s3terraformterraform-provider-aws

解决方案


模块.s3

resource "aws_s3_bucket" "redirects" {
  for_each = var.redirects

  bucket = each.value
}

您的重定向变量定义需要更改为以下内容:

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"
}

重定向存储桶的变量定义需要更改为这样的(注意下划线,在某些情况下使用 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


推荐阅读