【发布时间】:2018-12-29 06:25:17
【问题描述】:
我创建了一个私有 s3 存储桶和一个 Fargate 集群,其中包含一个尝试使用 python 3 和 boto3 从该存储桶读取的简单任务。我已经在 2 个不同的 docker 图像上尝试过这个,其中一个我从 boto 得到一个 ClientError,说 HeadObject Bad request (400),另一个我得到 NoCredentialsError: Unable to locate credentials。
图像中唯一真正不同的是,一个说错误请求正在正常运行,另一个是我通过 ssh 手动运行到任务容器。所以我不确定为什么一张图片说“错误请求”而另一张图片说“无法找到凭据”。
我尝试了几种不同的 IAM 政策,包括 (terraform) 以下政策:
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/*"]
}
}
第二次尝试:
data "aws_iam_policy_document" "access_s3" {
statement {
effect = "Allow"
actions = ["s3:*"]
resources = ["arn:aws:s3:::*"]
}
}
我尝试的最后一个是内置策略:
resource "aws_iam_role_policy_attachment" "access_s3" {
role = "${aws_iam_role.ecstasks.name}"
policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}
bucket的定义很简单:
resource "aws_s3_bucket" "bucket" {
bucket = "${var.bucket_name}"
acl = "private"
region = "${var.region}"
}
用于访问 s3 存储桶的代码:
try:
s3 = boto3.client('s3')
tags = s3.head_object(Bucket='bucket_name', Key='filename')
print(tags['ResponseMetadata']['HTTPHeaders']['etag'])
except ClientError:
traceback.print_exc()
无论我做什么,我都无法使用 boto3 从 Fargate 容器任务中访问 AWS 资源。我可以在EC2 实例上使用boto3 访问相同的s3 存储桶,而无需提供任何类型的凭据,并且仅使用IAM 角色/策略。我究竟做错了什么?不能以同样的方式从 Fargate 容器访问 AWS 资源吗?
忘了提到我正在将 IAM 角色分配给任务定义执行策略和任务策略。
更新:事实证明,我遇到的 unable to find credentials 错误是一个红鲱鱼。我无法获得凭据的原因是因为我的直接 ssh 会话没有设置 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量。
AWS Fargate 将代表您注入一个名为 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 的环境变量,其中包含 boto 应用于获取 API 访问凭证的 URL。所以Bad request 错误是我实际得到的并且需要帮助解决的错误。我检查了容器内的环境变量,AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 值正在由 Fargate 设置。
【问题讨论】:
-
我遇到了类似的问题stackoverflow.com/questions/61250393/…。如何在容器内设置环境变量?
标签: python-3.x amazon-s3 boto3 amazon-iam aws-fargate