Secret Managerに登録したサービスアカウントキー(Credentialファイル)をTerraformで取得する

この記事は約5分で読めます。

TerraformでGCPインフラのコードを書いている中で、Secret Managerを使い、サービスアカウントキー(Credentialファイル)の管理・取得を試してみました。

スポンサーリンク

Secret Managerとは?

GCP上でパスワードやAPIキー(サービスアカウントのCredentialファイルもこれに該当)などの秘密情報を安全に管理するためのサービスです。

Secret Manager documentation  |  Secret Manager Documentation  |  Google Cloud
Stores API keys, passwords, certificates, and other sensitive data. It provides convenience while improving security.

※AWSでも同名のサービスがあるようですが、同類のサービスなんじゃないかなと思っています。

上記のもの以外にも、

  • ユーザーID
  • 証明書

etcといった、機密情報などを管理することができます。

Secret Managerから機密情報を取得する場合は、CloudSDKライブラリや、gcloudコマンドなどを利用します。

※取得値は自動で暗号化されています。

Secret Managerを利用することにより、

  • ローカル環境の開発リソース内でサービスアカウントキー(Credentialファイル)を保持しなくてよい
  • プログラムのコード上に機密情報をハードコーディングする必要がなくなる

といったことが出来るので、安全に機密情報が取り扱えるようになります。

ただ、公開リポジトリへ誤ってCredentialファイルをpushしないよう、

  • .gitignoerにCredentialファイル名を追加
  • git-secretsの導入

といった対策を行っておく事も推奨します。

サービスアカウントキーの取扱については、下記GCP公式Docをご一読下さい。

Google Cloud のサービス アカウント キーを安全に管理する | Google Cloud 公式ブログ

スポンサーリンク

設定

Secret ManagerにサービスアカウントのCredentialファイルを登録

GCP Consoleの検索欄で”secret”と入力すると、Secret Managerが表示されるのでクリックします。

Secret Manager初回利用の場合はAPIの有効化を求めらるので、有効化します。

[シークレットの作成]をクリックします。

[名前]欄に任意のシークレット名を入力し、[参照]ボタンからサービスアカウントキー(Credentialファイル)をSecret Managerにアップロードします。

アップロードが完了したら、[シークレットを作成]をクリックします。

Terraformでの実装

下記コードは

  • providerのバージョン指定
  • プラグインの読み込み

を行っている内容ですが、GCPプロジェクト編集者ロール以上を持つサービスアカウントキー(Credentialファイル)情報は必須となるので、こちらで実装することにしました。

  • 13 – 17行目:Secret Managerに登録したCredentialファイルの情報を取得
  • 22行目:取得した値をセット

という内容になっています。

ご注意頂きたいのはサービスカウントキー(Credentialファイル)の取得について、当記事執筆時のTerraformのバージョンではベータ版での提供となっています。

このため、

  • 14行目:provider = google-beta
  • 15行目:project指定

の記述がない場合は、

Error: Cycle: .....

という循環参照エラーが出力されます。

※記述し忘れで循環参照エラー?Why??となり、超ハマりました、、、涙

※ユーザーIDやパスワードといった文字情報の取扱いについては14,15行目の記述は不要です

# providerバージョン指定
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "3.67.0"
    }
  }

}

# secret managerからCredentials情報を取得
data "google_secret_manager_secret_version" "gcp-secret" {
  provider = google-beta
  project  = local.project
  secret   = "gcp-credentials"
}

# projectとcredentialsを指定
provider "google" {
  project     = local.project
  credentials = data.google_secret_manager_secret_version.gcp-secret.secret_data
}

スポンサーリンク

まとめ

Secret Manager登場以前はCloud KMSを利用するしかなかったので、機密情報の暗号化、復号化など一手間掛ける必要があったのですが、Secret Manager登場でこういった手間が省け、非常に扱いやすくなったなと思います。

スポンサーリンク

参考情報

Terraform Registry
Terraform Registry
How to use GCP Secret Manager to Manage your Secrets using Terraform
You are going to start building your first application in GCP (Google Cloud Platform) and the question popup into your mind: How am I…
スポンサーリンク
GCPTerraform
ヤマログ
タイトルとURLをコピーしました