【问题标题】:Terragrunt for_each value, can't retrieve data in other resourcesTerragrunt for_each 值,无法检索其他资源中的数据
【发布时间】:2021-03-06 03:57:29
【问题描述】:

我的 terragrunt/terraform 代码存在如下问题。 我不知道检索由for_each 循环创建的两个爬虫的正确方法。

通常我使用 for 和 count 创建它。 我无法在我的操作触发器 (main.tf) 中检索正确的值。

terragrunt 文件(输入):

inputs = {
  glue_crawler = {
      crawler    = {
        crawler_name     = "test",
        description      = "test crawler"
        },
      crawler1   = {
        crawler_name     = "test2",
        description      = "test2 crawler"
        }
    }
}

main.tf

#crawler declaration
resource "aws_glue_crawler" "default" {
  for_each = var.glue_crawler

  database_name = aws_glue_catalog_database.database.name
  name          = "Crawler_${each.value.crawler_name}"
  description   = each.value.description
  role          = aws_iam_role.svc-glue-crawler.id
  table_prefix  = "raw_"
  tags          = var.tags

  s3_target {
    path = "${var.s3_glue_name}/${each.value.crawler_name}"
  }

 configuration = jsonencode(var.crawler_configuration)
}

...

#trigger
resource "aws_glue_trigger" "my_trigger" {
  name         = var.trigger_name
  schedule     = "cron(00 01 * * ? *)"
  type         = "SCHEDULED"
  enabled      = "false"
  tags         = var.tags

  actions {
    job_name   = aws_glue_crawler.default[0].name
  }

  actions {
    job_name   = aws_glue_crawler.default[1].name
  }

变量.tf

variable "glue_crawler" {
  type = map(object({
    crawler_name = string
    description   = string
  }))
  default     = {}
  description = "glue crawler definitions."
}

当我运行此代码时,出现以下错误:

Error: Invalid index

  on main.tf line 294, in resource "aws_glue_trigger" "my_trigger":  294:     job_name   = aws_glue_crawler.default[0].name
    |----------------
    | aws_glue_crawler.default is object with 2 attributes

The given key does not identify an element in this collection value.


Error: Invalid index

  on main.tf line 298, in resource "aws_glue_trigger" "my_trigger":  298:     job_name   = aws_glue_crawler.default[1].name
    |----------------
    | aws_glue_crawler.default is object with 2 attributes

The given key does not identify an element in this collection value.

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws terragrunt


    【解决方案1】:

    当您使用for_each 而不是count 时,您需要使用键而不是索引来访问特定元素。所以这将是 crawlercrawler1 而不是 01 在您的示例中:

    resource "aws_glue_crawler" "default" {
      for_each = var.glue_crawler
    
      database_name = aws_glue_catalog_database.database.name
      name          = "Crawler_${each.value.crawler_name}"
      description   = each.value.description
      role          = aws_iam_role.svc-glue-crawler.id
      table_prefix  = "raw_"
      tags          = var.tags
    
      s3_target {
        path = "${var.s3_glue_name}/${each.value.crawler_name}"
      }
    
     configuration = jsonencode(var.crawler_configuration)
    }
    
    ...
    
    #trigger
    resource "aws_glue_trigger" "my_trigger" {
      name         = var.trigger_name
      schedule     = "cron(00 01 * * ? *)"
      type         = "SCHEDULED"
      enabled      = "false"
      tags         = var.tags
    
      actions {
        job_name   = aws_glue_crawler.default["crawler"].name
      }
    
      actions {
        job_name   = aws_glue_crawler.default["crawler1"].name
      }
    }
    

    当然,这只适用于特定的输入。相反,您应该考虑使 actions 参数动态化,并在此处的爬虫上使用 for_each

    resource "aws_glue_trigger" "my_trigger" {
      name         = var.trigger_name
      schedule     = "cron(00 01 * * ? *)"
      type         = "SCHEDULED"
      enabled      = "false"
      tags         = var.tags
    
      dynamic "actions" {
        for_each = aws_glue_crawler.default
    
        content {
          job_name = actions.name
        }
      }
    }
    

    【讨论】:

    • 非常感谢您的反馈@ydaetskcoR 但是如何声明我的两个触发器呢? > 未在根模块中声明托管资源“aws_glue_crawler”“crawler”。
    • 听起来您正在引用定义为 aws_glue_crawler.crawler 的资源,该资源在我的示例或您的问题中都不存在。
    • 是的,事实上我错过了默认输入["crawler"] 非常感谢它的工作原理:)
    猜你喜欢
    • 2021-05-20
    • 2020-01-14
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多