如何根据资源所在的环境动态命名资源?

How to name resources dynamically based on the env they are in?

我正在尝试根据环境(dev、stage 或 prod)统一资源命名。我会举例说明。

假设我想创建一个 aws iam 用户资源,例如:

resource "aws_iam_user" "iam_foo" {
  name = "foo_dev"
}

这里我将“dev”硬编码到资源名称中。但理想情况下,我希望根据它所在的文件夹动态完成(文件夹类似于 dev 或 prod 等环境)。

文件夹结构如下所示:

├── README.md
├── meow-development
│   ├── locals.tf -> ../locals.tf
│   ├── main.tf
│   └── s3.tf
├── meow-production
│   ├── locals.tf -> ../locals.tf
│   ├── main.tf
│   └── s3.tf
├── meow-staging
│   ├── locals.tf -> ../locals.tf
│   ├── main.tf
│   └── s3.tf

所以我想要实现的是:

resource "aws_iam_user" "iam_foo" {
  name = naming_function(name) # Not intended as actual code
}

命名函数以名称为输入,根据环境命名。因此,如果此资源是在 dev 下创建的,那么 naming_function(woof) 应该 return 字符串“woof_dev”

所以我的问题是:

  1. 如何动态命名事物?
  2. 使用包含 meow_{env_name} 等环境的命名约定是否正确?

meow-development 文件夹中创建 terraform.tfvars

env_name = "dev"

meow-development文件夹内的main.tf中:

resource "aws_iam_user" "iam_foo" {
  name = "foo_${var.env_name}"
}

其他环境也一样。关于命名约定,取决于资源,将 env 作为名称的一部分被认为是最佳做法。