实验 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:
- 选择实验流水线提供者及其 OIDC issuer,创建 Workload Identity Pool 和 OIDC Provider。
- 映射
google.subject和所需仓库、组织、分支或环境属性;条件只信任指定组织及仓库,优先使用提供者稳定的数字 ID,不能只限制到整个公共 issuer。 - 在专用部署 SA 上,对精确的外部主体或主体集合授予 Workload Identity User。不要把 Token Creator 无差别授给整个池。
- 按提供者官方示例配置短期认证,把受保护环境与发布批准连接起来;成功后移除人为模拟部署 SA 的教学绑定。
- 验证可信分支发布成功,非可信仓库或分支无法交换所需凭据。记录流水线执行 ID、代码版本与云审计身份。
没有实际外部提供者时完成信任关系推演,不把它记录为已验证的联合认证。具体 provider 字段应使用所选平台官方指南,不能使用通用占位 JSON 代替。
验收:解释谁能改代码、谁能触发发布、谁能模拟部署 SA,以及这些能力如何间接触及运行 SA 的数据。清理见第 08 章。
参考:服务身份、部署权限、流水线身份最佳实践、流水线联合认证。