使用 boto3 接入点从 S3 存储桶读取和写入 S3 存储桶



我必须使用带有boto3的访问点访问 S3 存储桶。

我创建了一个带有允许读取和写入的策略的接入点(<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。

我的第一个猜测是,您缺少必须在 boto3 开发工具包中使用的存储桶(存储桶策略(和 (2( 在存储桶(存储桶策略(上定义的权限。

(1(从文档中我可以看到

要使应用程序或用户能够通过访问点访问对象,访问点和底层存储桶都必须允许该请求

例如,您可以添加一个存储桶策略,将访问控制委派给访问点,这样您就不必指定通过访问点的每个委托人。链接文档中给出了一个示例。

(2( 如您的问题中所述,您已经在 LambdaExecutionRole 中使用了 AmazonS3FullAccess 策略。我唯一的猜测(即发生在我身上的事情(是,例如,存储桶中的对象上存在 KMS 加密,并且您的角色缺少 kms 操作的权限。尝试执行附加了管理策略的功能,看看它是否有效。如果是,请找出缺少哪些特定权限。

一些进一步的说明:我假设你

  • 没有将接入点限制为仅在特定 VPC 中可用。
  • 正在阻止公共访问。

替换...

"资源":"arn:aws:s3:region_name:<12 位 account_id>:bucket_name">
s3。Bucket('bucket_name'(.download_file('hello.txt', '/tmp/hello.txt'(

希望对你有帮助...

相关内容

  • 没有找到相关文章

最新更新