EC2实例内AWS CLI执行DescribeInstances报Unauthorized,本地VM正常
核心问题
两台虚拟机使用相同IAM用户的Access Key配置,实验室VM可正常执行AWS命令,但EC2实例中aws sts get-caller-identity返回一致身份,却无法执行aws ec2 describe-instances,报错UnauthorizedOperation。
排查步骤
检查EC2实例是否关联了IAM角色:
EC2实例若关联了IAM角色,AWS CLI会优先使用实例元数据提供的角色凭证,忽略本地aws configure配置的用户密钥。执行以下命令验证:# 查看实例是否绑定IAM角色 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ # 查看CLI实际使用的凭证来源 aws configure list如果返回角色名称,说明实例正在使用角色权限,而非本地配置的用户密钥。
验证IAM用户权限的条件限制:
登录AWS IAM控制台,检查该用户的权限策略,确认是否存在基于源IP、VPC、资源标签等条件的访问限制。例如策略中可能包含类似以下配置,仅允许实验室IP段访问:"Condition": { "IpAddress": { "aws:SourceIp": ["192.168.0.0/24"] } }EC2实例的公网/内网IP若不在允许范围内,会触发权限拒绝。
清理CLI临时凭证缓存:
EC2实例可能缓存了旧的临时凭证,导致优先使用缓存而非本地配置。执行以下命令清理缓存:rm -rf ~/.aws/cli/cache/清理后重新执行
aws ec2 describe-instances测试。确认CLI凭证加载优先级:
AWS CLI会按「环境变量 → 实例元数据 → 本地配置文件」的顺序加载凭证。执行echo $AWS_ACCESS_KEY_ID和echo $AWS_SECRET_ACCESS_KEY,确认环境变量未被设置为其他值;再通过aws configure list查看access_key和secret_key的来源是否为~/.aws/credentials。
附用户执行详情
实验室VM执行结果
[root@XXX-C13-202 ~]# aws sts get-caller-identity { "Account": "6766XXXXXXX", "UserId": "AIDAIDXXXXXXXX", "Arn": "arn:aws:iam::6766XXXXXXX:user/r*****m" } [root@XXX-C13-202 ~]# aws ec2 describe-instances
执行成功!
EC2实例执行结果
ubuntu@ip-10-51-23-131:~$ /usr/local/bin/aws sts get-caller-identity { "UserId": "AIDAIDXXXXXXXX", "Account": "6766XXXXXXX", "Arn": "arn:aws:iam::6766XXXXXXX:user/r*****m" } ubuntu@ip-10-51-23-131:~$ /usr/local/bin/aws ec2 describe-instances
报错:
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
EC2实例AWS CLI版本:aws-cli/2.9.19 Python/3.9.11 Linux/3.13.0-92-generic exe/x86_64.ubuntu.14 prompt/off
内容的提问来源于stack exchange,提问作者user3559139

