从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
相关产品推荐
相关产品推荐

