从熊猫的创建存储桶权限到S3的访问被拒绝错误to_csv



我有一个在 EC2 盒子上运行的脚本,该脚本通过运行pd.to_csv('s3://<my_bucket_name>/<file_path>来完成。

使用我的 AWS 管理员凭证在本地运行,此脚本运行良好并将 csv 存入正确的存储桶。

我对 EC2 实例的 S3 权限是从 AWS 的文档复制并粘贴的:https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::<my_bucket_name>"]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object*",
"Resource": ["arn:aws:s3:::<my_bucket_name>/*"]
}
]
}

在 EC2 实例上运行时,我的错误是botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied

我不明白为什么 pandas/s3fs 在我的已经存在的情况下试图创建一个存储桶。其他地方的建议是只提供对 ec2 的s3:*访问,但我宁愿限制更多一点,而不是没有限制。

关于如何解决这个问题的任何想法?

事实证明,这更多的是运行 ec2 实例的 aws 批处理角色的问题。写入权限足以在没有存储桶列表权限的情况下写入 S3。AccessDeny 错误是更普遍的错误,即没有向实例传递任何权限。

快速浏览 Pandas 代码库并没有向我展示任何具体内容,但我的猜测是,它在列出/更新对象之前检查存储桶是否存在,但由于它没有s3:ListAllMyBuckets权限而失败。

你可以通过给你的角色这个行动(在它自己的陈述中)来确认或否认这个理论,这有望避免不得不给予它s3:*

尝试在"Sid"下添加s3:GetBucketLocation:"ListObjectsInBucket"?

从 AppRunner 调用df.to_csv到 S3 时遇到同样的问题, 向我的 AppRunner 实例的 IAM 策略添加s3:GetBucketLocation权限有效:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::<bucket_name>/*"
},
{
"Effect": "Allow",
"Action": "s3:GetBucketLocation", # ADDED THIS
"Resource": "arn:aws:s3:::<bucket_name>"
}
]
}

(每 https://github.com/pandas-dev/pandas/issues/51121)

相关内容

最新更新