如果您的架构使用多项服务,您可能需要凭据来启用服务之间的通信。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.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. 如果您打算使用此账号创建短期有效的凭据,则还需要启用 IAM Service Account Credentials API。
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.如需使用本指南中的命令行示例,请安装并配置 Google Cloud CLI。
确保您已经创建了要使用的服务账号。 您必须在运行构建所在的 Google Cloud 项目中创建该账号。
必需的 IAM 权限
您指定的用户服务账号必须具有 iam.serviceAccounts.getOpenIdToken
权限。
- 在您创建服务账号的项目中,向用户指定的服务账号授予 Service Account OpenID Connect Identity Token Creator (
roles/iam.serviceAccountOpenIdTokenCreator
) 角色。
如需了解如何向服务账号授予 IAM 角色,请参阅管理对服务账号的访问权限。
获取 ID 令牌的方法
您可以通过以下两种方式配置 build 步骤以获取 ID 令牌:
- 使用 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 令牌的网址或目标受众群体,例如http://www.example.com
。SERVICE_ACCOUNT_ID
是用户指定的服务账号的电子邮件地址或唯一 ID。例如service-account-name@project-id.iam.gserviceaccount.com
。LOGS_BUCKET_LOCATION
:用于存储 build 日志的 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 令牌的网址或目标受众群体,例如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 令牌的方法。