在本文中,我們將討論在從AWS S3存儲請求具有大小參數(寬度/高度)的原始圖像大小之后創建不同的圖像大小。
圖像對於創建引人入勝的用戶體驗至關重要,可能需要更多努力將大型和高分辨率圖像集成到用戶界面中,但問題在於它們會降低整個網頁的下載速度。想象一下,你有一個博客網站,大多數讀者都在手機上查看你的網站,在這種情況下,他們不需要高分辨率的圖片,這可能會減慢下載整個內容,這對你的讀者不利,並且他們中的一些人正在閱讀他們的筆記本電腦,他們有更好的連接和更好的屏幕,因此將欣賞更高質量的圖像。
本文的主要目的是向您展示如何僅使用AWS lambda函數,這意味着不需要服務器(EC2實例)來創建圖像大小調整任務。當通過API網關端點從s3存儲桶加載圖像時,將觸發lambda函數,該函數將根據指定的大小調整圖像大小(如果存儲桶中不存在指定大小的圖像),它將返回已調整大小的圖片網址。
目錄
- 建築
- Lambda函數配置
- 上傳源代碼
- API網關配置
- 測試
建築
因此,本教程將指導我們如何使用AWS Lambda,API Gateway和S3實現簡單的圖像大小調整任務。

- 用戶將使用圖像大小參數(寬度/高度)向API網關發送請求,以便接收已調整大小的圖像的s3 URL,
- API網關請求將觸發lambda函數,
- 這將檢查具有給定大小的圖像是否存在,
- 如果它這樣做,將返回圖像s3 URL,
- 否則它將從s3獲取原始圖像,使用給定大小調整大小並返回圖像s3 URL。
Lambda函數配置
首先,我們假設您已經創建了一個s3存儲桶和API網關實例,因此調整lambda函數的圖像將至少需要這些配置:
- 執行角色:AWS S3完全訪問權限和AWS基本執行角色
Lambda函數配置執行角色
- 基本設置:超時20秒
- 使用現有API向lambda函數添加API網關觸發器
Lambda函數配置Lambda觸發器
上傳源代碼
我們將使用Python編程語言來構建調整lambda函數的圖像,
消息代碼:https://github.com/obytes/resize_s3_imageshttps :// github 。com / obytes / resize _ s3 _ images
讓我們從解釋源代碼開始:
def lambda_handler(event, context): key = event['queryStringParameters'].get('key', None) size = event['queryStringParameters'].get('size', None) image_s3_url = resize_image(os.environ['BUCKET'], key, size) return { 'statusCode': 301, 'body': image_s3_url }
lambda_handler
當我們的lambda函數被要調整大小的圖像的新傳入請求觸發時,將調用它。它從請求路徑獲取key
和size
參數,然后它resize_image
使用前面的參數和s3存儲桶名稱調用該函數,以便獲得新調整大小的圖像的位置。
現在讓我們深入了解我們的resize_image
功能,首先它從給定的s3存儲桶中獲取原始數據(如果存在):
def resize_image(bucket_name, key, size): size_split = size.split('x') s3 = boto3.resource('s3') obj = s3.Object( bucket_name=bucket_name, key=key, ) obj_body = obj.get()['Body'].read()
其次,它使用PILLOW
包調整圖像大小:
img = Image.open(BytesIO(obj_body)) img = img.resize((int(size_split[0]), int(size_split[1])), PIL.Image.ANTIALIAS) buffer = BytesIO() img.save(buffer, 'JPEG') buffer.seek(0)
最后,它將調整大小的圖像上傳回s3,並返回其URL:
resized_key="{size}_{key}".format(size=size, key=key) obj = s3.Object( bucket_name=bucket_name, key=resized_key ) obj.put(Body=buffer, ContentType='image/jpeg') return "https://{bucket}.s3.amazonaws.com/{resized_key}".format(bucket=bucket_name, resized_key=resized_key)
如果我們試圖創建部署包,並把它上傳到拉姆達就像是在AWS記錄在這里,它不會工作,因為我們可以看到,它依賴於 PIL,用於處理圖像庫,它不是拉姆達環境也不是標准的Python庫。我們該如何解決這個問題?使用Python車輪! 輪子 是python發行的新標准。它創建了隨時可以運行的Wheels包。由於Lambda在Amazon Linux Distribution上運行,我們可以嘗試 這個 版本。下載后,在與resize_s3_images.py
文件相同的目錄中解 壓縮並將其全部壓縮!
$ ls Pillow-6.1.0-cp36-cp36m-manylinux1_x86_64.whl resize_s3_images.py $ unzip Pillow-6.1.0-cp36-cp36m-manylinux1_x86_64.whl && rm Pillow-6.1.0-cp36-cp36m-manylinux1_x86_64.whl $ zip -r resize_s3_images.zip .
在AWS Lambda儀表板上載壓縮文件 resize_s3_images.zip
上傳源代碼
API網關配置
接下來,是時候設置api網關端點了:
- 根路徑
/
- 稱為根路徑中的資源
/resize
- 上一個資源中的GET方法應該與我們之前創建的lambda函數集成
- 為先前的http GET方法啟用CORS
API網關配置
您應該部署API以使整個更改生效
測試
現在我們已經為我們的圖像調整lambda函數構建了所需的一切,讓我們使用cURL測試它。
測試...