python-3.x - 使用带有 boto3 的访问点从 S3 存储桶读取和写入
问题描述
我必须使用带有boto3
.
我创建了一个访问点,其策略允许读取和写入(<access_point_arn>
是我的访问点ARN
):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "<access_point_arn>/object/*"
]
}
在官方文档中提到了接入点,其中接入点ARN
必须代替存储桶名称(https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) . 官方文档站点上没有针对开发人员的示例 ( https://docs.aws.amazon.com/AmazonS3/latest/dev/using-access-points.html )。
因此,根据信息,我认为正确的使用方法是:
import boto3
s3 = boto3.resource('s3')
s3.Bucket('<access_point_arn>').download_file('hello.txt', '/tmp/hello.txt')
当我在附加了托管策略的 Lambda 中执行此代码时,AmazonS3FullAccess
我得到一个ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden
Lambda 和 S3 接入点都连接到同一个 VPC。
解决方案
我的第一个猜测是您缺少必须在 (1) 存储桶(存储桶策略)和 (2) 您在 boto3 SDK 中使用的 IAM 用户或角色上定义的权限。
(1) 从文档中我可以看到
为了使应用程序或用户能够通过访问点访问对象,访问点和底层存储桶都必须允许该请求。
例如,您可以添加一个将访问控制委派给访问点的存储桶策略,这样您就不必指定通过访问点来的每个主体。链接文档中给出了一个示例。
(2) 如您的问题所述,您已经在 LambdaExecutionRole 中使用 AmazonS3FullAccess 策略。我唯一的猜测(即发生在我身上的事情)是,例如,对您的存储桶中的对象进行了 KMS 加密,而您的角色缺少对 kms 操作的权限。尝试执行附加了管理策略的功能,看看它是否有效。如果是,请找出缺少哪些特定权限。
一些进一步的说明:我假设你
- 没有将接入点限制为仅在特定 VPC 中可用。
- 正在阻止公共访问。
推荐阅读
- php - 在PHP中的日期数组中填充空日期
- go - 如何通过 HTTPS 在 Golang 中进行 SOAP 调用
- python - 用python将文本解析成段落(循环问题)
- google-apps-script - Exclude users from belonging to a particular group in G Suite
- pandas - 堆叠每日数据数据框以获得每小时输出
- view - 如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值
- python - 我需要编写什么查询来获取表的某一行中的值
- processing - 未使用局部变量“img”的值
- r - 有人认识这种用于日期存储的表格吗?
- python - 在 Jupyter 中以颜色打印 f 字符串,并在混合中使用转义字符