Secret ManagerのシークレットをTerraformで作る方法について
今回はTerraformを利用してGoogle CloudのSecret Managerのシークレットを登録する方法を調べてみました。
早速やってみる
ディレクトリ構成
まずは今回のディレクトリ構成になります。登録されるシークレットはsecret.txt
に記載した内容を登録するようにしてみます。
main.tf
variables.tf
secret.txt
modules/
secret-manager/
main.tf
variables.tf
モジュールの実装
まずはSecret Managerのモジュールを実装します。
一つ目に変数を定義します。Secret Managerを作成するにあたり、今回はリージョンとシークレットの値が入ったファイルパスを変数にしています。
variable "region" {
description = "The Google Cloud region"
type = string
}
variable "secret_file" {
description = "Secret file"
type = string
}
次にリソース定義を実装します。my-application-secret
という名前でシークレットを作成し、secret_file
変数で指定されたファイルを読み込んでその内容をシークレットの値にするようにgoogle_secret_manager_secret_version.secret_data
に指定しています。file(var.secret_file)
とすることでファイルのコンテンツをシークレットの値として読み込んでいます。
resource "google_secret_manager_secret" "my_secret" {
secret_id = "my-application-secret"
replication {
user_managed {
replicas {
location = var.region
}
}
}
}
# (2) シークレットの値の定義 (ファイル参照を使用)
resource "google_secret_manager_secret_version" "my_secret_version" {
secret = google_secret_manager_secret.my_secret.id
secret_data = file(var.secret_file)
deletion_policy = "DISABLE"
}
ルートファイルの実装
次にルートファイルを実装します。
最初に変数定義をします。secret_file
はSecret Managerのモジュールに受け渡します。
variable "project_id" {
description = "The Google Cloud project ID"
type = string
}
variable "region" {
description = "The Google Cloud region"
type = string
default = "asia-northeast1"
}
variable "secret_file" {
description = "Secret file"
type = string
}
次にモジュールを読み込むためにmain.tf
を実装します。region
とsecret_file
は変数として受け渡しています。
provider "google" {
project = var.project_id
region = var.region
}
module "secret-manager" {
source = "./modules/secret-manager"
region = var.region
secret_file = var.secret_file
}
シークレットファイルの作成
今回はsecret.txt
というファイルにシークレットの値を設定します。まずはバージョン1として以下の値を設定します。
key-version-1
リソース作成を実行
それではリソースを作成していきます。まずはterraform plan
の結果は以下のようになりました。
terraform plan
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# module.secret-manager.google_secret_manager_secret.my_secret will be created
+ resource "google_secret_manager_secret" "my_secret" {
+ create_time = (known after apply)
+ deletion_protection = false
+ effective_annotations = (known after apply)
+ effective_labels = {
+ "goog-terraform-provisioned" = "true"
}
+ expire_time = (known after apply)
+ id = (known after apply)
+ name = (known after apply)
+ project = "project_id"
+ secret_id = "my-application-secret"
+ terraform_labels = {
+ "goog-terraform-provisioned" = "true"
}
+ replication {
+ user_managed {
+ replicas {
+ location = "asia-northeast1"
}
}
}
}
# module.secret-manager.google_secret_manager_secret_version.my_secret_version will be created
+ resource "google_secret_manager_secret_version" "my_secret_version" {
+ create_time = (known after apply)
+ deletion_policy = "DISABLE"
+ destroy_time = (known after apply)
+ enabled = true
+ id = (known after apply)
+ is_secret_data_base64 = false
+ name = (known after apply)
+ secret = (known after apply)
+ secret_data = (sensitive value)
+ secret_data_wo_version = 0
+ version = (known after apply)
}
Plan: 2 to add, 0 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.
内容を見るとsecret_data
はsensitive value
となっており、内容はちゃんと隠されることが確認できました。
それではterraform apply
してみます。結果を見ると、まずSecret Managerにmy-application-secret
という名前でシークレットが作成されていることが確認できました。
次にバージョンを確認してみましょう。現時点ではまだ一つしか登録されてないのでバージョンは1つだけ登録されていることがわかります。また、キーの値はkey-version-1
としていましたが、その値が設定されることも確認できました。
新しいバージョンの作成
それではsecret.txt
の値を以下のように変更してみます。
key-version-2
この状態でterraform plan
を実行すると以下のようになります。
terraform plan
module.secret-manager.google_secret_manager_secret.my_secret: Refreshing state... [id=projects/project_id/secrets/my-application-secret]
module.secret-manager.google_secret_manager_secret_version.my_secret_version: Refreshing state... [id=projects/795031300012/secrets/my-application-secret/versions/1]
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement
Terraform will perform the following actions:
# module.secret-manager.google_secret_manager_secret_version.my_secret_version must be replaced
-/+ resource "google_secret_manager_secret_version" "my_secret_version" {
~ create_time = "2025-10-03T11:46:02.264597Z" -> (known after apply)
+ destroy_time = (known after apply)
~ id = "projects/795031300012/secrets/my-application-secret/versions/1" -> (known after apply)
~ name = "projects/795031300012/secrets/my-application-secret/versions/1" -> (known after apply)
~ secret_data = (sensitive value) # forces replacement
~ version = "1" -> (known after apply)
# (5 unchanged attributes hidden)
}
Plan: 1 to add, 0 to change, 1 to destroy.
─────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.
それではデプロイしてみます。terraform apply
した後にバージョン情報を見るとバージョン2が作成され、その値がkey-version-2
になっていることが確認できました。
まとめ
今回はSecret ManagerにシークレットをTerraformから登録する方法を調べてみました。シークレットな値を取り扱いたいことも多々あるかなと思うので、その使い方を調べられてよかったです。今後は今回登録した内容をサーバなどから参照できるように設定する方法を調べてみようと思います。
Discussion