I created a private s3 bucket and a fargate cluster with a simple task that attempts to read from that bucket using python 3
and boto3
. I've tried this on 2 different docker images and on one I get a ClientError
from boto saying HeadObject Bad request (400)
and the other I get NoCredentialsError: Unable to locate credentials
.
The only real different in the images is that the one saying bad request is being run normally and the other is being run manually by me via ssh to the task container. So I'm not sure why one image is saying "bad request" and the other "unable to locate credentials".
I have tried a couple different IAM policies, including (terraform
) the following policies:
data "aws_iam_policy_document" "access_s3" {
statement {
effect = "Allow"
actions = ["s3:ListBucket"]
resources = ["arn:aws:s3:::bucket_name"]
}
statement {
effect = "Allow"
actions = [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectTagging",
"s3:GetObjectVersionTagging",
]
resources = ["arn:aws:s3:::bucket_name/*"]
}
}
Second try:
data "aws_iam_policy_document" "access_s3" {
statement {
effect = "Allow"
actions = ["s3:*"]
resources = ["arn:aws:s3:::*"]
}
}
And the final one I tried was a build in policy:
resource "aws_iam_role_policy_attachment" "access_s3" {
role = "${aws_iam_role.ecstasks.name}"
policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}
the bucket definition is very simple:
resource "aws_s3_bucket" "bucket" {
bucket = "${var.bucket_name}"
acl = "private"
region = "${var.region}"
}
Code used to access s3 bucket:
try:
s3 = boto3.client('s3')
tags = s3.head_object(Bucket='bucket_name', Key='filename')
print(tags['ResponseMetadata']['HTTPHeaders']['etag'])
except ClientError:
traceback.print_exc()
No matter what I do, I'm unable to use boto3
to access AWS resources from within a Fargate
container task. I'm able to access the same s3 bucket with boto3
on an EC2
instance without providing any kind of credentials and only using the IAM roles/policies. What am I doing wrong? Is it not possible to access AWS resources in the same way from a Fargate container?
Forgot to mention that I am assigning the IAM roles to the task definition execution policy and task policy.
UPDATE: It turns out that the unable to find credentials
error I was having is a red herring. The reason I could not get the credentials was because my direct ssh session did not have the AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
environment variable set.
AWS Fargate will inject an environment variable named AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
on your behalf which contains a url to what boto should use for grabbing API access credentials. So the Bad request
error is the one I'm actually getting and need help resolving. I checked my environment variables inside the container and the AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
value is being set by Fargate.