TerraformでGCPインフラのコードを書いている中で、Secret Managerを使い、サービスアカウントキー(Credentialファイル)の管理・取得を試してみました。
Secret Managerとは?
GCP上でパスワードやAPIキー(サービスアカウントのCredentialファイルもこれに該当)などの秘密情報を安全に管理するためのサービスです。
※AWSでも同名のサービスがあるようですが、同類のサービスなんじゃないかなと思っています。
上記のもの以外にも、
- ユーザーID
- 証明書
etcといった、機密情報などを管理することができます。
Secret Managerから機密情報を取得する場合は、CloudSDKライブラリや、gcloudコマンドなどを利用します。
※取得値は自動で暗号化されています。
Secret Managerを利用することにより、
- ローカル環境の開発リソース内でサービスアカウントキー(Credentialファイル)を保持しなくてよい
- プログラムのコード上に機密情報をハードコーディングする必要がなくなる
といったことが出来るので、安全に機密情報が取り扱えるようになります。
ただ、公開リポジトリへ誤ってCredentialファイルをpushしないよう、
- .gitignoerにCredentialファイル名を追加
- git-secretsの導入
といった対策を行っておく事も推奨します。
サービスアカウントキーの取扱については、下記GCP公式Docをご一読下さい。
設定
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登場でこういった手間が省け、非常に扱いやすくなったなと思います。