Terraform 1.10がリリースされました
想定読者
- 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には、以下の要素があります。
- Ephemeral input variables / output variables
 
- 今までも、
sensitive = trueによってその値が機微であることを示せましたが、同じ様にephemeral = trueとすることで、その値を一時的なものにすることができます。 
- Ephemeral resources
 
- 
resource,dataに次ぐ第三の新たなリソースとして、ephemeralなリソースが利用可能になりました。 - 
ephemeralリソースは、今までdataリソースを使って参照していたシークレットなどの情報を取得するために利用することができます。 - 
ephemeralリソースで取得された情報は、Planの出力やStateには残らず、一時的なものとして扱われます。 
- 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: 
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