python - boto3 Access Denied S3 put_object 具有正确的权限
问题描述
第一次boto3用户。
我有一个使用 ACL S3FullAccess 的用户,并使用以下代码尝试上传文件;它使用 pandas DataFrame 作为源。
s3_client = boto3.client('s3')
io = StringIO()
df.to_csv(io)
response = s3_client.put_object(
Bucket=self.bucket,
Body=io,
Key=self.filename
)
这导致了这种反应
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
因此,我检查了 boto3 是否从我的 ~/.aws/credentials 文件中获取了密钥和访问密钥,它们位于 boto3 中 client.py 的第 604 行 - request_signer=self._request_signer
所以我在这里研究了SO,好像很多人都得加一个Policy文件,所以我做了如下:
{
"Version": "2012-10-17",
"Id": "Policyxxx",
"Statement": [
{
"Sid": "Stmtx1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<12 digit id>:root"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<my-bucket>/*"
},
{
"Sid": "Stmtx6",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<12 digit id>:root"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<my-bucket>"
}
]
}
我仍然遇到同样的错误,所以我将它添加到我的 put_object 调用中,因为 S3 存储桶使用 AES-256 加密,我认为这只是服务器端的,但没有想法,所以值得一试。
SSECustomerKey=os.urandom(32),
SSECustomerAlgorithm='AES256',
接下来,我删除了与 SSE 密钥相关的术语,意识到 AES-256 加密是服务器端的,不应该影响我的访问。
然后我尝试生成一对新的访问密钥并使用它们来代替,结果相同。
有谁知道我接下来会看什么,我在数百页的 AWS 文档中遗漏了什么?
解决方案
这只是在创建用户时将他们添加到几个组中的一个简单例子。管理员和 EC2MFA。我不知道这会带来什么影响,但假设 EC2MFA 组阻止了 API 或 CLI 访问。我假设用户和 S3 端的策略组合足够安全。
推荐阅读
- ios - switch 语句返回类实例
- javascript - 在 C++ 中访问 HttpStatusCode,如 Javascript
- amazon-web-services - 使用无服务器时如何解决“错误验证堆栈策略”“不支持的操作”?
- angular - Angular 6:无法读取未定义的属性“获取”
- haskell - 如何在 Haskell Stack 中包含依赖 C 库
- python - PIL打开tif图像只有一个通道
- pandas - ImportError:Zeppelin (EMR) 中没有名为 pandas 的模块
- r - 如何使用 dplyr 或类似的 R 包在数据帧中进行渐进式操作?
- reactjs - React Router 不更新 url 更改的内容
- vhdl - 当我将数据从慢时钟域交叉到快时钟域时,拉伸的数据不会成为处理问题吗?