Как создать / перезаписать параметр в AWS Parameter Store, только если он не существует?

Я использую terraform для создания параметра в хранилище параметров AWS.

resource "aws_ssm_parameter" "username" {
  name      = "username"
  type      = "SecureString"
  value     = "to_be_defined"
  overwrite = false
}

provider "aws" {
  version = "~> 1.53"
}

Когда я запускаю terraform apply в первый раз, если параметр не существует, terraform создает параметр. Однако, если я запустил его снова (обычно с другим значением), я получаю сообщение об ошибке

ParameterAlreadyExists: параметр уже существует. Чтобы перезаписать это значение, установите для параметра перезаписи в запросе значение true

Если я правильно понимаю, это связано с поведением AWS Cli (не специфично для провайдера).

Текущее поведение overwrite = false:

Если параметр не существует, создайте его
Если параметр существует, выбросить исключение

Я хочу достичь

Если параметр не существует, создайте его
Если параметр существует, ничего не делайте

Я не нашел способа в документации по интерфейсу командной строки AWS для достижения желаемого поведения.

Я хотел бы знать, есть ли способ добиться желаемого поведения с помощью terraform (или напрямую через AWS CLI)


person Ankit    schedule 12.06.2019    source источник
comment
Почему вы хотите, чтобы он ничего не делал? Весь смысл нахождения ресурса в состоянии Terraform заключается в том, чтобы он управлял им и обновлял его до ожидаемого значения, потенциально исправляя дрейф. Если вы этого не хотите, вам не следует использовать Terraform для создания / управления ресурсом.   -  person ydaetskcoR    schedule 12.06.2019
comment
Хорошее замечание @ydaetskcoR. Думаю, в процессе сборки я пытался взломать terraform для чего-то, для чего он не предназначен. Я посмотрю, смогу ли я использовать терраформ для того, для чего он предназначен; состояние магазина.   -  person Ankit    schedule 13.06.2019


Ответы (1)


Я согласен с @ydaetskcoR, что вы также должны поддерживать значение с помощью состояния terraform.

Но если вы настаиваете на игнорировании значения, которое нужно обновить, если ключ SSM существует, вы можете использовать жизненный цикл _1 _ (https://www.terraform.io/docs/configuration/resources.html#ignore_changes)

Итак, в вашем случае вы можете обновить код до

resource "aws_ssm_parameter" "username" {
  name      = "username"
  type      = "SecureString"
  value     = "to_be_defined"
  overwrite = false

  lifecycle {
    ignore_changes = [
      value,
  ]
}

overwrite - (Необязательно) перезаписать существующий параметр. Если не указано, по умолчанию будет установлено значение false, если ресурс не был создан с помощью terraform, чтобы избежать перезаписи существующего ресурса, и по умолчанию будет установлено значение true в противном случае (terraform lifecycle rules should then be used to manage the update behavior).

Кстати, управлять SecureString ключом / значением SSM с помощью terraform - не лучший вариант, потому что его файл tfstate не зашифрован.

person BMW    schedule 13.06.2019
comment
Спасибо. Думаю, я посмотрю, смогу ли я использовать terraform для представления состояния, как предложил @ydaetskcoR. Хороший момент о безопасности с государством. Однако я сохраняю состояние в S3 и шифрую его с помощью ключа kms. - person Ankit; 13.06.2019
comment
Каждый раз, когда мне нужно использовать ignore_changes, это обычно большой красный флаг, что я делаю что-то не так или Terraform не подходит для работы. Фактически, единственные 2 места, где у меня есть ignore_changes в моей достаточно большой базе кода Terraform, - это обработка пары ошибок в провайдере AWS. - person ydaetskcoR; 13.06.2019
comment
Каждый раз, когда мне нужно использовать ignore_changes, это обычно большой красный флаг, что я делаю что-то не так или Terraform не подходит для работы. Фактически, единственные 2 места, где у меня есть ignore_changes в моей достаточно большой базе кода Terraform, - это обработка пары ошибок в провайдере AWS. - person ydaetskcoR; 13.06.2019
comment
Если вы имеете дело с desired capacity в группе автомасштабирования, вам определенно нужно игнорировать его изменение. Также есть несколько других вариантов использования. - person BMW; 14.06.2019