python-3.x - 使用 lambda 函数调整图像大小并将其从一个 s3 移动到另一个 s3
问题描述
我想做的事
- 我有 3 个桶。当图像上传到 bucket1 时,我想触发 lambda 函数。
- lambda 函数将调整该图像的大小 (500x500) 并将调整后的图像保存在 bucket2 中。
- bucket1 上的主镜像会备份到 bucket3 中。
- 然后bucket1上的主图像将被删除。
到目前为止我做了什么
编写了一个 lambda 函数,它将在存储桶中移动图像。
使 S3 触发 lambda 函数
我的问题在哪里
我正在使用 PIL 来调整图像大小。但是 PIL 模块不在 python STL 中。所以我用站点包压缩了我的代码并能够运行。但是错误说找不到文件。文件密钥 image/myimage.jpg 的示例
虽然我遵循了教程,但如果我尝试使用 lambda 层而不是每次都压缩,似乎找不到 PIL 模块。
代码
import boto3
import os
import sys
import uuid
from PIL import Image
import PIL.Image
s3_client = boto3.client('s3')
def resize_image(image_path, resized_path):
with Image.open(image_path) as image:
image.thumbnail((500, 500))
image.save(resized_path)
def lambda_handler(event, context):
#
# giving a key error here event['Records']
#
for record in event['Records']:
bucket = 'mahabubelahibucket1'
key = record['s3']['object']['key']
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, 'mahabubelahibucket2', key)
解决方案
这是我解决问题的方法!
import boto3
import os
from PIL import Image
import pathlib
from io import BytesIO
s3 = boto3.resource('s3')
def delete_this_bucket(name):
bucket = s3.Bucket(name)
for key in bucket.objects.all():
try:
key.delete()
bucket.delete()
except Exception as e:
print("SOMETHING IS BROKEN !!")
def create_this_bucket(name, location):
try:
s3.create_bucket(
Bucket=name,
CreateBucketConfiguration={
'LocationConstraint': location
}
)
except Exception as e:
print(e)
def upload_test_images(name):
for each in os.listdir('./testimage'):
try:
file = os.path.abspath(each)
s3.Bucket(name).upload_file(file, each)
except Exception as e:
print(e)
def copy_to_other_bucket(src, des, key):
try:
copy_source = {
'Bucket': src,
'Key': key
}
bucket = s3.Bucket(des)
bucket.copy(copy_source, key)
except Exception as e:
print(e)
def resize_image(src_bucket, des_bucket):
size = 500, 500
bucket = s3.Bucket(src_bucket)
in_mem_file = BytesIO()
client = boto3.client('s3')
for obj in bucket.objects.all():
file_byte_string = client.get_object(Bucket=src_bucket, Key=obj.key)['Body'].read()
im = Image.open(BytesIO(file_byte_string))
im.thumbnail(size, Image.ANTIALIAS)
# ISSUE : https://stackoverflow.com/questions/4228530/pil-thumbnail-is-rotating-my-image
im.save(in_mem_file, format=im.format)
in_mem_file.seek(0)
response = client.put_object(
Body=in_mem_file,
Bucket=des_bucket,
Key='resized_' + obj.key
)
def lambda_handler(event, context):
bucket = s3.Bucket('myimagebucket0099')
for obj in bucket.objects.all():
copy_to_other_bucket(bucket, 'backupimagebucket0099', obj.key)
resize_image(bucket.name, 'resizedimagebucket0099')
print(bucket)
推荐阅读
- python - 用 selenium 下载“401 Unauthorized”视频
- ajax - 局部视图中带有模态绑定的 Ajax 模态弹出窗口
- prolog - WAM Prolog 有符号表吗?
- javascript - 无法在 Firefox 上并排放置 div,但可以在 Chrome 上使用
- c++ - glEnableVertexArrayAttrib 抛出无效大小
- swift - 如何在 MacOS 上覆盖 NSButton 的 mouseDragged() 函数?
- c# - Linux 上 ASP.Net Core Web API 中未处理的异常
- javascript - 错误:无效的 LatLng 对象:(54,未定义)
- python-3.x - 如何将列表中的元素拆分为数据框的不同列?
- python - 如何解决图像的非最大抑制