こんにちは、cto室のldrです。 terraform v1.11.0がリリースされ、注目してた機能が実装されましたのでご紹介したいと思います。
新機能
- 書き込み専用属性の追加 プロバイダー側でリソースの属性を「書き込み専用」として指定できるようになりました。
- terraform testのJUnit XML出力オプションの一般提供 terraform testコマンドに-junit-xmlオプションが利用可能になりました。
- S3ネイティブ状態ロックの一般提供 S3を利用した状態ロック機能がuse_lockfile引数を使うことで有効化できるようになり、DynamoDB関連の引数は非推奨となりました。
今回は書き込み専用属性の追加について触れたいと思います。
簡単に言うと、 Terraformがリソース作成時に機密情報を一時的に渡すための仕組みです。
用途
RDSの初回作成時に一時的なパスワードを渡し、Terraformの状態に機密情報が残らないようにし、その後は外部のシークレット管理システム(AWSSecretsManager)で運用するケースがまずは思い浮かびます。
実装
利用できるプロバイダーのバージョンは5.89です
terraform { required_version = "~> 1.11.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 5.89" } } }
password_woでephemeralを参照し、password_wo_versionでバージョンを定義します。 作成されたパスワードはもちろんoutputでもdataでも参照できません。
ephemeral "random_password" "password_wo" { length = 16 } resource "aws_db_instance" "password_wo" { // 省略 password_wo = ephemeral.random_password.password_wo.result password_wo_version = 1 lifecycle { ignore_changes = [password_wo] }
tfstateには文字列リテラルでなく、nullとして記述されるようになっています。password_wo_versionの値は定義されますので、ephemeralでパスワードを運用していく場合はpassword_wo_versionをインクリメントしていく必要があります。
"password": null, "password_wo": null, "password_wo_version": 1,
想定する運用方法
flowchart TD
A[Terraform: password_woとpassword_wo_versionで初期パスワード作成]
B[Terraform: lifecycleでignore_changesを設定]
C[初期パスワード適用 (tfstateにはパスワードが保存されない)]
D[SecretsManagerに新パスワード登録]
E[IAM認証でサーバにログインしてパスワード変更]
F[最終的にtfstateに機密情報が残らず、差分も発生しない]
A --> B
B --> C
C --> D
D --> E
E --> F