如果存储桶的区域名称与 lambda 不在同一区域,则您必须显式传递它的区域名称(因为 AWS 具有 S3 的区域特定端点,在使用 s3 api 时需要显式查询)。
将您的 boto3 S3 客户端初始化为:
import boto3
client = boto3.client('s3', region_name='region_name where bucket is')
查看此以获取 boto3 客户端的完整参考:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html#boto3.session.Session.client
---------已编辑------------
您还需要将以下策略附加到(或内联)您的 lambda 角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExampleStmt",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::YOUR-BUCKET-NAME/*"
]
}
]
}
如果您还需要列出和删除对象,那么您需要改为使用以下策略,附加到(或内联)lambda 的角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExampleStmt1",
"Action": [
"s3:GetObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::YOUR-BUCKET-NAME/*"
]
},
{
"Sid": "ExampleStmt2",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::YOUR-BUCKET-NAME"
]
}
]
}