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