【问题标题】:How to use dynamic resource names in Terraform?如何在 Terraform 中使用动态资源名称?
【发布时间】:2018-03-03 09:10:06
【问题描述】:

我想为多个开发和生产环境使用相同的 terraform 模板。

我的方法: 据我了解,资源名称必须是唯一的,并且 terraform 在内部存储资源的状态。因此,我尝试使用变量作为资源名称 - 但似乎不受支持。我收到一条错误消息:

$ terraform plan
var.env1
  Enter a value: abc

Error asking for user input: Error parsing address 'aws_sqs_queue.SqsIntegrationOrderIn${var.env1}': invalid resource address "aws_sqs_queue.SqsIntegrationOrderIn${var.env1}"

我的地形模板:

variable "env1" {}

provider "aws" {
        region = "ap-southeast-2"
}

resource "aws_sqs_queue" "SqsIntegrationOrderIn${var.env1}" {
        name = "Integration_Order_In__${var.env1}"
        message_retention_seconds = 86400
        receive_wait_time_seconds = 5
}

我认为,要么我的方法错误,要么语法错误。有什么想法吗?

【问题讨论】:

  • 使用 terraform 模块管理,无需动态重新定义资源名称。
  • 您应该将 Farid 的答案标记为正确。与该答案相关的类似问题是正确的。

标签: terraform


【解决方案1】:

您不能在资源名称中进行插值。相反,您应该做的是正如 @BMW 在 cmets 中提到的那样,您应该制作一个包含 SqsIntegrationOrderIn 内部并采用 env 变量的 terraform 模块。然后您可以使用该模块两次,它们根本不会发生冲突。你也可以看看我回答的similar question

【讨论】:

  • 更进一步,OP 应该为不同的环境使用不同的 AWS 账户,然后名称冲突就不是问题了。
  • 使用单独的帐户是可行的方法。同意并易于使用 AWS 组织实施。
  • @Davos 你能指出这个(跨)帐户部署设置的一个很好的例子吗?我正在使用另一个帐户的 .aws/config 和 ./aws/credentials 条目,并指定 AWS_PROFILE=dev_admin 例如,但资源所有者仍显示为主组织的管理帐户#。我对provider“个人资料”也没有运气......
  • @d8aninja 听起来像是一个新问题,但信息不足,无法给您一个体面的答案。您可以在不同的帐户中设置角色并承担它们,或者跨帐户角色或不同帐户中的不同用户。这个learn.hashicorp.com/tutorials/terraform/organize-configuration 描述了不同的设置。查看 aws_caller_identity,以及 aws 提供程序的 assume_role 属性,以及 registry.terraform.io/providers/hashicorp/aws/latest/…
  • @Davos 你能在这里发表你的建议吗? stackoverflow.com/questions/69508090/…
【解决方案2】:

我建议为每个环境使用不同的workspace。这允许您像这样指定您的配置:

variable "env1" {}

provider "aws" {
        region = "ap-southeast-2"
}

resource "aws_sqs_queue" "SqsIntegrationOrderIn" {
        name = "Integration_Order_In__${var.env1}"
        message_retention_seconds = 86400
        receive_wait_time_seconds = 5
}

确保“aws_sqs_queue”资源的名称取决于环境(例如,通过将其包含在名称中)以避免在 AWS 中发生名称冲突。

【讨论】:

  • 文档特别指出workspaces 是“不适合系统分解的工具”,并且关于“不同的开发阶段(例如分期与生产)”它是“不适合的隔离机制”请参阅terraform.io/docs/state/… 相反,您应该使用模块并将它们导入到 dev、staging、prod 等不同的 terraform init 目录中,并在这些接口中执行特殊的环境操作。最佳实践也是使用不同的 AWS 账户,因此名称冲突不是问题。
猜你喜欢
  • 2019-01-23
  • 1970-01-01
  • 2021-07-25
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多