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

Използвам terraform, за да създам параметър в AWS Parameter Store.

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)


person Ankit    schedule 12.06.2019    source източник
comment
Защо бихте искали да не прави нищо? Целият смисъл на ресурса, който е в състояние на Terraform, е той да го управлява и актуализира до очакваната стойност, потенциално коригирайки отклонението. Ако не искате това, тогава не трябва да използвате Terraform за създаване/управление на ресурса.   -  person ydaetskcoR    schedule 12.06.2019
comment
Добра точка @ydaetskcoR. Мисля, че се опитвах да хакна terraform за нещо, за което не е проектиран, по време на процеса на изграждане. Ще видя дали мога да използвам terraform, за да направя това, за което е предназначен; състояние на магазина.   -  person Ankit    schedule 13.06.2019


Отговори (1)


Съгласен съм с @ydaetskcoR, че трябва да поддържате стойността и с тераформирано състояние.

Но ако настоявате да игнорирате стойността, която трябва да бъде актуализирана, ако SSM ключът съществува, можете да използвате lifecycle 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 файл не е шифрован.

person BMW    schedule 13.06.2019
comment
Благодаря. Мисля, че ще видя дали мога да използвам тераформа за представяне на състояние, както предложи @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