Autoriza el acceso de servicio a servicio

Si tu arquitectura usa varios servicios, es probable que necesites credenciales para permitir la comunicación entre servicios. Cloud Build proporciona compatibilidad integrada con OpenID Connect (OIDC) para autenticación y autorización seguras entre servicios.

Puedes usar Cloud Build para generar tokens de ID. Con estos tokens, pueden llamar a extremos seguros desde Cloud Build.

Por ejemplo, si ejecutas una aplicación de plataforma sin servidores como Cloud Run Functions, Cloud Run o App Engine, puedes interactuar con tu aplicación desde las cargas de trabajo de Cloud Build.

Antes de comenzar

  • Enable the Cloud Build and IAM APIs.

    Enable the APIs

  • Si planeas usar esta cuenta para crear credenciales de corta duración, también debes habilitar la API de IAM Service Account Credentials.

    Enable the API

  • Para usar los ejemplos de la línea de comandos de esta guía, instala y configura Google Cloud CLI.

  • Asegúrate de haber creado la cuenta de servicio que deseas usar. Debes crear la cuenta en el mismo proyecto de Google Cloud. en los que ejecutas compilaciones.

Permisos de IAM obligatorios

Tu cuenta de servicio especificada por el usuario debe tener la iam.serviceAccounts.getOpenIdToken.

Si quieres obtener instrucciones para otorgar roles de IAM a una cuenta de servicio, consulta Administra el acceso a las cuentas de servicio.

Métodos para obtener un token de ID

Existen dos maneras de configurar los pasos de compilación para obtener tokens de ID:

  • usa gcloud CLI
  • enviar una solicitud directa al servidor de metadatos

Obtén un token de ID a través de gcloud

En esta sección, el siguiente fragmento de código demuestra cómo usar el gcloud CLI para obtener tokens de 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
  }
}

Reemplaza lo siguiente:

  • TOKEN_AUDIENCE es la URL o el público objetivo para obtener el token de ID, por ejemplo, http://www.example.com
  • SERVICE_ACCOUNT_ID es la dirección de correo electrónico o el ID único para la cuenta de servicio especificada por el usuario. Por ejemplo, service-account-name@project-id.iam.gserviceaccount.com
  • LOGS_BUCKET_LOCATION es el bucket de Cloud Storage. para almacenar registros de compilación. Por ejemplo, gs://mylogsbucket

Envía una solicitud directa al servidor de metadatos

En esta sección, el siguiente fragmento de código demuestra cómo hacer una solicitud al servidor de metadatos para obtener tokens de 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
  }
}

Reemplaza lo siguiente:

  • TOKEN_AUDIENCE es la URL o el público objetivo para obtener el token de ID, por ejemplo, http://www.example.com
  • SERVICE_ACCOUNT_ID es la dirección de correo electrónico o el ID único para la cuenta de servicio especificada por el usuario. Por ejemplo, service-account-name@project-id.iam.gserviceaccount.com
  • LOGS_BUCKET_LOCATION es el bucket de Cloud Storage para almacenar registros de compilación. Por ejemplo, gs://mylogsbucket

Para obtener instrucciones adicionales sobre cómo generar y usar tokens de ID en tus cargas de trabajo, Consulta Métodos para obtener un token de ID.

¿Qué sigue?