【发布时间】:2022-03-23 23:21:20
【问题描述】:
我在尝试调用s3.download_file 时收到"errorMessage": "An error occurred (403) when calling the HeadObject operation: Forbidden"(请参阅下面的代码)。
我查看了很多帖子,但似乎没有一个是从我的问题所在的 AWS Lambda 调用的。
我的代码在我的机器上本地运行,所以我猜测问题涉及 Lambda。这个 Lambda 函数最终会被 S3 事件触发,但是在测试过程中,它不起作用。
我的 IAM 用户拥有对 S3 和 Lambda 的完全访问权限。
AWS Lambda 函数代码:
import json
import boto3
import logging
log = logging.getLogger()
log.setLevel(logging.INFO)
s3 = boto3.client('s3')
def lambda_handler(event, context):
document_name = event['Records'][0]['s3']['object']['key']
bucket = event['Records'][0]['s3']['bucket']['name']
log.info('Performing stuff on {}/{}'.format(bucket, document_name))
# download the file
s3.download_file(
Bucket=bucket,
Key=document_name,
Filename=document_name
)
log.info('here it is!')
return event
(我什至尝试将信息显式输入s3.download_file,而不是从event 获取,但无济于事。日志消息确认它是正确的路径。)
在测试事件配置中传递的参数:
...
"s3": {
...
"bucket": {
"name": "bucket-name",
...
"object": {
"key": "filename.pdf",
本地机器上的代码:
import boto3
s3 = boto3.client('s3')
s3.download_file(
Bucket='bucket-name',
Key='filename.pdf',
Filename='filename.pdf'
)
我希望文件能够正确下载,就像我在我的机器上测试代码时一样。
【问题讨论】:
-
这似乎是凭据问题,仅出于测试目的尝试硬编码密钥。喜欢
client= boto3.client('s3', aws_access_key_id='AKIAIO5FODNN7EXAMPLE', aws_secret_access_key='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE')虽然不推荐。 -
@RedBoy 谢谢,也可能是 Lambda 函数中的 boto3 版本,我也遇到过其他奇怪的问题
-
我建议暂时放置密钥的唯一原因,因为使用相同的代码,您可以在本地执行,并且在本地它从 user_home/.aws 文件中读取。因此在执行 Lambada 时它可能无法读取。
标签: amazon-web-services amazon-s3 aws-lambda boto3 amazon-iam