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

问题解决。

相关推荐
zyu672 小时前
03-Docker存储和网络
网络·docker·容器
正在学习前端的---小方同学2 小时前
Harbor部署教程
linux·运维
牛奔3 小时前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
Arciab3 小时前
51单片机_LCD1602液晶显示
网络·嵌入式硬件·51单片机
翼龙云_cloud3 小时前
阿里云渠道商:如何手动一键扩缩容ECS实例?
运维·服务器·阿里云·云计算
墨风如雪3 小时前
拒绝被找回!MJJ必修课:Outlook邮箱交易后的“防回手”安全设置全攻略
服务器
DX_水位流量监测4 小时前
大坝安全监测之渗流渗压位移监测设备技术解析
大数据·运维·服务器·网络·人工智能·安全
电商API&Tina4 小时前
京东 API 数据采集接口接入与行业分析
运维·服务器·网络·数据库·django·php
童话的守望者5 小时前
dc8靶场通关
网络
AKAMAI5 小时前
基准测试:Akamai云上的NVIDIA RTX Pro 6000 Blackwell
人工智能·云计算·测试