このドキュメントでは、Secret Manager の Secret を使用して Batch ジョブに指定するセンシティブ データを保護する方法について説明します。
Secret Manager の Secret は、暗号化によってセンシティブ データを保護します。 Batch ジョブでは、1 つ以上の既存の Secret を指定して、そこに含まれるセンシティブ データを安全に渡すことができます。これを使用すると、次のことを行えます。
センシティブ データを含むカスタム環境変数を安全に定義します。
Docker Registry のログイン認証情報を安全に指定すると、ジョブの実行可能ファイルでプライベート コンテナ イメージにアクセスできます。
始める前に
- Batch を以前に使用したことがなかった場合は、Batch を使ってみるを確認し、プロジェクトとユーザーの前提条件を完了して Batch を有効にします。
- ジョブに対して安全に指定するセンシティブ データの Secret を作成するか Secret を特定します。
-
ジョブの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
-
プロジェクトに対する Batch ジョブ編集者 (
roles/batch.jobsEditor) -
ジョブのサービス アカウントのサービス アカウント ユーザー (
roles/iam.serviceAccountUser)。これは、デフォルトでは Compute Engine のデフォルトのサービス アカウントです。
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
-
プロジェクトに対する Batch ジョブ編集者 (
-
ジョブのサービス アカウントに Secret へのアクセスに必要な権限が付与されているようにするには、ジョブのサービス アカウントに Secret に対する Secret Manager のシークレット アクセサー (
roles/secretmanager.secretAccessor)の IAM ロール付与するよう管理者に依頼してください。
センシティブ データをカスタム環境変数に安全に渡す
Secret Manager の Secret からカスタム環境変数にセンシティブ データを安全に渡すには、環境の Secret 変数(secretVariables)サブフィールドで各環境変数を定義し、値ごとに Secret を指定する必要があります。ジョブで Secret を指定するたびに、Secret のバージョンの形式 projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION にする必要があります。
Secret 変数を定義するジョブを作成するには、gcloud CLI、Batch API、Java、Node.js、Python を使用します。次の例は、すべての実行可能ファイルの環境(taskSpec の environment サブフィールド)の Secret 変数を定義して使用するジョブの作成方法を示しています。
gcloud
ジョブの構成の詳細を指定する JSON ファイルを作成し、1 つ以上の環境の
secretVariablesサブフィールドを含めます。たとえば、環境ですべての実行可能ファイルに対して Secret 変数を使用する基本的なスクリプト ジョブを作成するには、次の内容の JSON ファイルを作成します。
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo This is the secret: ${SECRET_VARIABLE_NAME}" } } ], "environment": { "secretVariables": { "{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION" } } } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }以下を置き換えます。
SECRET_VARIABLE_NAME: Secret 変数の名前。慣例により、環境変数名は大文字です。変数の Secret Manager の Secret からセンシティブ データに安全にアクセスするには、このジョブの実行可能ファイルでこの変数名を指定します。Secret 変数には、Secret 変数を定義しているのと同じ環境にあるすべての実行可能ファイルからアクセスできます。
PROJECT_ID: プロジェクトのプロジェクト ID。SECRET_NAME: 既存の Secret Manager の Secret の名前。VERSION: ジョブに渡すデータを含む指定した Secret のバージョン。 バージョン番号またはlatestを指定できます。
ジョブを作成して実行するには、
gcloud batch jobs submitコマンドを使用します:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE以下を置き換えます。
JOB_NAME: ジョブの名前。LOCATION: ジョブのロケーション。JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。
API
jobs.create メソッドに POST リクエストを送ります。これにより、1 つ以上の環境の secretVariables サブフィールドを指定します。
たとえば、環境ですべての実行可能ファイルに対して Secret 変数を使用する基本的なスクリプト ジョブを作成するには、次のリクエストを行います。
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo This is the secret: ${SECRET_VARIABLE_NAME}"
}
}
],
"environment": {
"secretVariables": {
"{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION"
}
}
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
以下を置き換えます。
PROJECT_ID: プロジェクトのプロジェクト ID。LOCATION: ジョブのロケーション。JOB_NAME: ジョブの名前。SECRET_VARIABLE_NAME: Secret 変数の名前。慣例により、環境変数名は大文字です。変数の Secret Manager の Secret からセンシティブ データに安全にアクセスするには、このジョブの実行可能ファイルでこの変数名を指定します。Secret 変数には、Secret 変数を定義しているのと同じ環境にあるすべての実行可能ファイルからアクセスできます。
SECRET_NAME: 既存の Secret Manager の Secret の名前。VERSION: ジョブに渡すデータを含む指定した Secret のバージョン。 バージョン番号またはlatestを指定できます。
Java
Node.js
Python
Docker レジストリ認証情報を必要とするコンテナ イメージに安全にアクセスする
非公開 Docker レジストリのコンテナ イメージを使用するには、実行可能ファイルで Docker レジストリへのアクセスを許可するログイン認証情報を指定する必要があります。具体的には、イメージ URI(imageUri)フィールドでコンテナの実行可能ファイルが非公開 Docker レジストリのイメージに設定されているの場合は、ユーザー名(username)フィールドとパスワード(password)フィールドを使用して、その Docker レジストリにアクセスするために必要な認証情報を指定する必要があります。
これらのフィールドを直接定義するのではなく、情報を含む既存の Secret を指定することで、Docker レジストリの機密性の高い認証情報を保護できます。ジョブで Secret を指定するたびに、Secret のバージョンの形式 projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION にする必要があります。
gcloud CLI または Batch API を使用して、非公開 Docker レジストリのコンテナ イメージを使用するジョブを作成できます。次の例は、ユーザー名とパスワードを Secret として直接指定し、非公開 Docker レジストリのコンテナ イメージを使用するジョブを作成する方法を示しています。
gcloud
ジョブの構成の詳細を指定する JSON ファイルを作成します。非公開 Docker レジストリのイメージを使用するコンテナの実行可能ファイルについては、それにアクセスするために必要な認証情報を
usernameフィールドとpasswordフィールドに含めます。たとえば、非公開 Docker レジストリのイメージを指定する基本的なコンテナジョブを作成するには、次の内容の JSON ファイルを作成します。
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "container": { "imageUri": "PRIVATE_IMAGE_URI", "commands": [ "-c", "echo This runnable uses a private image." ], "username": "USERNAME", "password": "PASSWORD" } } ], } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }以下を置き換えます。
PRIVATE_IMAGE_URI: 非公開 Docker レジストリのコンテナ イメージのイメージ URI。このイメージに他のコンテナ設定が必要な場合は、それらも含める必要があります。USERNAME: 非公開 Docker レジストリのユーザー名。Secret として、または直接指定できます。PASSWORD: 非公開 Docker レジストリのパスワード。Secret として(推奨)、または直接指定できます。たとえば、パスワードを Secret として指定するには、
PASSWORDを次のように設定します。projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION以下を置き換えます。
PROJECT_ID: プロジェクトのプロジェクト ID。SECRET_NAME: 既存の Secret Manager の Secret の名前。VERSION: ジョブに渡すデータを含む指定した Secret のバージョン。バージョン番号またはlatestを指定できます。
ジョブを作成して実行するには、
gcloud batch jobs submitコマンドを使用します:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE以下を置き換えます。
JOB_NAME: ジョブの名前。LOCATION: ジョブのロケーション。JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。
API
jobs.create メソッドに POST リクエストを送信します。非公開 Docker レジストリのイメージを使用するコンテナの実行可能ファイルについては、それにアクセスするために必要な認証情報を username フィールドと password フィールドに含めます。
たとえば、非公開 Docker レジストリのイメージを指定する基本的なコンテナジョブを作成するには、次のリクエストを行います。
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"container": {
"imageUri": "PRIVATE_IMAGE_URI",
"commands": [
"-c",
"echo This runnable uses a private image."
],
"username": "USERNAME",
"password": "PASSWORD"
}
}
],
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
以下を置き換えます。
PROJECT_ID: プロジェクトのプロジェクト ID。LOCATION: ジョブのロケーション。JOB_NAME: ジョブの名前。PRIVATE_IMAGE_URI: 非公開 Docker レジストリのコンテナ イメージのイメージ URI。このイメージに他のコンテナ設定が必要な場合は、それらも含める必要があります。USERNAME: 非公開 Docker レジストリのユーザー名。Secret として、または直接指定できます。PASSWORD: 非公開 Docker レジストリのパスワード。Secret として(推奨)、または直接指定できます。たとえば、パスワードを Secret として指定するには、
PASSWORDを次のように設定します。projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION以下を置き換えます。
PROJECT_ID: プロジェクトのプロジェクト ID。SECRET_NAME: 既存の Secret Manager の Secret の名前。VERSION: ジョブに渡すデータを含む指定した Secret のバージョン。バージョン番号またはlatestを指定できます。
次のステップ
ジョブの作成または実行で問題が発生した場合は、トラブルシューティングをご覧ください。
詳しくは、環境変数をご覧ください。
シークレット マネージャーの詳細を確認する。
別のジョブ作成オプションを学習する。