Python 3.x 使用具有boto3的访问点从/向S3存储桶进行读写

Python 3.x 使用具有boto3的访问点从/向S3存储桶进行读写,python-3.x,amazon-web-services,amazon-s3,boto3,amazon-s3-access-points,Python 3.x,Amazon Web Services,Amazon S3,Boto3,Amazon S3 Access Points,我必须使用带有boto3的访问点访问S3存储桶 我已创建了一个具有允许读写策略的访问点(是我的访问点ARN): 当我在附加了AmazonS3FullAccessmanaged策略的Lambda中执行此代码时,我收到一个ClientError:调用HeadObject操作时发生错误(403):禁止 Lambda和S3接入点都连接到同一VPC。替换 “资源”:“arn:aws:s3:区域名称::桶名称” s3.Bucket('Bucket_name')。下载_文件('hello.txt','/tmp

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

我已创建了一个具有允许读写策略的访问点(
是我的访问点
ARN
):

当我在附加了
AmazonS3FullAccess
managed策略的Lambda中执行此代码时,我收到一个
ClientError:调用HeadObject操作时发生错误(403):禁止

Lambda和S3接入点都连接到同一VPC。

替换

“资源”:“arn:aws:s3:区域名称::桶名称”
s3.Bucket('Bucket_name')。下载_文件('hello.txt','/tmp/hello.txt'))


希望它有帮助…

我的第一个猜测是,您缺少必须定义的权限(1)在bucket(bucket策略)上,以及(2)在boto3 SDK中使用的IAM用户或角色上

(1) 从照片上我可以看出

为了让应用程序或用户能够通过访问点访问对象,访问点和底层bucket都必须允许请求

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

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

进一步说明:我想你

  • 未限制接入点仅在特定专有网络内可用
  • 正在阻止公众访问

您的AWS Lambda功能是否连接到VPC?接入点是否已连接到互联网或专有网络?分配给Lambda函数的IAM角色是否具有访问bucket的权限(您能否向我们展示策略)?请编辑您的问题以添加这些详细信息,以便我们可以尝试重现这种情况。感谢联系@JohnRotenstein!我已经更新了描述-Lambda和S3接入点都连接到同一个VPC。我还更新了策略代码,因为我正在使用的策略代码有以下资源条目——“资源”:“/object/*”。Lambda附带了托管
AmazonS3FullAccess
策略,我认为该策略将赋予它所有必要的权限。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject", "s3:PutObject"],
            "Resource": "<access_point_arn>/object/*"
    ]
}
import boto3
s3 = boto3.resource('s3')
s3.Bucket('<access_point_arn>').download_file('hello.txt', '/tmp/hello.txt')