Estou executando o Ansible em uma instância do EC2 com uma função Iam atribuída. Estou executando este manual:
$ 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
Executá-lo com -vvv fornece esta mensagem de erro:
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"
}
De acordo com a documentação, o Ansible com boto deve ser capaz de assumir a função de instância do EC2.
Até agora eu tenho:
- Tentei a documentação, o que implica que deve funcionar.
- Verifiquei que minha versão do boto é nova o suficiente (boto 2.42)
- Verificado se a função da instância do EC2 tem as permissões corretas (
aws s3 cp s3://mybucket/ec2.py /tmp/ec2.py
funciona bem) - Verificou se as credenciais da instância do EC2 estão disponíveis por meio de
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
Esta pergunta respondida e a documentação indicam que é possível.
Posso fazer isso sem disponibilizar as credenciais da instância diretamente para o boto/ansible? Se sim, como. A documentação parece um pouco carente.
Depois de mais algumas depurações e experimentos, descobri que a causa do problema era um bug no módulo Ansible S3.
O playbook ansible que citei em minha pergunta original só funciona se a função IAM tiver permissões ListBucket além das permissões GetObject .
Estou passando exatamente pelo mesmo problema. Descobri que, se eu fornecer o ID da chave de acesso da AWS e a chave de acesso secreta por meio do playbook ansible, ele funcionará e fará o download do objeto do S3. Executá-lo como um comando ansible com chaves fornecidas em linha também funciona. Portanto, a mensagem "O depósito de origem não pode ser encontrado" é enganosa e isso ocorre porque o Ansible não pode usar a função IAM.
Há um ticket de bug no Ansible GitHub (acho que foi aberto pelo mesmo autor), mas ainda não foi resolvido.