Closed6

terraformの変数を外部サービスから読み込む方法を調べる

not75743not75743

目指すところ

  • terraformに使う情報の安全な管理
    • tfvarsを使うのはセキュリティ観点から怖い
  • 操作が簡単(API操作可能)であればなおよし
not75743not75743

Terraform Cloud

は先日試したので省略
https://zenn.dev/not75743/articles/adaf7d71ef026c

メリット

CDをterraform cloudが行っている場合、変数も同時に管理出来るのは楽
sensitiveにも出来る

デメリット

思いつかない。手動入力が手間?
vaultと組み合わせて使ったほうがセキュアではあるんだろうな

not75743not75743

AWS SecretsManager

secretをつかってs3を作ってみます

secret作成

$ cat secret.json 
{
    "bucket_name": "test-bucket-20231231",
    "tags": {
        "Environment": "Dev",
        "Comment": "YoiOtoshiwo"
    }
}

$ aws secretsmanager create-secret --name tf-test-secret 
--secret-string file://secret.json

secret取得、s3作成

data "aws_secretsmanager_secret_version" "main" {
  secret_id = "tf-test-secret"
}

resource "aws_s3_bucket" "main" {
  bucket = jsondecode(data.aws_secretsmanager_secret_version.main.secret_string)["bucket_name"]
  tags   = jsondecode(data.aws_secretsmanager_secret_version.main.secret_string)["tags"]
}

※平文のstringをsecretにしている場合は以下のように取得すればヨシです

平文のsecretを取得
# secret作成
$ aws secretsmanager create-secret --name MyS3BucketName --secret-string "test-bucket-20231231"
data "aws_secretsmanager_secret_version" "main" {
  secret_id = "MyS3BucketName"
}

resource "aws_s3_bucket" "my_bucket" {
  bucket = data.aws_secretsmanager_secret_version.main.secret_string
}

メリット

  • AWSに寄せることが出来る
    • 機密情報をAWSで管理している場合、terraformもそれに寄せることが出来る

デメリット

  • AWSに依存してしまう。
    • マルチベンダであったり、移行するとなったら手間かもしれない
  • コードが見づらい
    • localsあたりで整理することになるでしょうか
  • コードの記述が増える
  • SecretManagerの取得にIAMユーザ/ロールが必要
not75743not75743

Hashicorp Vault

以下の記事を参考にさせていただきました。
https://zenn.dev/jrsyo/articles/e954e907dcedeb
https://speakerdeck.com/maenoyuuki2022/terraformnosikuretutoguan-li-dekiteimasuka-number-hashicorp-vaultnosusume

terraformに限らずすべてのシークレットを管理するのに有用みたい
特にデメリットも思いつかない。がTerraform Cloudの変数ですでにシークレットを運用している場合、即置き換え!となるかはわからない。

このスクラップは2023/12/31にクローズされました