🚀

Terraform 1.10がリリースされました

2024/11/28に公開

想定読者

  • Terraformを利用している方
  • Terraform 1.10について知りたい方

Terraform 1.10がリリースされました!

表題そのままですが、Terraform 1.10がリリースされ、HCP Terraformでも利用可能になりました。
ここでは、簡単にアップデートをご紹介いたします。

Ephemeral Values

Ephemeralとは、直訳すると「つかの間の」や「儚い」という意味ですが、Ephemeral Valueは今まで扱っていたTerraformの「値」を一時的なものにすることができる機能になります。
一時的になって嬉しいものはなんでしょうか。。。?🤔
そうです、APIキーやパスワード、証明書などのシークレット情報です。()

これまでTerraformのPlanの出力やStateなど、さまざまな場所にシークレット情報が残ってしまうことがありましたが、Ephemeral Valueを利用することで、その情報を一時的に、つまりPlanの出力やStateには残さずに利用することができるようになります。

Ephemeral Valueには、以下の要素があります。

  1. Ephemeral input variables / output variables
  • 今までも、sensitive = true によってその値が機微であることを示せましたが、同じ様に ephemeral = true とすることで、その値を一時的なものにすることができます。
  1. Ephemeral resources
  • resource, data に次ぐ第三の新たなリソースとして、 ephemeral なリソースが利用可能になりました。
  • ephemeral リソースは、今まで data リソースを使って参照していたシークレットなどの情報を取得するために利用することができます。
  • ephemeral リソースで取得された情報は、Planの出力やStateには残らず、一時的なものとして扱われます。
  1. Write-only attribute
  • リソースのattributeの属性として、read-onlyに加えて、write-onlyが追加されます。
  • 本機能はTerraform 1.11で利用可能になる予定です。

これらの機能によって、インフラ展開時に必要なトークンの取得や初期セットアップのパスワードなどをより安全にTerraformで扱うことができる様になります!🔑

例えば、、、

例えば、以下のようなコードを書くことができます。
(本家ブログ(https://www.hashicorp.com/blog/terraform-1-10-improves-handling-secrets-in-state-with-ephemeral-values)から一部拝借)

# いつもの
provider "aws" {
  region = "eu-west-2"
}
 
# これもいつもの
# アクセスしたいDBの情報を取得
data "aws_db_instance" "example" {
  db_instance_identifier = "testdbinstance"
}
 
# ここが NEW !
# 今までであれば `data` リソースを使ってシークレットを取得していましたが、
#`ephemeral` リソースを使って取得することで、Planの出力やStateには残らないようになります。
ephemeral "aws_secretsmanager_secret_version" "db_master" {
  secret_id = data.aws_db_instance.example.master_user_secret[0].secret_arn
}
 
locals {
  credentials = jsondecode(ephemeral.aws_secretsmanager_secret_version.db_master.secret_string)
}
 
# あとは上で取得したシークレットを使ってDBに接続するだけ。
provider "postgresql" {
  host     = data.aws_db_instance.example.address
  port     = data.aws_db_instance.example.port
  username = local.credentials["username"]
  password = local.credentials["password"]
}
 
resource "postgresql_database" "db" {
  name = "new_db"
}

勘の良い方はすでにお気づきと思いますが、何を ephemeral リソースとして扱えるかは、Providerに依存します。
Ephemeral - aws_secretsmanager_secret_version

現在利用可能なEphemeralリソースは、以下の通りです。

  • AWS: aws_secretsmanager_secret_version, aws_lambda_invocation
  • Azure: azurerm_key_vault_secret, azurerm_key_vault_certificate
  • Kubernetes: kubernetes_token_request, kubernetes_certificate_signing_request

また、Google Cloudの以下のリソースについても、近日中にEphemeralリソースが利用可能になる予定です。

  • Google Cloud: google_service_account_access_token, google_service_account_id_token, google_service_account_key, google_service_account_jwt

Ephemeral Valuesが利用可能になったことに合わせて、以下のFunctionも新たに利用可能になっておりますので、興味がある方は別途調べてみてください。

  • ephemeralasnull
    • そのままではoutputできないephemeralをnullに変換してoutput可能に。
    • ephemeralな値とそうでない値が混在するmapなどをoutputするときに有用。
  • terraform.applying
    • TerraformがApply中かどうかを判定するのに利用できるシンボル。
    • plan時とapply時で挙動(利用するトークンなど)を変えたい場合に有用。

その他

Terraform 1.10ではPlan/Applyのパフォーマンスも上がったよ!😉

まとめ

Ephemeral Valuesの登場により、Terraformでより安全にシークレットを扱うことができるようになりました。
Ephemeral Valuesはまだ出たてで、何でもかんでもEphemeralにできるわけではないですが、今後のProvider対応に期待したいと思います。

参考

Discussion