首页 > 解决方案 > s3_client.head_object() 上的 lambda 重试失败

问题描述

我的 lambda 函数失败只是因为我仍在编写它并且我还没有放置任何代码来捕获错误......

但是我注意到在重试时,它的运行与第一次调用不同,它似乎失去了对某些数据的访问权限。

我正在使用Accessing Meta Data from AWS S3 with AWS Lambdaresponse = s3_client.head_object(Bucket=bucket, Key=key)所建议的访问元数据。

在第一次调用时,s3_client.head_object(...)返回正是我需要的。但是,当函数失败并且第二次调用运行时,我收到一个新错误:

[ERROR] ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
Traceback (most recent call last):
  File "/var/task/CreateThumbnail.py", line 25, in handler
    response = s3_client.head_object(Bucket=bucket, Key=key)
  File "/var/task/botocore/client.py", line 357, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/task/botocore/client.py", line 661, in _make_api_call
    raise error_class(parsed_response, operation_name)

为什么连续的调用会失去对此的访问权限?我已经验证我仍然得到相同的响应event,因此bucket等等key

奖励:还有其他获取元数据的方法吗?

编辑 1:这个 lambda 函数是通过 S3 POST 触发器调用的......
编辑 2:这实际上似乎只有 50% 的时间出错,放入 S3 的文件越多,错误就越多。几乎就像有一个缓存错误?

import boto3
import os
import sys
import uuid
from PIL import Image
import PIL.Image

s3_client = boto3.client('s3')
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def resize_image(image_path, resized_path):
    with Image.open(image_path) as image:
        image.thumbnail(tuple(x / 2 for x in image.size))
        image.save(resized_path)

def handler(event, context):
    logger.info(event)
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']

        response = s3_client.head_object(Bucket=bucket, Key=key)
        logger.info('Response: {}'.format(response))

        download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
        upload_path = '/tmp/resized-{}'.format(key)

        s3_client.download_file(bucket, key, download_path)
        resize_image(download_path, upload_path)
        s3_client.upload_file(upload_path, '{}resized'.format(bucket), key)

标签: pythonamazon-s3aws-lambdaboto3

解决方案


原来我正在上传一些[名称中带有括号的文件......

根据“要避免的字符”下的https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html,不建议这样做。

感谢可以通过 S3 REST API 访问的有效 S3 密钥名称是什么?指向我这个资源。


推荐阅读