【问题标题】:how to fix "ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden" when trying to download file in AWS Lambda function尝试在 AWS Lambda 函数中下载文件时如何修复“ClientError:调用 HeadObject 操作时发生错误(403):禁止”
【发布时间】: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


【解决方案1】:

我遇到了类似的问题,这是我的解决方案。当您在使用 AWS SDK 或 CLI 时遇到 403 错误,可能是因为权限和策略。

您可能已将 Bucket 的完整 S3 权限授予您的 Lambda 函数,但 lambda 无权访问存储桶内的对象,除非您明确指定。

只需对您的政策稍作改动即可解决问题。

# Change from this:
{
    "Sid": "VisualEditor1",
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::bucket-name"
}

# To this:
{
    "Sid": "VisualEditor1",
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": [
        "arn:aws:s3:::bucket-name/*",
        "arn:aws:s3:::bucket-name"
    ]
}

确保将此策略添加到您的 Lambda 函数角色。

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 2022-10-04
    • 2019-03-01
    • 2020-06-07
    • 2022-01-08
    • 2021-05-06
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多