AWS角色链用于GitHub Actions遇权限拒绝问题求助
问题分析与解决思路
从报错信息看,你的GitHub Actions工作流没有切换到部署角色(cdk-contactupd-deploy-role-ACCOUNT_NO-REGION),而是直接用GithubActionsRole的身份执行CDK操作——而这个角色本身没有CloudFormation权限,因此触发AccessDenied错误。下面是具体解决步骤:
1. 修正部署角色的信任关系
当前部署角色仅允许AWS root用户扮演,无法被GithubActionsRole切换使用。需要修改其信任策略,添加允许GithubActionsRole扮演它的规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_NO:role/GithubActionsRole" }, "Action": "sts:AssumeRole" }, // 保留原有的root用户信任规则(如果业务需要) { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_NO:root" }, "Action": "sts:AssumeRole" } ] }
2. 确认GithubActionsRole的权限配置
检查GithubActionsRole的权限策略,确保sts:AssumeRole的目标资源是部署角色的完整ARN,且无额外限制:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "arn:aws:iam::ACCOUNT_NO:role/cdk-contactupd-deploy-role-ACCOUNT_NO-REGION" } ] }
3. 修改GitHub Actions工作流,添加角色切换步骤
获取GithubActionsRole的凭证后,需要调用aws sts assume-role获取部署角色的临时凭证,并将这些凭证设置为环境变量,让CDK使用该身份执行部署:
- name: Assume deployment role run: | RESPONSE=$(aws sts assume-role --role-arn "arn:aws:iam::ACCOUNT_NO:role/cdk-contactupd-deploy-role-ACCOUNT_NO-REGION" --role-session-name "GitHubActionsDeploy") echo "AWS_ACCESS_KEY_ID=$(echo $RESPONSE | jq -r '.Credentials.AccessKeyId')" >> $GITHUB_ENV echo "AWS_SECRET_ACCESS_KEY=$(echo $RESPONSE | jq -r '.Credentials.SecretAccessKey')" >> $GITHUB_ENV echo "AWS_SESSION_TOKEN=$(echo $RESPONSE | jq -r '.Credentials.SessionToken')" >> $GITHUB_ENV # 确保此步骤依赖aws-actions/configure-aws-credentials获取的GithubActionsRole凭证
4. 验证角色切换结果
可在工作流中添加一步验证当前身份,确认已成功切换到部署角色:
- name: Check current AWS identity run: aws sts get-caller-identity
执行后输出的ARN应包含cdk-contactupd-deploy-role-ACCOUNT_NO-REGION,说明角色切换生效。
内容的提问来源于stack exchange,提问作者Bambuk
相关产品推荐
相关产品推荐

