解决AWS EC2实例无法使用IAM角色登录AWS CLI

问题背景

有时,我们希望一台AWS EC2实例,即云服务器,能够使用AWS CLI访问AWS管理控制台资源。

例如,这里,我们想让它能够列出所有IAM用户组。

bash 复制代码
aws iam list-groups

于是,我们使用下面的命令,在AWS CLI中添加某位用户的访问秘钥,作为访问时的认证凭据。

bash 复制代码
aws configure

然而,这并非最佳方法。最佳方法应是给要访问控制台的实例分配一个IAM角色。否则将会有很多问题,例如,当前使用的访问秘钥能直接被以明文列出。

bash 复制代码
cat ~/.aws/credentials

于是,我们新建一个具有我们要分配的权限的IAM角色,并把它分配给这个实例。

问题描述

之后我们在控制台里删除原来使用的访问秘钥。然而,此时,新分配的角色似乎并没有起作用。

复制代码
 [ec2-user@ip-172-31-6-134 ~]$ aws iam list-groups
An error occurred (InvalidClientTokenId) when calling the ListGroups operation: The security token included in the request is invalid.

故障排查

我们怀疑AWS CLI似乎还在尝试使用原来的秘钥进行认证。然而,因为这对秘钥已经从控制台内被删除,所以自然而然,认证失败。

解决方法

事实确实如此。当一个EC2实例被分配了一个IAM角色时,并不会自动抹除之前使用aws configure配置的访问秘钥凭据。不仅如此,当IAM角色凭据和访问秘钥凭据同时存在时,后者具有更高优先级,也就是说AWS CLI会优先使用它们。

既然如此,移除原来使用的访问秘钥应该就能强迫AWS CLI使用角色进行认证。直接删除储存秘钥的文本文件credentials

bash 复制代码
rm ~/.aws/credentials

有人建议再抹除一些环境变量,但尝试下来似乎并不必要。

bash 复制代码
for var in AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_SECURITY_TOKEN ; do eval unset $var ; done

删除完成后,再次尝试从CLI访问AWS管理控制台。

成功。

bash 复制代码
[ec2-user@ip-172-31-6-134 ~]$ aws iam list-groups
json 复制代码
{
    "Groups": [
        {
            "Path": "/",
--snip--

并且,我们还能确认,我们当前确实在用角色作为凭据访问。

bash 复制代码
[ec2-user@ip-172-31-6-134 ~]$ aws sts get-caller-identity
json 复制代码
{
    "UserId": "AR...KI:i-0f54eeba8022361ec",
    "Account": "5...2",
    "Arn": "arn:aws:sts::5...2:assumed-role/IAMReaderRole/i-0f54eeba8022361ec"
}
bash 复制代码
[ec2-user@ip-172-31-6-134 ~]$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************6TVT         iam-role    
secret_key     ****************RnOE         iam-role    
    region           ap-southeast-1             imds    
[ec2-user@ip-172-31-6-134 ~]$

问题解决。

相关推荐
TechWayfarer9 小时前
2026年IP归属地查询平台选型指南:金融风控、异地登录、离线库全场景实测
网络·网络协议·tcp/ip
计算机安禾9 小时前
【Linux从入门到精通】第35篇:容器化技术预备——Docker安装与基本概念
linux·运维·docker
子木HAPPY阳VIP9 小时前
信创UOS,Docker 完整操作部署(Dockerfile部署方式)&排错整合
linux·运维·redis·nginx·docker·容器·tomcat
AOwhisky9 小时前
Kubernetes调度与服务暴露:从“定时任务”到“服务发现”的完全指南
linux·运维·云原生·容器·kubernetes·服务发现
信徒_10 小时前
技术选型 RPC 框架
网络·网络协议·rpc
勤劳的进取家10 小时前
应用层基础
运维·网络·学习
yunson_Liu10 小时前
aws EKS集群pvc存储扩容
k8s·aws
hahaha 1hhh10 小时前
中文乱码 ubuntu autodl
linux·运维·前端
计算机安禾10 小时前
【Linux从入门到精通】第37篇:NFS网络文件系统——无状态的数据共享
linux·网络·php
图码10 小时前
矩阵数据结构入门指南:声明、初始化与基本操作
运维·数据结构·线性代数·算法·矩阵