アーキテクチャで複数のサービスを使用している場合は、おそらくサービス間の通信を可能にするための認証情報が必要になります。Cloud Build には、サービス間で安全な認証と承認を行うために OpenID Connect(OIDC)標準のサポートが組み込まれています。
Cloud Build を使用して ID トークンを生成できます。このトークンを使用して、Cloud Build 内から安全なエンドポイントを呼び出すことができます。
たとえば、Cloud Run Functions、Cloud Run、App Engine などのサーバーレス プラットフォーム アプリケーションを実行している場合は、Cloud Build ワークロード内からアプリケーションと安全にやりとりできます。
準備
-
Enable the Cloud Build and IAM APIs.
このアカウントを使用して有効期間の短い認証情報を作成する場合は、IAM Service Account Credentials API も有効にする必要があります。
このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。
使用するサービス アカウントを作成したことを確認します。ビルドを実行する同じ Google Cloud プロジェクトでアカウントを作成する必要があります。
必要な IAM 権限
ユーザー指定のサービス アカウントには iam.serviceAccounts.getOpenIdToken
権限が必要です。
- サービス アカウントを作成したプロジェクトでユーザー指定のサービス アカウントに Service Account OpenID Connect Identity Token Creator(
roles/iam.serviceAccountOpenIdTokenCreator
)ロールを付与します。
サービス アカウントに IAM ロールを付与する手順については、サービス アカウントへのアクセス権を管理するをご覧ください。
ID トークンを取得する方法
ID トークンを取得するようにビルドステップを構成するには、次の 2 つの方法があります。
- gcloud CLI を使用する
- メタデータ サーバーに直接リクエストを送信する
gcloud を使用して ID トークンを取得する
このセクションでは、次のコード スニペットにより、gcloud CLI を使用して ID トークンを取得する方法を示します。
YAML
steps:
- name: 'gcr.io/cloud-builders/gcloud'
script: 'gcloud auth print-identity-token --audiences ${_TOKEN_AUDIENCE} > /workspace/identity_token.txt'
env:
- _TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}
service_account: '$_SERVICE_ACCOUNT'
substitutions:
_TOKEN_AUDIENCE: 'TOKEN_AUDIENCE'
_SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
_SERVICE_ACCOUNT: 'projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}'
logsBucket: 'LOGS_BUCKET_LOCATION'
options:
logging: GCS_ONLY
dynamic_substitutions: true
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/gcloud",
"script": "gcloud auth print-identity-token --audiences ${_TOKEN_AUDIENCE} > /workspace/identity_token.txt"
"env": [
"_TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}"
]
}
],
"service_account": "$_SERVICE_ACCOUNT",
"substitutions": {
"_TOKEN_AUDIENCE": "TOKEN_AUDIENCE",
"_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
"_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
},
"logsBucket": "LOGS_BUCKET_LOCATION",
"options": {
"logging": "GCS_ONLY",
"dynamic_substitutions": true
}
}
以下を置き換えます。
TOKEN_AUDIENCE
は、ID トークンを取得する URL またはターゲット オーディエンス(http://www.example.com
など)です。SERVICE_ACCOUNT_ID
は、ユーザー指定のサービス アカウントのメールアドレスまたは一意の ID です。例:service-account-name@project-id.iam.gserviceaccount.com
LOGS_BUCKET_LOCATION
は、ビルドログを保存する Cloud Storage バケットです。例:gs://mylogsbucket
メタデータ サーバーに直接リクエストを送信する
このセクションでは、次のコード スニペットにより、メタデータ サーバーに直接リクエストを送信して ID トークンを取得する方法を示します。
YAML
steps:
- name: 'gcr.io/cloud-builders/curl'
id: 'printTokenFromCurl'
script: |
curl -H 'Metadata-Flavor: Google' http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${_TOKEN_AUDIENCE} -o /workspace/identity_token.txt
env:
- _TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}
service_account: '$_SERVICE_ACCOUNT'
substitutions:
_TOKEN_AUDIENCE: 'TOKEN_AUDIENCE'
_SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
_SERVICE_ACCOUNT: 'projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}'
logsBucket: 'LOGS_BUCKET_LOCATION'
options:
logging: GCS_ONLY
dynamic_substitutions: true
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/curl",
"id": "printTokenFromCurl"
"script": "curl -H 'Metadata-Flavor: Google' http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${_TOKEN_AUDIENCE} -o /workspace/identity_token.txt"
"env":
"_TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}"
}
],
"service_account": "$_SERVICE_ACCOUNT",
"substitutions": {
"_TOKEN_AUDIENCE": "TOKEN_AUDIENCE",
"_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
"_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
},
"logsBucket": "LOGS_BUCKET_LOCATION",
"options": {
"logging": "GCS_ONLY",
"dynamic_substitutions": true
}
}
以下を置き換えます。
TOKEN_AUDIENCE
は、ID トークンを取得する URL またはターゲット オーディエンス(http://www.example.com
など)です。SERVICE_ACCOUNT_ID
は、ユーザー指定のサービス アカウントのメールアドレスまたは一意の ID です。例:service-account-name@project-id.iam.gserviceaccount.com
LOGS_BUCKET_LOCATION
: ビルドログを保存する Cloud Storage バケット。例:gs://mylogsbucket
ワークロードでの ID トークンの生成と使用に関する追加の手順については、ID トークンを取得する方法をご覧ください。