このページでは、Cloud Build にパスワードや API キーなどの機密情報を含める方法について説明します。
シークレット マネージャーは、API キー、パスワード、その他の機密データを安全に保存する Google Cloud サービスです。ビルドに機密情報を含めるには、Secret Manager に情報を保存してから、Secret Manager からその情報にアクセスするようにビルドを構成します。
始める前に
-
Enable the Cloud Build and Secret Manager APIs.
このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。
Secret Manager にシークレットを保存していることを確認します。手順については、シークレットの作成をご覧ください。
- シークレットの名前とシークレットのバージョンをメモします。シークレットにアクセスするように Cloud Build を構成するには、この情報が必要です。
必要な IAM 権限
ビルドに使用しているサービス アカウントに、シークレットの Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor
)の IAM ロールを付与します。
Google Cloud コンソールで [シークレット マネージャー] ページを開きます。
ビルドで使用するシークレットのチェックボックスをオンにします。
まだ開いていない場合は、[情報パネルを表示] をクリックしてパネルを開きます。
パネルの [権限] で、[プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、サービス アカウントのメールアドレスを入力します。
[ロールを選択] プルダウン ボックスで、[Secret Manager のシークレット アクセサー] を選択します。
[保存] をクリックします。
Secret Manager から UTF-8 シークレットにアクセスできるようにビルドを構成する
プロジェクトのルート ディレクトリに、
cloudbuild.yaml
またはcloudbuild.json
という名前の Cloud Build 構成ファイルを作成します。ビルド構成ファイルで、次のことを行います。
- すべてのビルド
steps
の後に、availableSecrets
フィールドを追加して、シークレットに使用するシークレット バージョンと環境変数を指定します。secretVersion
フィールドの値には、置換変数を含めることができます。複数のシークレットを 1 つのビルドで指定できます。 - シークレットを指定するビルドステップで、次のようにします。
- ビルドステップで bash ツールを使用するには、
bash
を指すentrypoint
フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。 - 環境変数を指定する
secretEnv
フィールドを追加します。 args
フィールドに、最初の引数として-c
フラグを追加します。-c
の後に渡した文字列はすべてコマンドとして扱われます。-c
を使用した bash コマンドの実行の詳細については、bash のドキュメントをご覧ください。args
フィールドにシークレットを指定する場合は、$$
を接頭辞とする環境変数を使用して指定します。
- ビルドステップで bash ツールを使用するには、
次のビルド構成ファイルの例は、Secret Manager に保存されている Docker のユーザー名とパスワードを使用して Docker にログインする方法を示します。
YAML
steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD'] secretEnv: ['USERNAME', 'PASSWORD'] availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION env: 'PASSWORD' - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION env: 'USERNAME'
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=$$USERNAME --password=$$PASSWORD" ], "secretEnv": [ "USERNAME", "PASSWORD" ] } ], "availableSecrets": { "secretManager": [{ "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION", "env": "PASSWORD" }, { "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION", "env": "USERNAME" }] } }
上記のコマンドのプレースホルダ値を次のように置き換えます。
PROJECT_ID
: シークレットを保存している Google Cloud プロジェクトの ID。DOCKER_USERNAME_SECRET_NAME
: Docker ユーザー名に対応するシークレット名。シークレット名は、Google Cloud コンソールの Secret Manager ページから取得できます。DOCKER_USERNAME_SECRET_VERSION
: Docker ユーザー名のシークレット バージョン。シークレットのバージョンを取得するには、Google Cloud コンソールの Secret Manager ページでシークレット名をクリックします。DOCKER_PASSWORD_SECRET_NAME
: Docker パスワードに対応するシークレット名。シークレット名は、Google Cloud コンソールの Secret Manager ページから取得できます。DOCKER_PASSWORD_SECRET_VERSION
: Docker パスワードのシークレット バージョン。シークレットのバージョンを取得するには、Google Cloud コンソールの Secret Manager ページでシークレット名をクリックします。
- すべてのビルド
ビルド構成ファイルを使用して、コマンドラインを使用してビルドを開始するか、トリガーを使用してビルドを自動化します。
例: スクリプトとプロセスからのシークレットへのアクセス
secretEnv
フィールドは、シークレットの値を環境に追加し、スクリプトまたはプロセスから環境変数を介してこの値にアクセスできます。
YAML
steps:
- name: python:slim
entrypoint: python
args: ['main.py']
secretEnv: ['MYSECRET']
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
env: 'MYSECRET'
JSON
{
"steps": [
{
"name": "python:slim",
"entrypoint": "python",
"args": [
"main.py"
],
"secretEnv": [
"MYSECRET"
]
}
],
"availableSecrets": {
"secretManager": [
{
"versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
"env": "MYSECRET"
}
]
}
}
次の main.py
の内容はシークレットの最初の 5 文字を出力します。
import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")
例: Docker に対する認証
一部の状況では、Docker イメージを操作するために、ビルドを Docker に対して認証する必要があります。たとえば、ビルドで非公開イメージを pull し、非公開イメージまたは公開イメージを Docker Hub に push するには、Docker 認証が必要です。この場合、Docker のユーザー名とパスワードを Secret Manager に保存してから、Secret Manager からユーザー名とパスワードにアクセスするように Cloud Build を構成します。これを行う方法については、Docker Hub イメージの操作をご覧ください。
例: GitHub pull リクエストの作成
Secret Manager から機密情報にアクセスするようにビルドを構成するもう 1 つの例は、ビルドに応答して GitHub pull リクエストを作成することです。方法:
- GitHub トークンを作成します。
- Secret Manager に GitHub トークンを保存します。
- ビルド構成ファイルに次の操作を行います。
- すべてのビルドの
steps
が完了したら、availableSecrets
フィールドを追加して、GitHub トークンに使用するシークレットのバージョンと環境変数を指定します。 - GitHub pull リクエストを作成するコマンドを呼び出すビルドステップを追加します。
- すべてのビルドの
- GitHub アプリトリガーを作成し、ビルド構成ファイルを使用してトリガーを呼び出します。
次の構成ファイルの例は、GitHub トークンを使用して GitHub pull リクエストを作成する方法を示しています。
YAML
steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
id: Create GitHub pull request
entrypoint: bash
args:
- -c
- curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
secretEnv: ['GH_TOKEN']
availableSecrets:
secretManager:
- versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
env: GH_TOKEN
JSON
{
"steps": [
{
"name": "launcher.gcr.io/google/ubuntu1604",
"id": "Create GitHub pull request",
"entrypoint": "bash",
"args": [
"-c",
"curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
],
"secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
"secretManager": [
{
"versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
"env": "GH_TOKEN"
}
]
}
}
上記のコマンドのプレースホルダ値を次のように置き換えます。
PROJECT_ID
: シークレットを保存している Google Cloud プロジェクトの ID。GITHUB_USERNAME
: リポジトリ オーナーの GitHub ユーザー名。REPO_NAME
: GitHub リポジトリの名前。HEAD_BRANCH
: 変更が実装されるブランチの名前。同じネットワーク内のクロス リポジトリ pull リクエストの場合、username:branch
のようなユーザーを持つ名前空間head
です。BASE_BRANCH
: 変更を取り込むブランチの名前。これは、現在のリポジトリの既存のブランチです。別のリポジトリのベースへのマージをリクエストする pull リクエストを 1 つのリポジトリに送信することはできません。GH_TOKEN_SECRET_NAME
: GitHub トークンに対応するシークレット名。NEW_PR
: 作成する新しい pull リクエスト。
Secret Manager から UTF-8 以外のシークレットにアクセスできるようにビルドを構成する
ビルド構成ファイルに、シークレット マネージャーでシークレット バージョンにアクセスするビルドステップを追加し、ファイルに保存します。次のビルドステップでは、secret-name にアクセスして、decrypted-data.txt という名前のファイルに保存します。
YAML
steps: - name: gcr.io/cloud-builders/gcloud entrypoint: 'bash' args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/gcloud", "entrypoint": "bash", "args": [ "-c", "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ] } ] }
復号されたデータを含むファイルをビルドステップで使用します。次のコード スニペットは、decrypted-data.txt を使用して非公開 Docker レジストリにログインします。
YAML
steps: - name: gcr.io/cloud-builders/gcloud entrypoint: 'bash' args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ] - name: gcr.io/cloud-builders/docker entrypoint: 'bash' args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/gcloud", "entrypoint": "bash", "args": [ "-c", "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=my-user --password-stdin < decrypted-data.txt" ] } ] }
ビルド構成ファイルを使用して、コマンドラインを使用してビルドを開始するか、トリガーを使用してビルドを自動化します。
次のステップ
- ビルドで暗号化された認証情報を使用する方法を学習する。
- 限定公開 GitHub リポジトリにアクセスする方法を学習する。