Skip to main content

One post tagged with "actions"

View All Tags

Integration Github Actions with Google Compute Engine

· 9 min read

记录一下通过 Github Actions 把项目输出通过 SSH 发布到 Google GCE 的配置过程.

  1. 主要步骤:
  • 创建新的身份池:先建一个 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 生命周期还有更严格限制。

  1. 前置条件: 你至少要有这些权限:
  • 配置 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 相关能力。
  1. 资源准备: 先假设已有或需要准备这些资源值:
  • 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]
  1. 安全优势 使用 OIDC Workload Identity Federation 相比传统 SSH 密钥方式有以下优势:
  • 无需长期密钥:不再需要在 GitHub Secrets 中存储 SSH 私钥,认证令牌是短期的,自动过期
  • 细粒度权限控制:可以通过 GCP IAM 精细控制部署权限
  • 审计追踪:所有认证和操作都会记录在 GCP Cloud Audit Logs 中
  • 条件约束:可以限制只允许特定仓库、分支触发部署
  • 权限分离:SA 用户仅负责 SSH 登录和文件传输,实际部署以 OS 用户身份执行,遵循最小权限原则
ClustrMaps