Top View


Author Choi Jiho

TerraformでAWS Secrets Managerをいい感じで扱う

2021/09/29

きっかけ

色んな秘密値(DBパスワードなど)を最初のterraform applyで保存しておいて、後のterraform applyからはvarableを気にせずに使いたい!

結論

ignore_changesdefault = null を活用したらできる!

きっかけになったユースケース

terraform planやapplyするために var.db_password に毎回手元で値を供給してました 😇

resource "aws_secretsmanager_secret_version" "main" {
  secret_id     = aws_secretsmanager_secret.main.id
  secret_string = jsonencode( {"db_password" = var.db_password} )
}

値供給しないと。。。

こうなりました。

色んな方法考えましたが微妙でした。

試した方法1

秘密値を export TF_VAR_valvalue=xxxxxxxxxxx 環境変数に毎回設定します。

  • ターミナル変わる度に入力する必要があります
  • 毎回打つから面倒くさいです

試した方法2

秘密値を tfvars ファイルに書いておいてgitignoreします。

  • 一緒に開発する場合、秘密値更新されたことを気づかず手元の古い秘密値で上書きする可能性があります

結論を詳しく説明

  • Terraformで ignore_changes は変更を無視します、リソース生成できる性質を持ってます。
resource "aws_secretsmanager_secret_version" "main" {
  secret_id     = aws_secretsmanager_secret.main.id
  secret_string = jsonencode( {"db_password" = var.db_password} )

  lifecycle {
    ignore_changes = [
      secret_string
    ]
  }
}
  • Terraformでvariableの default = null はvariableに値を設定しなかったらnullを値として使う性質を持ってます。
variable db_password {
  type = string
  default = null
}

この性質を活かしてリソース生成(AWS Secrets Managerを生成)する時に var.db_password に値を供給します。
手順は export TF_VAR_db_password=xxxxxxxxxxx を実行、 terraform apply 実行です。
こうすると var.db_password に秘密値が設定されたままAWS Secrets Managerが作られます。
この後は var.db_password に対する値供給を気にせずにterraformを使えます。 🎉

Choi Jiho

Choi Jiho

Company : Fusic CO., LTD Program Language : PHP, Go, Ruby