Как динамически называть ресурсы на основе среды, в которой они находятся?

#terraform #hcl

#terraform #hcl

Вопрос:

Я пытаюсь унифицировать именование ресурсов в зависимости от среды (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) должна быть возвращена строка «woof_dev»

Итак, мои вопросы:

  1. Как я могу называть вещи динамически?
  2. Правильно ли использовать соглашение об именовании, включающее среду, такую как meow_{env_name}?

Ответ №1:

Создайте terraform.tfvars внутри meow-development папки с

 env_name = "dev"
  

Внутри папки main.tf meow-development :

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

То же самое для других сред. Что касается соглашения об именовании, зависит от ресурса, использование env как части имени считается наилучшей практикой.