iT邦幫忙

2021 iThome 鐵人賽

1
AI & Data

觀賞魚辨識的YOLO全餐系列 第 31

Day 31 - 使用 Amazon API Gateway 上傳圖片到 S3

Day 31 - 使用 Amazon API Gateway 上傳圖片到 S3

  1. 建立 S3 儲存貯體 (bucket),關閉封鎖所有公開存取權,並設定一個資料夾允許對外公開讀取。
  2. 建立 IAM 的角色:具備執行 Amazon API Gateway 的許可,而且擁有存取 CloudWatch Logs 許可以及讀寫 S3 存取桶的許可。
  3. 建立 Amazon API Gateway 設定使用 PUT 方法上傳。

建立 S3 儲存貯體

進入 Amazon S3 管理控制台,單擊左手邊的 儲存貯體,接著單擊 建立儲存貯體 按鈕來新增儲存桶,注意一下最上方的顯示,儲存貯體的管理是全域的,但是建立時還是需要指定所在地域。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510WR88uXiyuA.png
圖 1、Amazon S3 管理控制台

儲存貯體的配置如下:

儲存貯體名稱: yehfishbucket # 儲存貯體名稱必須是全域唯一的而且不得跟他人重複。
AWS 區域: ap-southeast-1 # 根據用戶的所在地域來挑選
封鎖所有公開存取權: 不勾選
我確認目前的設定可能導致此儲存貯體和其內的物件變成公開狀態: 勾選

https://ithelp.ithome.com.tw/upload/images/20211005/20129510ue45oZJtL8.png
圖 2、建立儲存貯體的配置

建立完 yehfishbucket 這個儲存貯體後,記得修改它的儲存貯體政策,因為如果打算上傳的圖片是要提供給一般使用者瀏覽的,那必須設定成對外公開,所以我們設定儲存貯體其中一個資料夾具有這樣的讀取政策,如下圖所示,進如 yehfishbucket 儲存貯體的組態畫面中,單擊 許可 頁籤,找到最下方的儲存貯體政策,單擊 編輯,並將底下政策複製上去,就可以讓以後每個放在 upload 這個資料夾的檔案都具有公開讀取的許可了。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject","s3:GetObjectVersion"],
      "Resource":["arn:aws:s3:::yehfishbucket/upload/*"]
    }
  ]
}

https://ithelp.ithome.com.tw/upload/images/20211005/20129510lkInz2hOTY.png
圖 3、建立儲存貯體的配置

記得要建立 upload 資料夾,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510uVbTq9jCs0.png
圖 4、建立 upload 資料夾

建立 IAM 的角色

建立一個新角色,作為存取 S3 的許可,進入 IAM 管理控制台,在左手邊的功能導覽列中選擇角色,接著在右手邊的主畫面中單擊 建立角色,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510us4ceIbtKB.png
圖 5、建立 IAM 角色

首先是選擇信任的實體類型,選擇 API Gateway ,這是指允許這一個 AWS 服務來擔任這個角色,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510REUTmlCNhn.png
圖 6、替角色選擇信任的實體類型

接著是這個角色得到什麼許可 (permission),也就是說,它可以存取哪些 AWS 的資源,這個角色至少需要兩個許可,一個是除錯用,所以要能夠存取 CloudWatch Logs 的許可;另一個則是執行任務用,需要能存取 S3 ,而且需要指定是哪一個儲存貯體,且能被許可的操作。在新增角色時,只會連接基本的許可,那就是存取 CloudWatch Logs 的許可,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510jRrZAZInAx.png
圖 7、連接 CloudWatch Logs 的許可

最後再檢閱畫面中輸入角色名稱 APIGateway2S3Role ,在單擊 建立角色 即可,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510fguzkiTYUo.png
圖 8、新增角色 APIGateway2S3Role

新增完角色後,在角色列表中,找出 APIGateway2S3Role 這個角色,單擊這個角色以進入配置畫面,選擇 許可 頁籤,單擊 連接政策 按鈕,好進行政策的編修,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510uJJg5S4bBS.png
圖 9、新增角色連接政策

單擊上方的 建立政策 按鈕,如下圖所示。會開啟新的標籤頁,該標籤頁是作為建立政策之用,並非連接政策許可,所以記得保留此標籤頁。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510G1oiCoLeIZ.png
圖 10、建立自製的政策

在建立政策時需要配置服務、操作、資源和請求條件等四項內容,如下圖所示。這次的目標是將圖片放置到 S3 中,所以服務選擇 S3 ;需要的操作其實只有將圖片檔案放入 S3 中,但因為考量到可能需要檢查是否有重複上傳以及需要修改上傳後的權限 (access control list, ACL),所以設定三個操作權限,分別是 GetObject, PutObject, PutObjectAcl ;而我們操作的資源就是先前建立的 yehfishbucket 儲存貯體,可以透過 新增 ARN 開啟設定畫面,ARN 是 Amazon Resource Name 的縮寫,這是用來存取 Amazon 資源的一個指標,很常會用到。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510xBrQF6hOt2.png
圖 11、政策指定包含服務、操作、資源和請求條件

下圖是點擊 新增 ARN 後出來的畫面,只要輸入 Bucket name : yehfishbucket,並在 Object name 後方的勾選方塊中進行勾選,系統會自動填入 指定 object 的 ARN 的文字方框。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510GILDIEI41u.png
圖 12、指定 S3 資源的 ARN

下圖是系統實際上接收到的 JSON 格式的政策規範。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510gkMkoVovzp.png
圖 13、以 JSON 形式來顯示政策規範

設定無誤後,只要輸入政策名稱即可 APIGateway2yehfishbucket_Policy,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510y3v88bX7h1.png
圖 14、新增政策

https://ithelp.ithome.com.tw/upload/images/20211005/20129510G3yI4cde90.png
圖 15、連接政策許可

https://ithelp.ithome.com.tw/upload/images/20211005/20129510riUg8rbfQZ.png
圖 16、確認角色連接政策的設定

建立 Amazon API Gateway

進入 Amazon API Gateway 管理控制台介面,確認左手邊的功能導覽選單為 API 後,點擊右手邊的 建立 API 按鈕,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/201295101YUxJw2YqZ.png
圖 17、Amazon API Gateway 管理控制台介面

在 建立 API 畫面中,選擇 REST API 類型,並點擊 建置 按鈕,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510cM167yupwk.png
圖 18、選擇 API 類型

接著選擇通訊協定,組態設定如下所示,設定完畢後,點擊 建立 API 按鈕,如下圖所示。

  • 選取您想要建立 REST API 還是 WebSocket API: REST
  • 建立新的 API: 新 API
  • API 名稱 : uploadImg2S3
  • 描述: Upload images to S3 bucket
  • 端點類型: 區域性

https://ithelp.ithome.com.tw/upload/images/20211005/201295109Bp6guuM7V.png
圖 19、選擇通訊協定畫面

開始設定 API 的資源,在 / 目錄下,點擊 操作 選單中,選擇 建立資源,設定如下:

  • 資源名稱* : folder
  • 資源路徑* :/ {folder}

設定完畢後點擊 建立資源 按鈕,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510NKPGriEp33.png
圖 20、建立 folder 資源

/{folder} 目錄下,點擊 操作 選單中,選擇 建立資源,設定如下:

  • 資源名稱* : object
  • 資源路徑* :/{folder}/ {object}

設定完畢後點擊 建立資源 按鈕,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510T99HdZEtuY.png
圖 21、建立 object 資源

/{object} 目錄下,點擊 操作 選單中,選擇 建立方法,設定如下:

  • 整合類型: AWS 服務
  • AWS 區域: ap-southeast-1 # 指的是上面所整合的 AWS 服務的所在區域,因為 API Gateway 本來就是區域性的,不需要在這裡重新指定
  • AWS 服務: Simple Storage Service (S3)
  • HTTP 方法: PUT
  • 動作類型: 使用路徑覆寫
  • 路徑覆寫 (選擇性): {bucket}/{key} # 很重要
  • 執行角色: arn:aws:iam::950646218716:role/APIGateway2S3Role # 這是上一個步驟所建立的角色,必須指定 ARN
  • 內容處理: 傳遞

設定完畢後點擊 儲存 按鈕,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510xlWX2O34YK.png
圖 22、在 object 資源下建立 PUT 方法

建立好 PUT 方法後,會出現以下這個畫面,Day 30 - 實作 Amazon API GateWay 整合 AWS Lambda 與 Dynamodb 這篇文章有介紹 API Gateway 和 AWS 服務的整合架構,這裡需要設定整合請求,將 PUT 請求的參數,轉換為 S3 的參數。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510g6uQ9GONkt.png
圖 23、確認角色連接政策的設定

進入整合請求畫面後,請在 URL 路徑參數中進行設定,S3 存取的方式是要指定儲存貯體 (bucket) 與要存放的檔案名稱 (key),而透過 PUT 方法傳進來的參數則分別是 folder 和 object,所以在這個畫面中進行設定,如下圖所示。

  • bucket: method.request.path.folder
  • key: method.request.path.object

https://ithelp.ithome.com.tw/upload/images/20211005/201295105dMZnHd8kU.png
圖 24、整合請求進行 URL 路徑參數設定

接著在左走邊的功能選單中,點選 設定,進行二進位媒體類型的設定,為了讓各種形態的文件都可以上傳,所以選擇 */* (所有類型),如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/2012951032sjfT40Zc.png
圖 25、二進位媒體類型的設定

所以設定完畢後,要將這個 API Gateway 部署起來,讓所有人可以使用,在資源 / 中,點擊 操作 選單,選擇 部署 API,在彈出畫面中,設定如下:

  • 部署階段: 新階段
  • 階段名稱: v1 # 自定

設定完成後,點擊 部署 即可,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510O8kkPIVe4H.png
圖 26、部署 API

部署成功後可以在階段選單中,找到呼叫的 URL ,如下圖所示

https://ithelp.ithome.com.tw/upload/images/20211005/20129510vzGnXWioFR.png
圖 27、部署成功後的呼叫 URL

接著只要在 Advanced REST Client (ARC)中進行測試就可以,如下圖所示,選擇 PUT 方法;網址列中除了 API Gateway 的呼叫 URL 外,還要加上 S3 的儲存貯體的名稱 yehfishbucket,以及要存放的檔名 123.jpg;在 BODY 頁籤中,選擇 FILE 類型,選擇一個檔案,注意必須要是 jpg 格式,因為存檔的檔名已經命名為 123.jpg 了,最後按下送出即可,觀察回應 (Response) 訊息是 200,那表示以將成功執行。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510V1n7oBgY9d.png
圖 28、確認角色連接政策的設定

來到 S3 控制台,可以發現檔案已經成功上傳,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20211005/20129510cYCEOT6odF.png
圖 29、確認角色連接政策的設定

參考資料


上一篇
Day 30 - 實作 Amazon API GateWay 整合 AWS Lambda 與 Dynamodb
下一篇
Day 32 - 透過手機呼叫 Amazon API Gateway 上傳圖片到 S3
系列文
觀賞魚辨識的YOLO全餐38

尚未有邦友留言

立即登入留言