某電商網(wǎng)站需要自動化處理用戶上傳到 Amazon S3 存儲桶上的高清商品圖片。要求的指標包括:自動壓縮圖片至 800 × 800 像素以內(nèi),降低存儲成本;壓縮后的圖片需存儲至指定S3桶,并保留原始路徑結(jié)構(gòu);
處理延遲需控制在1秒內(nèi),支持每日1萬張圖片處理。
采用 AWS Lambda + S3 架構(gòu)。
觸發(fā)機制:通過 S3 的 PUT 事件觸發(fā) Lambda 函數(shù)。
核心邏輯:使用 Python 的 Pillow 庫處理圖片,依賴Lambda的臨時存儲(/tmp 目錄)。
性能優(yōu)化:內(nèi)存配置為 1024 MB,縮短執(zhí)行時間至 0.5 秒;壓縮包精簡至 10 MB,避免冷啟動產(chǎn)生延遲。
本次采用 AWS Console 界面完成作業(yè)。
注意:根據(jù)項目的具體情況,可以采用不同的實施方法。比如使用命令行(CLI)部署、代碼部署 (CloudFomation、Terraform等)、以及其它開發(fā)語言(SDK)完成作業(yè)。
步驟一:創(chuàng)建 S3 存儲桶
在 AWS 控制臺創(chuàng)建兩個 S3 存儲桶,一個用于存儲原始圖片(如 original-images-bucket),另一個用于存儲壓縮后的圖片(如 compressed-images-bucket)。
步驟二:配置 Lambda 函數(shù)
創(chuàng)建 Lambda 函數(shù),選擇 Python 運行時。編寫代碼實現(xiàn)圖片壓縮邏輯,使用 Pillow 庫打開原始圖片,調(diào)整圖片質(zhì)量和尺寸進行壓縮,然后將壓縮后的圖片上傳到 compressed-images-bucket。
代碼實現(xiàn)(Python):
import boto3
from PIL import Image
def lambda_handler(event, context):
s3 = boto3.client('s3')
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
img = Image.open(s3.get_object(Bucket=bucket, Key=key)['Body'])
img.thumbnail((800, 800))
compressed_key = f"compressed/{key.split('/')[-1]}"
img.save(f"/tmp/{compressed_key}")
s3.upload_file(f"/tmp/{compressed_key}", bucket, compressed_key)
return {'statusCode': 200}
步驟三:依賴處理:本地安裝Pillow并打包至ZIP文件:
pip install pillow -t . zip -r lambda.zip .
步驟四:部署與配置
在 Lambda 控制臺創(chuàng)建函數(shù),上傳 ZIP 包;配置S3觸發(fā)器,指定輸入桶和PUT事件;設(shè)置內(nèi)存為 1024 MB,超時時間為 10 秒。
步驟五:監(jiān)控與優(yōu)化
啟用 CloudWatch Logs 記錄執(zhí)行日志;通過 X-Ray 分析調(diào)用鏈,發(fā)現(xiàn)S3調(diào)用延遲并優(yōu)化;設(shè)置錯誤告警(如錯誤率>5%)。
1. 功能測試
上傳測試圖片到 original-images-bucket,檢查 Lambda 函數(shù)是否成功執(zhí)行,壓縮后的圖片是否正確存儲到 compressed-images-bucket;驗證圖片尺寸是否符合要求(≤800×800)。
2. 性能測試
模擬 1000 張圖片上傳,記錄平均處理時間為 0.5 秒;成本估算:每日 1 萬張圖片,月成本約$1(基于 AWS Lambda 免費額度)。
3. 錯誤驗證
上傳非圖片文件或損壞的圖片文件,檢查日志是否記錄錯誤詳情。
4. 刪除資源
驗證結(jié)束后,刪除創(chuàng)建的所有 AWS 資源,以避免產(chǎn)生不必要的費用。