You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Jenkins迁移至GitHub Actions后,如何在AWS环境运行Terraform?

在GitHub Actions中实现AWS实例内运行Terraform更新基础设施的方案

核心思路

要把Jenkins里「在AWS实例内运行Terraform更新基础设施」的操作迁移到GitHub Actions,核心是让工作流安全连接到AWS目标实例,再在实例内部执行Terraform命令。

具体实现步骤

1. 配置AWS身份验证

优先用IAM角色而非长期密钥,保证权限安全:

  • 在AWS IAM中创建角色,赋予它访问目标EC2实例(SSM/SSH方式)及Terraform操作所需的基础设施权限(如EC2、S3、CloudFormation等)。
  • 在GitHub仓库的Settings > Secrets and variables > Actions中添加凭据:
    • 若用长期密钥:添加AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
    • 更安全的方式:配置OpenID Connect(OIDC)让GitHub Actions直接Assume AWS IAM角色,避免存储长期密钥。

2. 连接AWS实例执行Terraform命令

两种常用连接方式,推荐用SSM:

方式一:AWS Systems Manager(SSM)(无需开放SSH端口,更安全)

利用AWS原生管理工具,无需在安全组开放22端口,直接发送命令到实例:

- name: 连接AWS实例执行Terraform
  uses: aws-actions/aws-cli@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: us-east-1 # 替换为你的实例所在区域
    args: >
      ssm send-command
      --instance-ids i-xxxxxxxxx # 替换为目标实例ID
      --document-name "AWS-RunShellScript"
      --parameters commands="cd /path/to/terraform/code && terraform init && terraform plan && terraform apply -auto-approve"

方式二:SSH连接(需开放安全组22端口)

如果依赖SSH,在GitHub Secrets中存储实例SSH私钥,通过SSH客户端执行命令:

- name: SSH连接实例执行Terraform
  uses: appleboy/ssh-action@v1.0.3
  with:
    host: ${{ secrets.AWS_INSTANCE_IP }} # 实例公/私网IP
    username: ec2-user # 替换为实例用户名,如ubuntu
    key: ${{ secrets.AWS_SSH_PRIVATE_KEY }}
    script: |
      cd /path/to/terraform/code
      terraform init
      terraform plan
      terraform apply -auto-approve

3. 最佳实践

  • 状态管理:把Terraform状态文件存到AWS S3桶并开启版本控制,避免实例本地状态丢失或冲突。
  • 权限最小化:给IAM角色/SSH用户分配仅够完成Terraform操作的最小权限,降低风险。
  • 生产环境防护:添加手动审批环节,比如用GitHub Environments保护规则,需人工确认后再执行terraform apply。
  • 日志捕获:确保Terraform的plan、apply日志输出到GitHub Actions控制台,方便排查问题。

内容的提问来源于stack exchange,提问作者Blankman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:22:53