Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

這節來學習一個經典的案例,這個案例我在三個不一樣的培訓視頻裏面都看見過,不知道最初的原創者是誰 :)python

和前面的幾個例子比較起來,思路實際上是大同小異的,惟一的區別在於兩點:linux

  1. 經過S3來觸發Lambda
  2. 對於AWS默認不包括的Python模塊,咱們須要手動上傳zip文件或者經過S3來導入

這個例子的流程簡單的說就是建立2個S3的bucket,在其中一個上傳照片,他會自動壓縮尺寸並保存在另一個bucket裏面。 下面來看看如何實現。json

首先建立2個bucket,一個source, 一個destinationide

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

而後建立對應的role函數

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

而後建立一個Lambda function,選擇上面配置的role學習

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

添加一個觸發器,這裏咱們指定S3的source bucket測試

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

接下來,是配置對應的函數code

import os
import tempfile

import boto3
from PIL import Image

s3 = boto3.client('s3')
DEST_BUCKET = os.environ['DEST_BUCKET']
SIZE = 128, 128

def lambda_handler(event, context):

    for record in event['Records']:
        source_bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        thumb = 'thumb-' + key
        with tempfile.TemporaryDirectory() as tmpdir:
            download_path = os.path.join(tmpdir, key)
            upload_path = os.path.join(tmpdir, thumb)
            s3.download_file(source_bucket, key, download_path)
            generate_thumbnail(download_path, upload_path)
            s3.upload_file(upload_path, DEST_BUCKET, thumb)

        print('Thumbnail image saved at {}/{}'.format(DEST_BUCKET, thumb))

def generate_thumbnail(source_path, dest_path):
    print('Generating thumbnail from:', source_path)
    with Image.open(source_path) as image:
        image.thumbnail(SIZE)
        image.save(dest_path)

注意!!!這個函數裏面咱們調用了Pillow這個圖片的模塊,可是這個模塊默認在aws的運行環境裏面是沒有的,所以咱們須要手動上傳。orm

首先從 https://pypi.org/project/Pillow/#files 上面下載對應的linux whl 文件,whl文件實際上是一個壓縮包,Windows 下面咱們能夠用 wheel unpack 解壓。若是在Linux環境下,能夠直接用unzip打開。視頻

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

而後把這個PIL文件夾和咱們的python文件一塊兒zip

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

而後上傳到Lambda的控制檯
Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

注意py文件和入口函數的名字要和handler匹配
Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

也別忘記了配置環境變量

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

咱們能夠經過測試模板來查看對應的事件的json格式

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

最後來看看運行效果

上傳幾個圖片

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

自動壓縮保存在另一個bucket裏面

Lambda,AWS和Python的自動化管理操做 - 自動Resize S3上傳的圖片

實驗成功

相關文章
相關標籤/搜索