Terraform:如何有条件地将 EBS 卷分配给 ECS 集群

2024-03-27

我有一个ecs_cluster定义 ECS 集群的模块。我希望该模块可以重复使用,这样我就可以创建具有不同配置的各种集群。因此,我希望能够选择指定是否在 ECS 主机的启动配置中创建和附加 EBS 卷。

我最初尝试使用count in the ebs_block_device在启动配置中,例如

variable "ebs_volume_device_name" { type = "string", default = "" }
variable "ebs_volume_type" { type = "string", default = "" }
variable "ebs_volume_size" { type = "string", default = "" }

resource "aws_launch_configuration" "launch_configuration" {
  name_prefix = "foo"
  image_id = "bar"
  # Irrelevant stuff removed for brevity...

  ebs_block_device {
    count = "${length(var.ebs_volume_device_name) > 0 ? 1 : 0}"
    device_name = "${var.ebs_volume_device_name }"
    volume_type = "${var.ebs_volume_type}"
    volume_size = "${var.ebs_volume_size}"
  }
} 

但这会导致以下错误:

module.ecs_cluster.aws_launch_configuration.launch_configuration: ebs_block_device.0: invalid or unknown key: count

然后,我尝试指定 launch_configuration 资源两次,一次使用 ebs 块设备,一次不使用 ebs 块设备,例如

variable "ebs_volume_device_name" { type = "string", default = "" }
variable "ebs_volume_type" { type = "string", default = "" }
variable "ebs_volume_size" { type = "string", default = "" }

resource "aws_launch_configuration" "launch_configuration" {
  count = "${length(var.ebs_volume_device_name) == 0 ? 1 : 0}"
  name_prefix = "foo"
  image_id = "bar"
  # Irrelevant stuff removed for brevity...

  # No specification of ebs_block_device
}

resource "aws_launch_configuration" "launch_configuration" {
  count = "${length(var.ebs_volume_device_name) > 0 ? 1 : 0}"
  name_prefix = "foo"
  image_id = "bar"
  # Irrelevant stuff removed for brevity...

  ebs_block_device {

    device_name = "${var.ebs_volume_device_name }"
    volume_type = "${var.ebs_volume_type}"
    volume_size = "${var.ebs_volume_size}"
  }
}

然而,Terraform 随后会抱怨,因为资源被定义了两次。

我无法更改任一资源的 ID,因为我有一个自动缩放组,该组取决于启动配置的名称,例如

resource "aws_autoscaling_group" "autoscaling_group" {
  name = "foo"
  launch_configuration = "${aws_launch_configuration.launch_configuration.name}"
}

我想我可以有条件地定义 2 个自动缩放组,并将一个组映射到每个启动配置,但这感觉真的很混乱。此外,这些资源本身也有依赖的资源,例如 cloudwatch 指标警报等。使用 2 个单独的条件重复所有这些代码两次感觉非常不干。我在这里错过了一个技巧吗?

感谢任何相关的 Terraform 智慧!


不幸的是,计数元属性仅适用于资源级别。在资源中拥有条件块(例如您的 ebs_block_device 或日志记录等)是 github 中的 terraform issues 中经常提到的一个问题,据我所知,还没有解决方案。

在您的情况下,一个“技巧”可能是让您的 autoscaling_group.launch_configuration 属性也有一个三元运算符,即

resource "aws_autoscaling_group" "autoscaling_group" {
  name = "foo"
  launch_configuration = "${length(var.ebs_volume_device_name) == 0 ? aws_launch_configuration.launch_configuration.name : aws_launch_configuration.launch_configuration2.name}"
}

或者更好的是在带有输出名称的 launch_configuration 模块中提取该逻辑,然后上面的内容看起来像

resource "aws_autoscaling_group" "autoscaling_group" {
      name = "foo"
      launch_configuration = "${module.launch_config.name}"
}

并不是说它不丑,但这就是 terraform 对你的条件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terraform:如何有条件地将 EBS 卷分配给 ECS 集群 的相关文章

随机推荐

  • “bundle exec rake db:migrate”有什么作用?

    根据我的研究 bundle exec 负责在包的上下文中执行命令 无论如何 我还不太明白它对于命令的作用有何不同rake db migrate与相比bundle exec rake db migrate 例如 在我的例子中 我执行了第一个命
  • 如何在 Ruby 中对世界杯小组表进行排序

    我正在编写一种算法来根据比赛数据创建世界杯小组表并对其进行排序 因此 给出以下匹配数据 id 1 home team Honduras away team Chile home score 0 away score 1 id 2 home
  • 如何禁用 Android 和 IOS 的复制和粘贴文本功能,该功能在 Phonegap 应用程序中长按屏幕后出现

    Phone Gap issue 如何禁用 ANDROID 以及 IOS 的默认文本复制粘贴功能 该功能在 Phonegap 应用程序中长按屏幕后出现 我提到如何禁用 jQuery Mobile iOS 中锚点的默认行为 https stac
  • 如何使用“Check”语句来验证 mysql 中的字段值?

    如何使用 Check 语句来验证 mysql 中的字段值 看这个page http dev mysql com doc refman 5 1 en create table html 手册中没有讨论check keyword In MySq
  • 具有一元运算符的 IIFE:现实世界用例[重复]

    这个问题在这里已经有答案了 我们可以假装使用一元运算符作为 IIFE 如下所示 function return 5 5 function return 5 5 function return 5 6 function return 5 fa
  • 返回第一个字符为非字母的行

    我正在尝试检索 SQlite 中以任何非字母字符开头的所有列 但似乎无法使其工作 我目前已经得到了这段代码 但它返回每一行 SELECT FROM TestTable WHERE TestNames NOT LIKE A z 有没有办法检索
  • 为什么 LinkedBlockingQueue.take() 即使有元素也会阻塞?

    我有 10 个网络爬虫 它们共享一个LinkedBlockingQueue 从 Eclipse 中的调试视图中 我发现当我获取多个 URL 大约 1000 个 时 list take 通话时间很长 它是这样工作的 private synch
  • 从lua中的函数返回多个值

    我正在尝试以下 lua 代码 function test return 1 2 end function test2 return test end function test3 return test 3 end print test p
  • 如何在ios中永远运行后台服务以同步数据

    您好 我正在开发一个应用程序 它需要在网络服务器上进行同步操作 数据提交和检索 用户可以离线提交表单 即将数据存储到设备上的本地数据库 只要网络可用 后台服务就应该将这些数据提交到网络服务器 后台服务具体需求如下 后台服务会先检查网络是否可
  • Bluecove:以编程方式重新启动蓝牙堆栈

    我正在尝试关闭蓝牙服务 但 Bluecove 在连接关闭方法上有错误 https code google com p bluecove issues detail id 90 https code google com p bluecove
  • 如何编写能够验证 URI 的正则表达式模式?

    一个人如何着手创作一部正则表达式与所有有效 URI 字符串匹配 但无法与所有无效 URI 字符串匹配 为了具体说明我在提到 URI 时所指的内容 我在下面添加了最新 URI RFC 标准的链接 它定义了我想要使用正则表达式验证的实体 我不需
  • 如何在cpanel上托管Spring boot应用程序?

    我有一个 Spring boot 应用程序 我想将其托管在我的 VPS 服务器 cpanel 中 我正在使用最新版本的 cpanel 和 WHM 以及 easyapache 4 我完全按照该网站上的步骤操作 https dzone com
  • 在 AWK 脚本输出中的字段周围添加双引号吗?

    我编写了一个 awk 脚本 它将分发器平面文件转换为可导入 Magento 的 CSV 该文件以分号分隔 它没有像进口商要求的那样在每个字段周围加上引号 它工作得相当好 但在没有包含双引号的情况下导致数据导入出现一些问题 我花了几个小时试图
  • 使用 ReactiveCocoa 从对象数组链接异步操作

    我有一个实体数组 我想对这些实体执行异步操作 这些操作应该链接起来 并以与数组中的实体相同的顺序运行 我是 RAC 新手 在 RAC 中如何做到这一点 首先 您需要一个执行异步操作的包装方法 该方法将返回一个信号 我们假设异步操作需要一个完
  • std::max - 需要一个标识符

    我有问题std max 我想不通 int border 35 int myInt 2 int myOtherInt 3 int z std max myInt 2 border myOtherInt 2 border 我已经包含了算法标准头
  • 操作栏后退按钮不起作用

    在这些的帮助下安卓文档 http developer android com training implementing navigation ancestral html NavigateUp 我正在尝试做一个操作栏后退按钮 我得到一个操
  • pyttsx:没有名为“engine”的模块

    我正在尝试使用安装 TTS 包this http pyttsx readthedocs org en latest install html 一切都很好 直到我尝试执行以下命令 import pyttsx 我收到了这个错误 File usr
  • 从 GitHub 更新所有包

    我知道你可以使用以下语法从 CRAN 安装软件包 install packages c Rcpp dependencies TRUE 您可以使用以下命令从 CRAN 更新所有内容 update packages 另一方面 您可以使用以下命令
  • 没有虚拟方法 verifyPhoneNumber,致命异常:main

    将库更新到 Gradle 文件后 我在尝试通过电话号码进行身份验证后遇到此错误 beginning of crash 2020 11 04 00 33 11 574 23042 23042 com roko hearth E Android
  • Terraform:如何有条件地将 EBS 卷分配给 ECS 集群

    我有一个ecs cluster定义 ECS 集群的模块 我希望该模块可以重复使用 这样我就可以创建具有不同配置的各种集群 因此 我希望能够选择指定是否在 ECS 主机的启动配置中创建和附加 EBS 卷 我最初尝试使用count in the