使用AWS Lambda,API Gateway和S3 Storage快速調整圖片大小


https://www.obytes.com/blog/2019/image-resizing-on-the-fly-with-aws-lambda,-api-gateway,-and-s3-storage/

在本文中,我們將討論在從AWS S3存儲請求具有大小參數(寬度/高度)的原始圖像大小之后創建不同的圖像大小。

圖像對於創建引人入勝的用戶體驗至關重要,可能需要更多努力將大型和高分辨率圖像集成到用戶界面中,但問題在於它們會降低整個網頁的下載速度。想象一下,你有一個博客網站,大多數讀者都在手機上查看你的網站,在這種情況下,他們不需要高分辨率的圖片,這可能會減慢下載整個內容,這對你的讀者不利,並且他們中的一些人正在閱讀他們的筆記本電腦,他們有更好的連接和更好的屏幕,因此將欣賞更高質量的圖像。

本文的主要目的是向您展示如何僅使用AWS lambda函數,這意味着不需要服務器(EC2實例)來創建圖像大小調整任務。當通過API網關端點從s3存儲桶加載圖像時,將觸發lambda函數,該函數將根據指定的大小調整圖像大小(如果存儲桶中不存在指定大小的圖像),它將返回已調整大小的圖片網址。

目錄

  1. 建築
  2. Lambda函數配置
  3. 上傳源代碼
  4. API網關配置
  5. 測試

建築

因此,本教程將指導我們如何使用AWS Lambda,API Gateway和S3實現簡單的圖像大小調整任務。

建築圖 建築圖
  1. 用戶將使用圖像大小參數(寬度/高度)向API網關發送請求,以便接收已調整大小的圖像的s3 URL,
  2. API網關請求將觸發lambda函數,
  3. 這將檢查具有給定大小的圖像是否存在,
  4. 如果它這樣做,將返回圖像s3 URL,
  5. 否則它將從s3獲取原始圖像,使用給定大小調整大小並返回圖像s3 URL。

Lambda函數配置

首先,我們假設您已經創建了一個s3存儲桶和API網關實例,因此調整lambda函數的圖像將至少需要這些配置:

  • 執行角色:AWS S3完全訪問權限和AWS基本執行角色

Lambda函數配置執行角色Lambda函數配置執行角色

  • 基本設置:超時20秒
  • 使用現有API向lambda函數添加API網關觸發器

Lambda函數配置Lambda觸發器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函數被要調整大小的圖像的新傳入請求觸發時將調用它。從請求路徑獲取keysize參數,然后它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網關配置

您應該部署API以使整個更改生效

測試

現在我們已經為我們的圖像調整lambda函數構建了所需的一切,讓我們使用cURL測試它

測試gif測試...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM