如何无需密钥及硬编码用户,实现GitHub Actions与AWS部署的无密码认证对接?
当然有!现在AWS和GitHub Actions原生支持通过**OpenID Connect (OIDC)**实现完全无密码的身份认证流程,彻底摆脱长期IAM凭证带来的密钥泄露风险和轮换麻烦。我来给你一步步拆解具体实现方式:
实现无密码部署的核心方案:AWS OIDC身份认证
这个方案的核心是让GitHub Actions通过OIDC协议向AWS请求短期有效的临时访问凭证,全程不需要存储任何长期密钥,所有凭证都会自动过期。
第一步:在AWS中配置GitHub OIDC身份提供商
- 登录AWS控制台,进入IAM服务
- 切换到「身份提供商」页面,点击「添加提供商」
- 选择「OpenID Connect」作为提供商类型,输入GitHub的OIDC issuer URL:
https://token.actions.githubusercontent.com - 点击「获取指纹」完成验证,然后在「受众」字段填写
sts.amazonaws.com,最后点击「添加提供商」完成创建
第二步:创建用于部署的IAM角色并配置信任关系
进入IAM的「角色」页面,点击「创建角色」
选择「Web身份」作为可信实体类型,在「身份提供商」下拉框中选择刚才创建的GitHub OIDC提供商
「受众」选择
sts.amazonaws.com,点击「下一步」为角色附加部署所需的权限策略(比如S3同步、CloudFormation部署、ECS更新等,遵循最小权限原则,只给必要权限)
给角色命名(比如
GitHubActions-Deploy-Role),完成角色创建提示:你可以在角色的信任策略里进一步限制访问范围,比如只允许特定仓库、分支或工作流使用该角色。例如在信任策略的
Condition中添加:"StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:your-username/your-repo:ref:refs/heads/main" }这样只有你的主分支的工作流才能Assume这个角色,安全性更高。
第三步:在GitHub Actions工作流中配置认证
打开仓库的.github/workflows目录下的部署yaml文件,添加以下配置:
jobs: aws-deploy: runs-on: ubuntu-latest # 必须设置id-token权限为write,才能获取OIDC令牌 permissions: id-token: write contents: read steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置AWS临时凭证 uses: aws-actions/configure-aws-credentials@v4 with: # 替换成你的AWS账号ID和刚才创建的角色ARN role-to-assume: arn:aws:iam::123456789012:role/GitHubActions-Deploy-Role aws-region: us-east-1 # 替换成你的AWS区域 - name: 执行部署操作 run: | # 这里写你的实际部署命令,比如同步静态文件到S3 aws s3 sync ./dist s3://your-deployment-bucket --delete # 或者部署CloudFormation栈 aws cloudformation deploy --stack-name MyAppStack --template-file ./cloudformation/template.yaml
为什么这个方案更好?
- 无长期密钥:完全不需要存储IAM用户的Access Key/Secret Key,从根源避免密钥泄露风险
- 自动轮换凭证:临时凭证默认1小时过期,且每次运行工作流都会获取新的凭证,无需手动轮换
- 细粒度权限控制:通过IAM角色的信任策略和权限策略,可以精准控制哪些仓库、分支甚至工作流能执行部署操作
内容的提问来源于stack exchange,提问作者AlBlue
相关产品推荐
相关产品推荐

