为了dynamic构build一个configuration文件,我需要从一个实例中查询EC2来检索现有实例的信息。 我使用带有ec2 describe-instances标志的aws CLI 。 我正在运行命令的实例附加到允许查询的angular色 :
{
“版本”:“2012-10-17”,
“声明”:[
{
“行动”:[
“EC2:DescribeAvailabilityZones”
“EC2:DescribeInstances”
“EC2:DescribeRegions”
“EC2:DescribeSecurityGroups”
“EC2:DescribeTags”
]
“资源”:“*”,
“效果”:“允许”
}
]
}
这在实例启动时工作得很好,但是当我尝试从user-data文件中获取数据时,我得到:
调用DescribeInstances操作时发生客户端错误(AuthFailure):AWS无法validation提供的访问凭证
我读到这可能是由一个非时间同步的实例引起的,所以我在调用awscli之前将awscli添加到user-data文件中,但仍然得到相同的错误。 在用户数据中,我使用awscli成功访问了s3和awscli :
aws s3 cp s3://s3test/foobar.yml playbook.yml
为了确保IAM策略的正常,我也尝试了AWS的EC2ReadOnly策略,得到了同样的结果。
查询是这样完成的:
区域= “EU-中央-1”
对于ip $(aws ec2 describe-instances --debug --filters'Name = tag:Name,Values = rabbitmq'--region“$ region”| jq -r'.Reservations [] .Instances [] .NetworkInterfaces [ ] .PrivateIpAddresses []。PrivateIpAddress')
做
#[要做的事情]
DONE
请注意这不是身份validation失败,我正在使用angular色来允许实例查询EC2 。
任何人都在使用awscli EC2访问并愿意分享经验?
正如我在评论部分所说的,我终于明白这个问题是与一个缺less的$PATH 。 在我的userdata脚本中, awscli是通过pip安装的,它将其安装在/usr/local/bin 。 aws命令本身实际上是在被执行时被发现的,但是当调用describe-instances函数不知道/usr/local/bin ,必须有一个在awscli中调用的subprocess,这会导致前面提到的错误。 对此的简单修复是在userdata脚本中用/usr/local/bin预先设置$PATH :
PATH =在/ usr / local / bin目录:$ PATH; 导出PATH