Terraform の ephemeral resource と write-only 属性で¶
tfstate に平文を残さない
こんなことできるんだ。— @pospome
問題: tfstate に秘密情報が平文で保存される¶
# 従来: random_password の値が tfstate に平文で残る
resource "random_password" "db" {
length = 32
}
resource "aws_db_instance" "main" {
password = random_password.db.result # tfstate に平文保存される!
}
tfstate を S3 に保存していても、アクセスできる人全員がパスワードを見られる状態になる。
解決策 1: ephemeral resource(Terraform 1.10+)¶
| 特性 | 内容 |
|---|---|
| 存在タイミング | プラン・適用時のみ(メモリ上に存在) |
| tfstate | 残らない |
| 用途 | 一時的なシークレット・トークンの取得 |
ephemeral "aws_secretsmanager_secret_version" "db_pass" {
secret_id = aws_secretsmanager_secret.db.id
}
resource "aws_db_instance" "main" {
password = ephemeral.aws_secretsmanager_secret_version.db_pass.secret_string
# ephemeral なので tfstate に保存されない
}
解決策 2: write-only attribute(Terraform 1.11+)¶
| 特性 | 内容 |
|---|---|
| 動作 | プロバイダが対応した属性は state に書き込まれない |
| 表記 | 属性名に _wo サフィックス(プロバイダ実装による) |
resource "aws_secretsmanager_secret_version" "db" {
secret_id = aws_secretsmanager_secret.db.id
secret_string_wo = var.db_password # _wo = write-only
secret_string_wo_version = 1 # バージョン管理
}
# secret_string_wo の値は tfstate に保存されない
組み合わせによる完全なシークレット管理¶
(図: SVG)