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