Terraform 0.12: вывод списка блоков, использование в качестве входных данных для другого модуля и повторение - PullRequest
3 голосов
/ 14 апреля 2020

Я использую 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"

Любая помощь очень ценится.

1 Ответ

1 голос
/ 14 апреля 2020

module.s3

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

  bucket = each.value
}

Определение вашей переменной для перенаправления должно измениться примерно так:

variable "redirects" {
  type = map(string)
}

module.s3.output:

output "redirect_buckets" {
  value = aws_s3_bucket.redirects
}

module.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
    }
  ))
}

root module

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-модули

...