🐡

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を作成するにあたり、今回はリージョンとシークレットの値が入ったファイルパスを変数にしています。

modules/secret-manager/variables.tf
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)とすることでファイルのコンテンツをシークレットの値として読み込んでいます。

modules/secret-manager/main.tf
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のモジュールに受け渡します。

variables.tf
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を実装します。regionsecret_fileは変数として受け渡しています。

main.tf
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_datasensitive 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