我正在尝试使用 Ansible./ec2.py --list --refresh-cache
列出我的 AWS EC2 实例。
通过文档,我已经完成了以下清单:
- AWS(文档来自亚马逊的控制对 Amazon EC2 资源的访问&错误代码)
- 创建 IAM 用户和相应的 IAM 组
- 将该用户与该组关联
- 为 IAM 集团添加了非常开放的政策*
- 命令行界面(文档来自 Ansible 的动态库存)
- 安装
pip
和boto
- 创建一个
~/.boto
文件aws_access_key_id
,其中包含aws_secret_access_key
我从 AWS IAM 用户的访问凭证中收到的内容 - 安装
ec2.py
到ec2.ini
同一路径,保持两个文件不变 - 跑步
./ec2.py --list --refresh-cache
- 安装
*我的政策:
{
"Statement": [
{
"Sid": "Stmt1427001800780",
"Action": "*",
"Effect": "Allow",
"Resource": "*"
}
]
}
我这样做了,并希望能够列出ec2.py
基本上通过其路由的EC2 实例boto
,但实际上我看到了Error connecting to AWS backend. You are not authorized to perform this operation
。然而,我能够ssh
通过直接进入我的 EC2 实例ssh ubuntu@[ip]
。
我真的快要崩溃了。我到底做错了什么?
编辑:根据@EEAA 的建议添加一些新信息
当我使用pprint.pprint(e)
亚马逊的回应时:
EC2ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>UnauthorizedOperation</Code><Message>You are not authorized to perform this operation.</Message></Error></Errors><RequestID>b985d559-c410-4462-8b10-e0819fd81f12</RequestID></Response>
我的~/.boto
配置如下:
[Credentials]
aws_access_key_id = removed
aws_secret_access_key = removed
答案1
我收到的响应是“Forbidden”作为对“./ec2.py --list”的响应。这看起来像是在不使用 RDS 时发出描述 RDS 资源的查询请求(这是此插件的默认设置)时出现的错误。只需在 ec2.ini 中禁用该请求即可,如下所示:
rds = False
答案2
如果不使用 ElasticCache,您也必须将其设置为 False。因此取消注释
elasticache = False
答案3
我发现有必要将 IAM 用户和组附加到AmazonEC2FullAccess
策略(或任何其他包含ec2:Describe*
操作的策略,以允许从 Ansible 列出实例。
当然,还需要设置elasticcache
和rds
配置标志的其他答案false
,否则我得到的是以下响应:ERROR: "Forbidden", while: getting RDS instances
或ERROR: "Forbidden", while: getting ElastiCache clusters
。
答案4
刚刚解决了这个确切的问题。在我的例子中,Ansible AIM 用户是在单个 AWS 区域内创建的,具有完全管理员权限。我为这个实验选择了以前未使用的区域:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "ec2:*",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"ec2:Region": "us-east-2"
}
}
}
]
}
除了禁用(如此处其他答案中所述)之外,我还将 ec2.ini 限制为单个区域RDS
:elasticache
regions = us-east-2
这是“禁止访问”拼图的最后一块。