为了动态构建配置文件,我需要从实例中查询EC2以检索有关现有实例的信息。我使用带有标志的aws
CLI 。ec2 describe-instances
我从中运行命令的实例附加到允许此类查询的角色:
{ “版本”:“2012-10-17”, “陈述”: [ { “行动”: [ "ec2:DescribeAvailabilityZones", "ec2:DescribeInstances", "ec2:DescribeRegions", "ec2:DescribeSecurityGroups", “ec2:描述标签” ], “资源”:“*”, “效果”:“允许” } ] }
当实例启动时,这工作得很好,但是当我尝试从user-data
文件中获取数据时,我得到:
调用 DescribeInstances 操作时发生客户端错误 (AuthFailure):AWS 无法验证提供的访问凭证
我读到这可能是由非时间同步的实例引起的,所以我在调用之前添加openntpd
到文件中,但仍然得到相同的错误。在 中,我成功访问和使用:user-data
awscli
userdata
s3
route53
awscli
aws s3 cp s3://s3test/foobar.yml playbook.yml
为了确保IAM政策没问题,我还尝试了AWS的EC2ReadOnly
政策,并得到了相同的结果。
查询是这样完成的:
region="eu-central-1" 对于 $(aws ec2 describe-instances --debug --filters 'Name=tag:Name,Values=rabbitmq' --region "$region"|jq -r '.Reservations[].Instances[].NetworkInterfaces[ ].PrivateIpAddresses[].PrivateIpAddress') 做 # [要做的事情] 完毕
请注意,这不是身份验证失败,我使用角色来允许实例查询EC2。
周围有人使用awscli
EC2访问并愿意分享经验吗?
正如我在评论部分所说,我终于发现这个问题与缺少
$PATH
. 在我的userdata
脚本中,awscli
是通过pip
安装的,它将它安装在/usr/local/bin
.aws
命令本身其实是在执行的时候发现的,但是在调用函数的时候里面肯定有一个不知道的子进程调用,awscli
这就describe-instances
导致/usr/local/bin
了前面提到的错误。对此的简单修复是$PATH
在/usr/local/bin
脚本中userdata
添加: