Integration Github Actions with Google Compute Engine
· 9 min read
记录一下通过 Github Actions 把项目输出通过 SSH 发布到 Google GCE 的配置过程.
- 主要步骤:
- 创建新的身份池:先建一个 Workload Identity Pool,它像一个“外层容器”,用来容纳来自 GitHub 的外部身份。
- 配置映射并添加条件:在这个池里建一个 OIDC Provider,把 GitHub 发来的 OIDC claims 映射成 Google 可识别的属性,并加一个准入条件,限制只有你指定的 GitHub 组织/仓库/分支能进来。
- 将新池连接到服务帐户:这一步不是点一个“连接”按钮,而是给目标 Service Account 加一条 IAM policy binding,让来自这个池中、满足条件的 GitHub principal 能以 roles/iam.workloadIdentityUser 身份冒充这个服务账号。
对于“GitHub Actions 操作 GCE”,建议直接走 Workload Identity Federation through a Service Account,不要用长期 JSON key。Google 的 auth Action 文档把它列为推荐路径之一;而且如果要生成 OAuth 2.0 access token 或用 gcloud 操作资源,通常都要提供 service account。直接给 pool/resource 绑定权限的方式虽然可行,但并不是所有资源都支持 principalSet,并且直接 WIF 的 token 生命周期还有更严格限制。
- 前置条件: 你至少要有这些权限:
- 配置 Workload Identity Pool / Provider:roles/iam.workloadIdentityPoolAdmin
- 创建 Service Account:roles/iam.serviceAccountCreator
- 修改 Service Account 的 IAM 访问策略:roles/iam.serviceAccountAdmin (docs.cloud.google.com) 另外,如果你的项目还没开相关 API,至少要确保 IAM API 和 Compute Engine API 已启用;Compute Engine API 的服务名是 compute.googleapis.com,IAM API 会处理 service account 相关能力。
- 资源准备: 先假设已有或需要准备这些资源值:
- Github Organization or User, Github 组织或用户名. 比如 myorg
- Github Repository, Github 仓库地址. 比如 myorg/myrepo
- GCP Project ID, Google Cloud 项目ID. 比如 my-gcp-project
- GCP Project Number, Google Cloud 项目编号. 比如 123456789012
- GCP Workload Identity Pool ID, 需要命名并创建. 比如 github-actions
- GCP Workload Identity Provider ID, 需要命名并创建. 比如 github-myorg-myrepo
- GCP Service Account, 现有 GCE 实例关联的 Service Account. 比如自动生成的 123456789012-compute
- GCP Service Account Email, 现有 GCE 实例关联的 Service Account Email. 比如自动生成的 [email protected]
- 安全优势 使用 OIDC Workload Identity Federation 相比传统 SSH 密钥方式有以下优势:
- 无需长期密钥:不再需要在 GitHub Secrets 中存储 SSH 私钥,认证令牌是短期的,自动过期
- 细粒度权限控制:可以通过 GCP IAM 精细控制部署权限
- 审计追踪:所有认证和操作都会记录在 GCP Cloud Audit Logs 中
- 条件约束:可以限制只允许特定仓库、分支触发部署
- 权限分离:SA 用户仅负责 SSH 登录和文件传输,实际部署以 OS 用户身份执行,遵循最小权限原则
