GitLab CI/CD环境下Terraform无法assume AWS IAM角色问题求助
排查步骤与解决方案
- 补全IAM角色信任关系配置
你当前仅配置了gitlab-runner-role的权限策略(用于定义角色拥有的操作权限),缺少核心的信任关系策略,该策略用于定义哪些身份有权限调用sts:AssumeRole接口获取该角色的权限。
进入IAM控制台gitlab-runner-role的配置页,切换到「信任关系」标签,编辑信任策略为以下内容(替换为你的AWS账号ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[你的AWS账号ID]:root" }, "Action": "sts:AssumeRole" } ] }
- 为根账号显式授权AssumeRole权限
虽然AWS根账号默认拥有最高权限,部分场景下仍需要显式配置允许根账号调用AssumeRole接口,你可以为根账号添加如下内联策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::[你的AWS账号ID]:role/gitlab-runner-role" } ] }
- 校验角色ARN配置
确认provider.tf中填写的role_arn和IAM控制台中实际角色的ARN完全一致,检查账号ID、角色名称拼写、大小写以及是否存在多余空格。 - 补充角色操作权限
你当前绑定的gitlab-runner-policy仅包含S3读写权限,仅能满足Terraform状态存储的需求,创建EC2实例还需要补充EC2相关操作权限,你可以在策略的Statement数组中新增如下配置:
{ "Sid": "EC2Operations", "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:DescribeInstances", "ec2:TerminateInstances", "ec2:CreateTags", "ec2:DescribeInstanceTypes", "ec2:DescribeImages" ], "Resource": "*" }
- 优化凭证配置
删除provider.tf中硬编码的access_key、secret_key字段,Terraform AWS Provider会自动读取环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,你直接在GitLab CI/CD项目变量中配置这两个值即可,无需手动export或写在配置文件中。 - 快速调试验证
可以在.gitlab-ci.yml的before_script中新增aws sts assume-role --role-arn [你的角色ARN] --role-session-name gitlab-debug命令,直接测试AssumeRole接口是否能调用成功,比反复执行Terraform排查效率更高。
内容的提问来源于stack exchange,提问作者Josh Edgar
相关产品推荐
相关产品推荐

