Как создать / перезаписать параметр в AWS Parameter Store, только если он не существует? - PullRequest
1 голос
/ 12 июня 2019

Я использую 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Документация CLI для достижения желаемого поведения.

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

1 Ответ

3 голосов
/ 13 июня 2019

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

Но если вы настаиваете на игнорировании обновляемого значения, если ключ SSM существует, вы можете использовать жизненный цикл ignore_changes (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,
  ]
}

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

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

...