我有一个在 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)