【问题标题】:How to not override AWS desired_count with Terraform?如何不使用 Terraform 覆盖 AWS desired_count?
【发布时间】:2021-06-24 23:20:05
【问题描述】:

我在 AWS 中管理一个自动缩放的云基础设施。

每次我运行 Terraform 时,它都想覆盖 desired_count,即运行实例的数量。

我不希望这种情况发生。我该怎么做?

约束:我管理多个不同的微服务,每个微服务都使用共享模块设置它们的运行实例,其中指定了desired_count。我不想更改共享模块,以使 all 我的微服务忽略 desired_count。相反,我希望能够逐个服务(即逐个调用者)覆盖或不覆盖。

这排除了直接使用lifecycle { ignore_changes = ... }。据我所知,要忽略的更改列表不能作为参数给出(当我尝试时,我的 Terraform 会抱怨;请随时告诉我你是如何成功的)。

我的下一个想法(如果可能的话)是从存储状态中读取值(如果存在),并要求desired_count 等于其当前值,或者我选择的初始值(如果它没有当前值)。如果没有并发的 Terraform 运行(即没有比赛),这应该完成同样的事情。这可能吗?

我不是专业的 terraformer。如果您给出非常详细的答案,我将不胜感激。

【问题讨论】:

  • 是否不可能将变量/局部变量传递给ignore_changes,并且该变量是[][desired_count],具体取决于should_ignore_desired_count 之类的外部变量!?
  • @luk2302:如果是这样,您必须为我拼出确切的语法
  • 将变量 variable "should_ignore_desired_count" {default=false} 添加到您的模块,然后在您的资源上指定 lifecycle { ignore_changes = var.should_ignore_desired_count ? [desired_count] : [] } - 不确定这是否有效。
  • 您能否展示一个您现在拥有的示例,然后解释您希望如何让某些计数由 Terraform 管理,而另一些则单独管理(例如,带外缩放或应用程序自动缩放) 以及您如何区分这些?理想情况下,这应该是minimal reproducible example 的形式,如果你可以简化它但获得足够的上下文。
  • @ydaetskcoR:这是一个非常合理的要求。以我目前的地球化技能,我认为我的老板不会让我执行那个简化过程,即使是在我们的测试环境中,也不会给我预算让我在一个新帐户上运行足够的实验。即使那里可能没有任何神奇的调味料,我也不乐意在 SO 上分享公司财产。此外,我认为如果我的问题完全可以解决,那么它可以以一种适用于多种上下文的方式在高度通用性上解决,那么你真的需要我的吗?

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


【解决方案1】:

生命周期参数会影响图表的构建方式,因此无法对其进行参数化。 terraform 团队不排除这可以实施,但他们在几年来报告的问题上还没有这样做。

你可以做的是创建两个aws_ecs_service资源,并在它们之间切换:

resource "aws_ecs_service" "service" {
    count = var.use_lifecycle ? 0 : 1
    ...
}

resource "aws_ecs_service" "service_with_lifecycle" {
    count = var.use_lifecycle ? 1 : 0
    ...
    lifecycle {
        ignore_changes = ["desired_count"]
    }
}

鉴于此,您需要一种方法来引用您创建的服务。你可以用本地人做到这一点:

locals {
    service = var.use_lifecycle ? aws_ecs_service.service_with_lifecycle[0] : aws_ecs_service.service[0]
}

【讨论】:

  • 我也想过,但放弃了它,因为它似乎(a)涉及资源块之间的 terraform 代码重复; (b) 我想忽略的变化数量呈指数增长。这里的一般模式是将所有“数据常量”(资源块)硬编码到我的 terraform 文件中,然后使用一个变量来选择我想要的那个,而不是计算我想要的结果。我想这是可以做到的最好的吗?但是,我们计算而不是制表是有原因的,例如字节加法(嗯,大多数时候反正)。
  • 听起来这可能是一个很好的旧开发时代码生成的工作。
猜你喜欢
  • 2021-07-01
  • 2021-09-14
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
相关资源
最近更新 更多