我一直在尝试编写一个小脚本来下载到lambda / tmp S3文件夹的所有内容。为此,我需要列出特定存储桶中的所有对象。不幸的是,我一直收到以下错误;
An error occurred (403) when calling the HeadObject operation: Forbidden
以下是我尝试从文件夹下载所有文件的方法:
#initialize S3
try:
s3 = boto3.resource('s3',
aws_access_key_id=os.getenv('S3USERACCESSKEY'),
aws_secret_access_key=os.getenv('S3USERSECRETKEY')
)
s3_client = boto3.client('s3',
aws_access_key_id=os.getenv('S3USERACCESSKEY'),
aws_secret_access_key=os.getenv('S3USERSECRETKEY')
)
except Exception as e:
logger.error("Could not connect to s3 bucket: " + str(e))
#Function to download whole folders from s3
for s3_key in s3_client.list_objects(Bucket=os.getenv('S3BUCKETNAME'))['Contents']:
s3_object = s3_key['Key']
if not s3_object.endswith("/"):
s3_client.download_file('bucket', s3_object, s3_object)
else:
import os
if not os.path.exists(s3_object):
os.makedirs(s3_object)
修改
删除我的手动密钥后仍然没有成功,这是我附加到Lambda的权利:
以下是来自cloudwatch的实际错误:
现在代码如下:
#initialize S3
try:
s3 = boto3.resource('s3')
s3_client = boto3.client('s3')
except Exception as e:
[....]
似乎“禁止”可能是另一个问题,然后许可,但我找不到任何文档。
答案 0 :(得分:0)
确保访问密钥属于具有访问s3存储桶权限的IAM角色的用户。 如果你从lambda运行,那么就不需要使用访问密钥,只需将IAM角色附加到lambda
https://docs.aws.amazon.com/lambda/latest/dg/accessing-resources.html
你导入boto了吗? 尝试仅运行执行:
<强>更新强>
import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
print(bucket.name)