“for_each”值取决于无法确定的资源属性(Terraform)

2024-04-27

我有一个 terraform 配置,需要:

  1. 创建一个 lambda
  2. 调用 lambda
  3. 迭代 lambda 的 json 结果,返回一个数组并为数组中的每个条目创建一个 CloudWatch 事件规则

相关代码如下:

Create lambda code...

data "aws_lambda_invocation" "run_lambda" {
  function_name = "${aws_lambda_function.deployed_lambda.function_name}"

  input = <<JSON
  {}
  JSON
  depends_on = [aws_lambda_function.deployed_lambda]
}

resource "aws_cloudwatch_event_rule" "aws_my_cloudwatch_rule" {
  for_each = {for record in jsondecode(data.aws_lambda_invocation.run_lambda.result).entities : record.entityName => record} 
    name = "${each.value.entityName}-event"
    description = "Cloudwatch rule for ${each.value.entityName}"
    schedule_expression = "cron(${each.value.cronExpression})"
}

问题是当我运行它时,我得到:

Error: Invalid for_each argument

  on lambda.tf line 131, in resource "aws_cloudwatch_event_rule" "aws_my_cloudwatch_rule":
 131:   for_each = {for record in jsondecode(data.aws_lambda_invocation.aws_lambda_invocation.result).entities : record.entityName => record}

The "for_each" value depends on resource attributes that cannot be determined
until apply, so Terraform cannot predict how many instances will be created.
To work around this, use the -target argument to first apply only the
resources that the for_each depends on.

我已经阅读了很多有关该问题的帖子,但找不到解决方法。
问题在于,Terraform 需要在创建 lambda 之前的规划阶段知道 lambda 返回的数组的大小。
解决此类任务的最佳方法是什么?
由于它作为 CI/CD 管道的一部分运行,我更喜欢不包含“-target”标志的解决方案。


一种可能性是重新考虑for_each并使用count相反,如果合适的话。for_each有一些主要的限制。我遇到了类似的事情(对我来说似乎是一个主要错误,但他们说这是一个功能) 假设我正在部署三个虚拟机,并希望将它们绑定到负载均衡器:

resource "aws_instance" "xxx-IIS-004" {

  ami               = var.ami["Windows Server 2019"]
  instance_type     = var.depoy_lowcost ? var.default_instance_type : "m5.2xlarge"
  count             = "3"
  ...

当我尝试使用时for_each, I get “for_each”值取决于无法确定的资源属性...或元组错误。

Fails:

resource "aws_elb_attachment" "attachments_004" {
  depends_on = [ aws_instance.xxx-IIS-004 ]
  elb        = data.aws_elb.loadBalancer.id
  for_each   = aws_instance.xxx-IIS-004[*]
  instance   = each.value.id
}

Works*

locals {
  att_004 = join("_", aws_instance.xxx-IIS-004[*].id )
}

resource "aws_elb_attachment" "attachments_004" {
  depends_on = [ aws_instance.xxx-IIS-004 ]
  elb        = data.aws_elb.loadBalancer.id
  count      = length( aws_instance.xxx-IIS-004 )
  instance   = split("_", local.att_004)[count.index]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“for_each”值取决于无法确定的资源属性(Terraform) 的相关文章

随机推荐

  • jQuery text() 的替代方案包括元素之间的空格?

    我在容器中有一些任意的正文文本 我不控制它 所以我不知道它的结构 但像这样的事情 div h1 Heading h1 p A paragraph or two p ul li item 1 li li item 2 li ul div 这只
  • 如何在 JavaScript 中访问自定义 html 属性?

    您好 我在这个 html 文档中遇到问题 请帮助我 我对此很陌生 也许我很愚蠢 错过了一些东西 我在这里只放了有用的来源来解决请 a Hurray a br 我希望它显示
  • 访谈:函数指针与 switch case

    在面试期间 我被要求为具有 100 个状态的系统实现一个状态机 其中每个状态又具有 100 个事件 我回答了以下 3 种方法 if else 开关盒 函数指针 if else 显然不适合这样的状态机 因此主要比较是 switch case
  • Visual Studio 2017命令行提示符

    我无法从 Windows 10 中的命令行提示符运行 cl Microsoft Visual Studio C 编译器 我使用的是新的 Windows 10 安装和新的 Microsoft Visual Studio 2017 社区版 我收
  • Python 的类表示魔法方法?

    我有一个自定义类 例如 class foo object def init self name self name name def get name self return self name 我想做的是写 test foo test p
  • 无法使用 CSS 设置文本区域宽度

    我尝试使用此 CSS 来设置表单元素的宽度 input type text textarea width 250px 如果您查看此 Firefox 屏幕截图 您会发现字段的宽度不同 我在 Safari 中也得到了类似的效果 替代文本 htt
  • 使用 C# 读取数百万个小文件

    我有数百万个每天生成的日志文件 我需要读取所有这些文件并将其放在一起作为单个文件 以便在其他应用程序中对其进行一些处理 我正在寻找最快的方法来做到这一点 目前我正在使用线程 任务和并行 如下所示 Parallel For 0 files L
  • Ruby 脚本即服务

    嗯 标题说明了一切 我有一个 ruby 脚本 我想在我的 Linux 机器上作为一项服务 我可以启动和停止 运行 我找到了如何在 Windows 上执行此操作here https stackoverflow com questions 16
  • Dialogflow 不记名令牌分析

    如何获取 Dialogflow v2beta1 API 调用的不记名令牌 我想集成 Dialogflow API 所以现在我什至无法在没有不记名令牌的情况下在邮递员中测试 API 为了进行测试 我在 GCP 项目中为我的代理生成了 API
  • 打开页面时出现问题(许可协议页面)

    我很困扰 如何在使用应用程序时仅显示一次协议页面 我不知道如何解释这一点 但我正在尝试解释这一点 我正在创建一个应用程序 其中有协议页面 其中有两个按钮 1 按钮名称为Accept 2 按钮名称为拒绝 如果用户单击接受按钮应用程序进入下一页
  • DDMS 显示在线模拟器的空文件资源管理器

    我很多天都面临这个问题 我搜索了很多但没有找到任何方便的答案 每当我启动模拟器时 一段时间后 当我看到 DDMS 时 它会显示模拟器在线 但其文件资源管理器什么也不显示 当我再次重新启动模拟器或重新启动 Eclipse 时 它 会再次可见
  • 有完整的 tomcat 角色列表吗?

    我希望能够完全访问和控制 tomcat 以使我的开发生活变得简单 我知道角色 admin 和 manager 并且知道还有一些带有连字符的角色 例如 manager gui 但在哪里可以找到包含可用角色描述的完整列表 我什至无法在文档中找到
  • 使用 Python 从 PDF 中的物理坐标返回文本字符串

    在过去的几个小时里 我一直在与 Google 和 PDFMiner 的有限文档作斗争 虽然我感觉很接近 但我只是没有得到我需要的东西 我已经经历过http www unixuser org euske python pdfminer htt
  • 简单的 XML 加载文件不起作用

    为什么这不起作用 url http query yahooapis com v1 public yql q select 20 20from 20html 20where 20xpath 3D 22 2F 2Fmeta 22 20and 2
  • Docker nuget连接超时

    尝试利用官方jetbrains teamcity agentKubernetes 上的图像 我已经设法在 Docker 中运行 Docker 但尝试使用以下命令构建 ASP NET Core 映像docker build命令失败于dotne
  • SetLocale 无法在 jsp 站点中以德语格式化货币

    我对 jstl 标签库感到困惑 我想将数字格式化为德国风格的货币 但我尝试的一切都不起作用 我找到了以下示例 但输出是相同的
  • 如何根据 angular.js 中的子复选框选择父复选框?

    我最近一直在使用 Angular js 并决定在选中父复选框后检查所有复选框 我已经使用了ng model and ng checked指令 div div div div
  • Hibernate 本机查询:无效的列名错误 SQL-17006

    package com abc def model import javax persistence Column import javax persistence Id import javax persistence Entity im
  • 在Angular JS中通过ajax调用发送数组

    我使用以下代码将一些信息发送到我的 servlet 来处理数据 http method GET url http localhost 8080 purchase AddInfo data addArray sample success fu
  • “for_each”值取决于无法确定的资源属性(Terraform)

    我有一个 terraform 配置 需要 创建一个 lambda 调用 lambda 迭代 lambda 的 json 结果 返回一个数组并为数组中的每个条目创建一个 CloudWatch 事件规则 相关代码如下 Create lambda