我将Terraform的秘密迁移到GC SecretManager后,运维变得更加轻松
这是什么东西?
我现在在这个项目中负责terraform的运营,我们之前是把terraform使用的敏感信息(如数据库密码)存储在Bitwarden中。
然后我们把这些信息迁移到了GCP Secret Manager,结果发现这样做挺好的。
之前的操作方式
-
- シークレットは各環境別で分け、Bitwardenに格納
-
- ローカルにsecret.variable.tfなどの名前でシークレットファイルを作成し、Bitwardenからコピペしてきて利用
- シークレットファイルはgitignoreしてプッシュしないように運用
将SecretManager托管的原因
因为有更多的成员开始使用Terraform,保持使用Bitwarden变得困难。
-
- Bitwardenからコピペする作業が発生することによって
メンバーが増えた時の説明(オンボーディング)がダルい
Bitwardenでシークレットを更新すると、メンバー全員にローカル更新するよう呼びかける必要がある
Bitwardenだとバージョニングができず、管理上よくない
誤って誰かがシークレットファイルをGitリモートプッシュしてしまうリスク
程式碼
从SecretManager中获取最新版本的值,并将其作为data存储在本地变量中。
# Terraformで利用するシークレット
resource "google_secret_manager_secret" "terraform_secrets" {
secret_id = "TERRAFORM_GCP"
replication {
automatic = true
}
}
# シークレットから最新バージョンを取得する設定
data "google_secret_manager_secret_version" "gcp_secrets" {
secret = google_secret_manager_secret.terraform_secrets.id
version = "latest"
}
# シークレットの値をローカル変数に格納
locals {
db-pass-1 = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-1"]
db-pass-2 = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-2"]
}
由于说明的便利,上述已将局部变量名(db-pass-1)和密钥名称(db-root-password-1)命名为不同的名称,但实际上最好将它们起相同的名称。
※ 如果一次性应用上述 Terraform,只会创建 SecretManager 密钥,但没有版本(内容),会导致引用错误,因此需要事先创建密钥和版本,然后使用 terraform import 等进行操作。
秘密管理者中的秘密,可以手动以json格式存储值,并将其设置为最新版本。
{
"db-password-1" : "password1",
"db-password-2" : "password2",
}
然后,我们将其作为本地变量正常使用.
resource "google_sql_user" "user-1" {
instance = "test-instance"
host = ""
name = "user-1"
password = local.db-pass-1
}
作为替代方案,可以直接将秘密数据输入,而不需要通过本地变量。
但是,我认为在本地变量中定义更容易阅读和管理秘密数据。
password = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-1"]