サービス間のアクセスを承認する

アーキテクチャで複数のサービスを使用している場合は、おそらくサービス間の通信を可能にするための認証情報が必要になります。Cloud Build には、サービス間で安全な認証と承認を行うために OpenID Connect(OIDC)標準のサポートが組み込まれています。

Cloud Build を使用して ID トークンを生成できます。このトークンを使用して、Cloud Build 内から安全なエンドポイントを呼び出すことができます。

たとえば、Cloud Functions、Cloud Run、App Engine などのサーバーレス プラットフォーム アプリケーションを実行している場合は、Cloud Build ワークロード内からアプリケーションと安全にやりとりできます。

準備

  • Cloud Build and IAM API を有効にします。

    API を有効にする

  • このアカウントを使用して有効期間の短い認証情報を作成する場合は、IAM Service Account Credentials API も有効にする必要があります。

    API を有効にする

  • このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。

  • 使用するサービス アカウントを作成したことを確認します。ビルドを実行する同じ Google Cloud プロジェクトでアカウントを作成する必要があります

必要な IAM 権限

ユーザー指定のサービス アカウントには、iam.serviceAccounts.getOpenIdToken 権限が必要です。

サービス アカウントに 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 は、http://www.example.com などの ID トークンを取得する URL またはターゲット オーディエンスです。
  • 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 は、http://www.example.com などの ID トークンを取得する URL またはターゲット オーディエンスです。
  • SERVICE_ACCOUNT_ID は、ユーザー指定のサービス アカウントのメールアドレスまたは一意の ID です。例: service-account-name@project-id.iam.gserviceaccount.com
  • LOGS_BUCKET_LOCATION: ビルドログを保存する Cloud Storage バケット。例: gs://mylogsbucket

ワークロードでの ID トークンの生成と使用に関する追加の手順については、ID トークンを取得する方法をご覧ください。

次のステップ