我在分配有 Iam 角色的 EC2 实例上运行 Ansible。我正在运行这个剧本:
$ cat s3.yaml
---
- hosts: localhost
remote_user: ec2-user
tasks:
- name: download ec2.py from s3
s3:
bucket: mybucket
object: /ec2.py
dest: /tmp/ec2.py
mode: get
使用 -vvv 运行它会提供以下错误消息:
fatal: [localhost]: FAILED! => {
"changed": false,
"failed": true,
"invocation": {
"module_args": {
"aws_access_key": null,
"aws_secret_key": null,
"bucket": "mybucket",
"dest": "/tmp/ec2.py",
"ec2_url": null,
"encrypt": true,
"expiry": "600",
"headers": null,
"marker": null,
"max_keys": "1000",
"metadata": null,
"mode": "get",
"object": "/ec2.py",
"overwrite": "always",
"permission": [
"private"
],
"prefix": null,
"profile": null,
"region": null,
"retries": 0,
"rgw": false,
"s3_url": null,
"security_token": null,
"src": null,
"validate_certs": true,
"version": null
},
"module_name": "s3"
},
"msg": "Source bucket cannot be found"
}
根据文档,带有 boto 的 Ansible 应该能够获得 EC2 实例角色。
到目前为止,我有:
- 尝试了文档,这意味着它应该可以正常工作。
- 已验证我的 boto 版本是否足够新(boto 2.42)
- 已验证 EC2 实例角色具有正确的权限(
aws s3 cp s3://mybucket/ec2.py /tmp/ec2.py
工作正常) - 已验证 EC2 实例凭证可通过
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
这个已回答的问题和文档表明这是可能的。
我可以在不直接将实例凭据提供给 boto/ansible 的情况下完成此操作吗?如果是,如何。文档似乎有点缺乏。
经过更多的调试和试验,我发现问题的原因是 Ansible S3 模块中的一个错误。
我在原始问题中引用的 ansible playbook 仅适用于 IAM 角色除了GetObject权限之外还具有ListBucket权限的情况。
我遇到了完全相同的问题。我发现如果我通过 ansible playbook 提供 AWS 访问密钥 ID 和秘密访问密钥,它将工作并从 S3 下载对象。使用内联提供的键将其作为 ansible 命令运行也可以。因此,“找不到源存储桶”消息具有误导性,这是由于 Ansible 无法使用 IAM 角色。
Ansible GitHub中有一张 bug 票(我猜是同一作者打开的),但仍未解决。