I am unable to make use of IAM roles in my Ansible playbooks. Specifically, I have authorised an EC2 instance to get from an S3 bucket, but I cannot work out how to make use of this authorisation from within Ansible.
The question
How do I write Ansible task(s) that satisfies all the following :
- Runs on an EC2 instance
- Uses the IAM role defined on the EC2 instance to obtain authorisation to access an S3 bucket
- Gets a file from the S3 bucket
A work around
I can get the EC2 instance to download from S3, only by passing in my credentials as follows:
`
- name: Download the part archive from S3
s3:
aws_access_key: “{{ lookup(‘env’,‘aws_key’) }}”
aws_secret_key: “{{ lookup(‘env’,‘aws_secret’) }}”
region: “{{ aws_packages_region }}”
bucket: “{{ aws_packages_bucket }}”
object: “/JI79IML/my_part_X86_64_c7.15.tar.gz”
dest: “/data/parts/JI79IML/my_part_X86_64_c7.15.tar.gz”
mode: get
overwrite: no
`
However, I would rather not send my AWS credentials to the instance. Instead I have defined a role with the appropriate permissions to get files from the S3 bucket.
What I’ve tried
The top answer in the stack overflow question linked below, suggests that it is simple matter of leaving the secret access key parameters out, and letting the Boto library take care of assuming the role.
However, when I try this with Ansible 1.8.4 and Boto 2.36.0 I get
`
msg: No handler was ready to authenticate. 1 handlers were checked. [‘HmacAuthV1Handler’] Check your credentials
`
and with Ansible 1.9.1 and Boto 2.38.0 I get:
msg: Failed to connect to S3: 'module' object has no attribute 'connect_to_region'
How I’ve confirmed the IAM role
To confirm that the IAM role is sufficient, I installed awscli on the EC2 instance and performed the download directly. First, I assumed the role
`
aws sts assume-role --role-arn “${ROLE_ARN}” --role-session-name “GettingMyPart”
`
which returns an absolutely baffling error message that the user with the assumed role cannot assume the role?!? But seems to do the trick, because I can then download the part
`
aws s3api get-object --bucket “${BUCKET_NAME}” --key JI79IML/my_part_X86_64_c7.15.tar.gz my_part_X86_64_c7.15.tar.gz
`
To confirm that the IAM role is required, I created another instance that does not enjoy a role and installed awscli on this second EC2 instance and followed the above steps. In each case, I got the message “Unable to locate credentials” as expected