如果您的架构使用多项服务,则可能需要凭据 才能在服务之间启用通信。Cloud Build 提供对 OpenID Connect (OIDC) 标准内置支持,以实现服务之间的安全身份验证和授权。
您可以使用 Cloud Build 生成 ID 令牌。借助这些令牌,您可以从 Cloud Build 内调用安全端点。
例如,如果您运行的是无服务器平台应用(例如 Cloud Run 函数、Cloud Run 或 App Engine),则可以从 Cloud Build 工作负载内安全地与应用互动。
准备工作
-
启用 Cloud Build 和 IAM API。
启用 API 所需的角色
如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (
roles/serviceusage.serviceUsageAdmin),该角色包含serviceusage.services.enable权限。了解如何授予 角色。 如果您计划使用此账号来创建短期有效的凭据, 则还需要启用 IAM Service Account Credentials API。
启用 API 所需的角色
如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (
roles/serviceusage.serviceUsageAdmin),该角色包含serviceusage.services.enable权限。了解如何授予角色。如需使用本指南中的命令行示例,请安装并 配置 Google Cloud CLI。
确保您已经创建了要使用的服务账号 。您必须 在运行构建所在的同一 Google Cloud 项目 中创建该账号。
必需的 IAM 权限
用户指定的服务帐号必须具有 iam.serviceAccounts.getOpenIdToken 权限。
- 在创建服务帐号的项目中,向用户指定的服务帐号授予 Service Account OpenID Connect Identity Token Creator (
roles/iam.serviceAccountOpenIdTokenCreator) 角色。
如需了解如何向服务帐号授予 IAM 角色,请参阅 管理对服务账号的访问权限。
获取 ID 令牌的方法
您可以通过以下两种方式配置构建步骤以获取 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是用于存储构建日志的 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 令牌的方法。