【AWS】S3縮圖 ImageResize 架構

31 3月, 2018

【AWS】S3縮圖 ImageResize 架構








※需求:需要能夠對S3圖床上的圖片進行縮圖

AWS相關組件: S3,APIGetWay,Lambda


 要達成自動縮圖,有以下二種架構機制:

 (1)強制自動縮圖
 文章:https://www.bypeopletechnologies.com/blog/2017/05/01/serverless-image-resizing-aws-lambda-and-aws-s3/
 原理:當圖片進入S3的時候,觸發了S3的PUT事件,透過Lambda將圖片強制進行一份縮小的圖片
 缺點:只要S3有圖片近來,則強制產生同樣的一份縮圖,就算沒有使用也會產生

 (2)自定義縮圖
文章:https://aws.amazon.com/tw/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/
原理:使用者使用縮圖的URI,如果找不到縮小的圖片,會直接透過s3的proxy規則重定向到Lambda,再將圖片縮小後,重新導回縮小後的URI,如果一開始就有找到,則後續的proxy的重定向則不會運行。


以上述兩種架構都試做過,
其實並無分優劣,端看需求而定而已。
只是2的方法能夠更有效率的使用資源,而不會造成多餘的浪費。

下述先以  (2)自定義縮圖 來做實作,
由於此方法彈性佳,並且也不會浪費多餘的資源。
一些 平台類似FB的縮圖都很類似此種縮圖作法。


 ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※


詳細架構跟做法:(AWS規劃師)
https://aws.amazon.com/tw/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/

由於文中已經有很清楚的作法跟流程,這裡就不在多做贅述。
照著做就可以完成。

這文章是紀錄理清楚作法流程的意義


實際效果:
 S3原本的圖片的URI如下
 http://YOUR_BUCKET_WEBSITE_HOSTNAME_HERE/blue_marble.jpg


 http://YOUR_BUCKET_WEBSITE_HOSTNAME_HERE/300×300/blue_marble.jpg
 http://YOUR_BUCKET_WEBSITE_HOSTNAME_HERE/25×25/blue_marble.jpg
只要加上對應的參數,即可動態的產生縮圖。並且不需要額外的SERVER來幫助(譬如PHP)


原理
  
範例:

原始圖片
http://{YOUR_BUCKET_WEBSITE_HOSTNAME}/abc.jpg
預計縮圖(100X100)
http://{YOUR_BUCKET_WEBSITE_HOSTNAME}/100x100/abc.jpg

(一)前端呼叫圖片URI ,檔案不存在
使用者在呼叫圖片網址的時候
 http://{YOUR_BUCKET_WEBSITE_HOSTNAME}/100x100/abc.jpg
由於S3的圖床上並未這張圖,此時就會觸發了(二)S3 static website的proxy功能
如果已經有這張縮圖的話,則直接顯示,並不會觸發(二)之後的流程

 
 (二)S3 Website proxy Rule(重定向規則)
static website proxy的這時候會聽到404(檔案不存在)的事件
作者在website的proxy規則裡面增加了404的這條規則,
將404重定位到AWS APIGETWAY,並將圖片的位置以「?key=」將參數帶入到APIGETWAY
(這也是為什麼作者,一定要將s3開啟static website,將uri走static website uri的主要原因)


 (三)API GetWay + Lambda
此時網址已經被重定到APIGETWAY
假設你創建的API如下 http://{YOUR_API_HOSTNAME}/prod/resize?key=
API此時會長這樣  http://{YOUR_API_HOSTNAME}/prod/resize?key={100x100/abc.jpg}
將圖片位置帶入,而作者在APIGetway裡,有接入lambda 
此時lambda就得知圖片的位置,並且將圖片直接進行縮圖,在進行轉址。

 (四)Lambda轉址
 lambda縮圖完後,進行轉址,就會回到原先使用者輸入的uri
 http://{YOUR_BUCKET_WEBSITE_HOSTNAME}/100x100/abc.jpg
 此時就能正確的讀取到縮完圖後的圖片


事後小記
看似不起眼的縮圖,卻發揮了Serverless的精神
並且有效及充分的利用資源,有使用到縮圖,才會產生
 
當然這個架構還是有很多地方可以再做升級的

像是增加aws的STS功能(TOKEN權限)
PS.仔細看FB的縮圖,後面有的都是帶有權限的

 



張貼留言