尝试在 AWS Lambda 函数中下载文件时如何修复“ClientError:调用 HeadObject 操作时发生错误 (403):禁止”

Chu*_*ket 5 amazon-s3 amazon-web-services amazon-iam boto3 aws-lambda

我"errorMessage": "An error occurred (403) when calling the HeadObject operation: Forbidden"在尝试打电话时收到消息s3.download_file(请参阅下面的代码)。

我看过很多帖子,但似乎没有一个是从 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

Run Code Online (Sandbox Code Playgroud)

(我什至尝试显式输入信息s3.download_file而不是从 中获取信息event,但无济于事。日志消息确认它是正确的路径。)

测试事件配置中传递的参数:

...
"s3": {
  ...
  "bucket": {
    "name": "bucket-name",
  ...
  "object": {
    "key": "filename.pdf",
Run Code Online (Sandbox Code Playgroud)

本地机器上的代码:

import boto3

s3 = boto3.client('s3')

s3.download_file(
  Bucket='bucket-name',
  Key='filename.pdf',
  Filename='filename.pdf'
)
Run Code Online (Sandbox Code Playgroud)

我希望下载文件时不会出现错误,就像我在机器上测试代码时一样。

Ala*_*412 3

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

您可能已向 Lambda 函数授予存储桶的完整 S3 权限,但 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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

PS:要配置 Lambda 角色,您需要转到 Lambda 函数页面,然后在“配置”选项卡下,您将找到“权限”。单击“权限”,然后在右侧单击“执行角色”部分内的角色名称。它将打开用于修改 Lambda 角色的所需页面。然后,您可以编辑当前策略之一或添加具有权限的新策略。