Терраформные «петли» бесполезны? Или я что-то упустил? - PullRequest
1 голос
/ 13 марта 2019

Сегодня я написал некоторую конфигурацию, в которой используются «циклы», но только потом мне стало интересно, правильный ли это путь, поскольку terraform сохраняет ресурсы в файле состояний в виде списка / массива.

Рассмотримследующая конфигурация:

locals {
    users_list = [ "ab", "cd", "ef" ]
}

resource "aws_iam_user" "users" {
    count = "${length(local.users_list)}"
    name = "${local.users_list["${count.index}"]}"
    path = "/"
}

Запуск 'terraform apply' создаст пользователей и создаст следующие ресурсы в файле состояния:

  • aws_iam_user.users [0]
  • aws_iam_user.users [1]
  • aws_iam_user.users [2]

Но если, например, я удалю одного из первых двух пользователей, например, так:

locals {
        users_list = [ "cd", "ef" ]
}

тогда terraform попытается изменить ресурсы в файле состояния ([0] -> "cd", [1] -> "ef"), а также самих пользователей в AWS, чтоможет быть катастрофическим, так как у каждого пользователя будут свои ключи, и это создаст беспорядок.Это относится и к другим типам ресурсов, хотя есть ресурсы, которые при повторном удалении и создании не приведут к такой путанице, но все же это неправильно.

Итак, на мой вопрос, как и в заголовке- может я все неправильно понял?Или это просто так работает?(делая весь этот «петлевой» механизм бесполезным)

1 Ответ

3 голосов
/ 13 марта 2019

terraform до v0.11.x официально не поддерживает петли.Использование count.index в качестве циклов можно найти в блоге Советы и рекомендации Terraform: циклы, операторы if и полезные сведения

Начиная с версии 0.12 ( все еще находится в стадии бета-тестирования)в настоящее время ), он поддерживает циклы с новым ключевым словом for_each , но я до сих пор не гарантирую, если это решит проблему в вашем вопросе.

Поэтому я покажу детали того, чтопроблема в том, как ее исправить, люди вроде @Aniket Chopade могут понять, откуда возникла эта проблема.

После смены местных жителей,

$ terraform apply -auto-approve
aws_iam_user.users[0]: Refreshing state... (ID: ab)
aws_iam_user.users[1]: Refreshing state... (ID: cd)
aws_iam_user.users[2]: Refreshing state... (ID: ef)
aws_iam_user.users[2]: Destroying... (ID: ef)
aws_iam_user.users[1]: Modifying... (ID: cd)
  name: "cd" => "ef"
aws_iam_user.users[0]: Modifying... (ID: ab)
  name: "ab" => "cd"
aws_iam_user.users[2]: Destruction complete after 2s

Error: Error applying plan:

2 error(s) occurred:

* aws_iam_user.users[0]: 1 error(s) occurred:

* aws_iam_user.users.0: Error updating IAM User ab: EntityAlreadyExists: User with name cd already exists.
    status code: 409, request id: 24853da7-452c-11e9-a853-bf4c89d8ebba
* aws_iam_user.users[1]: 1 error(s) occurred:

* aws_iam_user.users.1: Error updating IAM User cd: EntityAlreadyExists: User with name ef already exists.
    status code: 409, request id: 24839027-452c-11e9-b3d5-3deb12943195

Я должен taint эти ресурсы, пометьте их как уничтоженные и примените снова.

$ terraform taint aws_iam_user.users.1
The resource aws_iam_user.users.1 in the module root has been marked as tainted!

$ terraform taint aws_iam_user.users.0
The resource aws_iam_user.users.0 in the module root has been marked as tainted!

$ terraform apply -auto-approve
...
aws_iam_user.users[0]: Destroying... (ID: ab)
aws_iam_user.users[1]: Destroying... (ID: cd)
aws_iam_user.users[0]: Destruction complete after 2s
aws_iam_user.users[0]: Creating...
  arn:           "" => "<computed>"
  force_destroy: "" => "false"
  name:          "" => "cd"
  path:          "" => "/"
  unique_id:     "" => "<computed>"
aws_iam_user.users[1]: Destruction complete after 2s
aws_iam_user.users[1]: Creating...
  arn:           "" => "<computed>"
  force_destroy: "" => "false"
  name:          "" => "ef"
  path:          "" => "/"
  unique_id:     "" => "<computed>"

Мой вывод заключается в том, что в текущей ситуации taint ресурсы для принудительного терраформирования создают новые ресурсы , если вы изменитезаказ в списке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...