python - 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)
解决方案
原来我正在上传一些[
名称中带有括号的文件......
根据“要避免的字符”下的https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html,不建议这样做。
感谢可以通过 S3 REST API 访问的有效 S3 密钥名称是什么?指向我这个资源。
推荐阅读
- excel - 从一个工作簿复制和粘贴,然后使用查找功能
- javascript - 如何在A类内部调用A类的方法?
- javascript - 字符串中的子字符串以及多少解决方案
- javascript - 如何使用 Ionic 中的画布在照片顶部绘制照片然后绘制形状?
- r - 根据R中不同列内的值对列内的值进行排序
- haskell - 为什么高阶函数会返回此(意外)类型?
- database - 如何将 Diesel 与 SQLite 连接一起使用并避免“数据库已锁定”类型的错误
- java - JLS8。泛型类声明定义
- django - 如何查看用户在其用户序列化程序中发布的广告
- javascript - 为什么 JS 需要执行上下文