实验 05 部署与调用身份#

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

镜像准备#

本章由管理员准备镜像仓库,由专用部署 SA 发布,QA 验证调用。为保持 IAM 重点,使用本地 Docker 构建镜像,不引入 Cloud Build 的另一组身份。

管理员执行;仓库只需创建一次:

gcloud artifacts repositories create iam-lab --project="$PROJECT_ID" \
  --repository-format=docker --location="$REGION"
gcloud auth configure-docker "$REGION-docker.pkg.dev"
export IMAGE="$REGION-docker.pkg.dev/$PROJECT_ID/iam-lab/report-api:v1"
docker build --platform linux/amd64 -t "$IMAGE" app
docker push "$IMAGE"

推送者需该仓库的写权限。依赖采用兼容版本范围便于教学,真实发布应锁定依赖和镜像摘要,不把此样例当作生产依赖管理方案。

部署者与运行身份#

管理员创建专用部署 SA 并授予权限:

gcloud iam service-accounts create report-deployer --project="$PROJECT_ID"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
  --member="serviceAccount:$DEPLOY_SA" --role=roles/run.developer --condition=None
gcloud artifacts repositories add-iam-policy-binding iam-lab \
  --project="$PROJECT_ID" --location="$REGION" \
  --member="serviceAccount:$DEPLOY_SA" --role=roles/artifactregistry.reader
gcloud iam service-accounts add-iam-policy-binding "$APP_SA" --project="$PROJECT_ID" \
  --member="serviceAccount:$DEPLOY_SA" --role=roles/iam.serviceAccountUser
# 仅供教学,由管理员用短期凭据扮演部署者。
gcloud iam service-accounts add-iam-policy-binding "$DEPLOY_SA" --project="$PROJECT_ID" \
  --member="user:$ADMIN_EMAIL" --role=roles/iam.serviceAccountTokenCreator

初次创建服务需要项目层级部署权限;这个选择允许创建其他服务,因此它不是“仅更新一个既有服务”的最窄生产方案。真实生产可由平台先建服务,再针对既有服务收紧更新权限。Service Usage Consumer 等额外消费权限若被实际 API 要求,应按错误在对应消费项目补齐。

gcloud run deploy "$SERVICE" --project="$PROJECT_ID" --region="$REGION" \
  --image="$IMAGE" --service-account="$APP_SA" \
  --set-env-vars="INPUT_BUCKET=$INPUT_BUCKET,OUTPUT_BUCKET=$OUTPUT_BUCKET,SECRET_VERSION=projects/$PROJECT_ID/secrets/$SECRET_ID/versions/latest" \
  --max-instances=1 --min-instances=0 \
  --impersonate-service-account="$DEPLOY_SA"

这条实验服务必须保持需要认证,不能授予 allUsers 或关闭 Invoker IAM check。 若 CLI 询问是否允许未认证调用,选择否;在 Console 核对实际配置。Cloud Run service agent 与部署/运行 SA 不同,保留其系统授权。

QA 调用#

管理员在服务上给 QA 组调用权:

gcloud run services add-iam-policy-binding "$SERVICE" --project="$PROJECT_ID" \
  --region="$REGION" --member="group:$QA_GROUP" --role=roles/run.invoker
gcloud run services describe "$SERVICE" --project="$PROJECT_ID" --region="$REGION" \
  --format='value(status.url)'

把输出 URL 交给 QA;QA 不必为了拿 URL 而获得服务管理权。在 Carol 独立登录的终端设置 SERVICE_URL 后:

curl -i -X POST "$SERVICE_URL/report"
curl -i -X POST "$SERVICE_URL/report" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)"

匿名请求预期被平台拒绝;Carol 请求预期成功。这里使用 ID token 调用 Cloud Run;应用调用 Google API 使用访问令牌,不能把两种令牌用途混淆。对用户凭据而言,gcloud 生成的 ID token 用于开发测试;自动化应使用目标受众正确的工作负载令牌。

管理员检查报表对象。Carol 能调用应用,并不代表能直接读取输入 Bucket 或 Secret。若 QA 需要直接查看报表,单独在输出 Bucket 授予 QA 组 Object Viewer。

外部流水线扩展练习#

本节用 Console 步骤理解 Workload Identity Federation,不要求同时搭建完整 CI/CD:

  1. 选择实验流水线提供者及其 OIDC issuer,创建 Workload Identity Pool 和 OIDC Provider。
  2. 映射 google.subject 和所需仓库、组织、分支或环境属性;条件只信任指定组织及仓库,优先使用提供者稳定的数字 ID,不能只限制到整个公共 issuer。
  3. 在专用部署 SA 上,对精确的外部主体或主体集合授予 Workload Identity User。不要把 Token Creator 无差别授给整个池。
  4. 按提供者官方示例配置短期认证,把受保护环境与发布批准连接起来;成功后移除人为模拟部署 SA 的教学绑定。
  5. 验证可信分支发布成功,非可信仓库或分支无法交换所需凭据。记录流水线执行 ID、代码版本与云审计身份。

没有实际外部提供者时完成信任关系推演,不把它记录为已验证的联合认证。具体 provider 字段应使用所选平台官方指南,不能使用通用占位 JSON 代替。

验收:解释谁能改代码、谁能触发发布、谁能模拟部署 SA,以及这些能力如何间接触及运行 SA 的数据。清理见第 08 章。

参考:服务身份、部署权限、流水线身份最佳实践、流水线联合认证。


上一章 · 教程目录 · 下一章

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭