解决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 ~]$

问题解决。

相关推荐
MartinYeung51 小时前
[论文学习]InjecAgent:工具集成大语言模型智能体的间接提示注入基准测试
网络·学习·语言模型
paopaokaka_luck1 小时前
基于Springboot3+Vue3的高校选课系统(AI选课助手、协同过滤算法、分享到微博、扣扣、Echarts图形化分析)
网络·spring boot·网络协议·echarts
△曉風殘月〆1 小时前
如何在Linux中安装Qt开发环境
linux·运维·qt
三川6982 小时前
深入浅出SSD 10:UFS介绍
网络
BullSmall3 小时前
AFL++ HTTP Mode(网络 / HTTP 服务模糊测试)完整安装教程
网络·网络协议·http
爱写代码的阿森3 小时前
鸿蒙三方库 | harmony-utils之RegexUtil正则匹配验证详解
服务器·华为·harmonyos·鸿蒙·huawei
雨的旋律20993 小时前
ubuntu2604
linux·运维·服务器
Yuiiii__3 小时前
一次“在家连不上公司内网服务”的排障实战记录
网络·智能路由器
三言老师4 小时前
mkdir创建多级目录,目录创建基础实操
linux·运维·服务器
普马萨特4 小时前
5G小基站对室内定位的影响
网络·5g