###### tags: `NTU Master Thesis` # AWS 設定 以下說明五個 AWS 服務,AWS IoT Core、IoT Analytics、S3、Lambda、Quicksight 的設定方法 ## IoT Core 按下 IoT Core 中的**建立實物**,照著上面的指示,建立名稱為 THING 的實物(該名稱是舉例,實際上可自由命名實物名稱)。接著,會有將政策 (Policy) 連接到憑證的指示文字出現。此時,為了讓實物有權限能上傳、儲存、刪除資料,需編寫下列 Json 形式的政策並連結到該實物上,以讓 AWS 知道要給 IoT Core 哪些權限。注意,以下 Json 裡的 THING 這個單詞,會隨著實物名稱而更改,切勿直接複製貼上,否則會有 error 產生 ![](https://i.imgur.com/RqRLRiD.png) ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": [ "arn:aws:iot:us-east-1:912429886604:client/THING/*" ] }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": [ "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/update", "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/delete", "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/get" ] }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": [ "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/update/accepted", "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/delete/accepted", "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/get/accepted", "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/update/rejected", "arn:aws:iot:us-east-1:912429886604:topic/$aws/things/THING/shadow/name/*/delete/rejected" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:us-east-1:912429886604:topicfilter/$aws/things/THING/shadow/name/*/update/accepted", "arn:aws:iot:us-east-1:912429886604:topicfilter/$aws/things/THING/shadow/name/*/delete/accepted", "arn:aws:iot:us-east-1:912429886604:topicfilter/$aws/things/THING/shadow/name/*/get/accepted", "arn:aws:iot:us-east-1:912429886604:topicfilter/$aws/things/THING/shadow/name/*/update/rejected", "arn:aws:iot:us-east-1:912429886604:topicfilter/$aws/things/THING/shadow/name/*/delete/rejected" ] }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": [ "arn:aws:iot:us-east-1:912429886604:thing/THING/*" ] } ] } ``` 新增完實物並且連接政策後,移動到訊息路由中的規則頁面,在這邊可以設定上傳到 IoT Core 的 Json 訊息去向。本研究是將 Json 訊息傳至 IoT Analytics 中。在設定規則時,要輸入以下 SQL 陳述式,以讓任何名稱的 deviceShadow 訊息都能傳到 IoT Analytics 中。注意,以下 SQL 指令的 THING 這個單詞,會隨著實物名稱而更改,切勿直接複製貼上 ```sql SELECT state.reported.* FROM "$aws/things/THING/shadow/name/+/update/accepted" ``` 如下圖所示,這是本研究使用的其中一個規則設定頁面 ![](https://i.imgur.com/82xsOiR.png) ## IoT Analytics 在 IoT Analytics 的頁面,要設定頻道、管道、資料存放區和資料集,方能順利地將資料送到 IoT Analytics 的資料存放區。有資料在資料存放區後,才能在下圖的資料集頁面中,設定 SQL 查詢指令,以生成 CSV 的檔案供程式下載或前端 Quicksight 抓取,SQL 指令如下 : ![](https://i.imgur.com/7uQODCX.png) ```sql SELECT Arktomato_Multi_PR_01_Temp, Arktomato_Multi_PR_01_Mois, Arktomato_Multi_PR_01_Time, Arktomato_Multi_PR_01_SD_Card_SDData, Arktomato_Multi_PR_02_Temp, Arktomato_Multi_PR_02_Mois, Arktomato_Multi_PR_02_Time, Arktomato_Multi_PR_02_SD_Card_SDData, Arktomato_Multi_PR_03_Temp, Arktomato_Multi_PR_03_Mois, Arktomato_Multi_PR_03_Time, Arktomato_Multi_PR_03_SD_Card_SDData, Arktomato_Multi_PR_04_Temp, Arktomato_Multi_PR_04_Mois, Arktomato_Multi_PR_04_Time, Arktomato_Multi_PR_04_SD_Card_SDData, Arktomato_Multi_TEROS_05_Temp, Arktomato_Multi_TEROS_05_VWC, Arktomato_Multi_TEROS_05_EC, Arktomato_Multi_TEROS_05_Time, Arktomato_Multi_TEROS_05_SD_Card_SDData, Arktomato_Multi_TEROS_06_Temp, Arktomato_Multi_TEROS_06_VWC, Arktomato_Multi_TEROS_06_EC, Arktomato_Multi_TEROS_06_Time, Arktomato_Multi_TEROS_06_SD_Card_SDData FROM arktomato_field_datastore ``` 以上指令完成後,便能抓取來自資料存放區內的各項資料,並將之成為 CSV 檔案中的各個 Coloums。後續若要在本地機器中分析資料,可以直接從 AWS 頁面載 CSV 資料下來、或是使用 AWS 的函式庫 boto3 下載資料 ## S3 (要有資料才能用,名稱:pestnodeimage) 於本研究當中,採用 S3 來儲存圖片形式的資料 (補充 : 圖片是藉由 boto3 上傳到 S3 中的)。值得注意的是,當 S3 物件要公開的話,也要寫 Json 形式的檔案,讓其他 AWS 服務能讀取儲存在 S3 中的物件。以下檔案中的 Resource 會隨著檔名結構有所更改,切勿直接複製貼上 ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::pestnodeimgdata/Lab405Rpi/video.png", "arn:aws:s3:::pestnodeimgdata/Shangsheng_Field/Node_01/Node_01.jpg", "arn:aws:s3:::pestnodeimgdata/Shangsheng_Field/Node_02/Node_02.jpg" ] } ] } ``` 下方便是更改 S3 物件權限的地方,需進到許可子分頁中才能看到相關設定 ![](https://i.imgur.com/S0bq8ek.png) ## Lambda Lambda 的程式放在實驗室雲端資料夾中,可查看之: https://bblab.bime.ntu.edu.tw/cloud/apps/files/?dir=/2_405_students/Master%20Students/R109/%E5%90%B3%E4%B9%99%E6%BE%A4/VMSM%E8%A8%AD%E8%A8%88/%E8%BB%9F%E9%AB%94/AWS%20Lambda&fileid=4081517#filestexteditor *P.S.若要新增 Quicksight (UI介面) 和 Line 警示,才會用到 Lambda* AWS Lambda 是一種無伺服器運算的服務,按下建立函式的按鈕後,能選擇程式語言的環境。以下舉 Python 為例子。見下方的程式碼, lambda_handler 是 Lambda 的主函數,類似 C++ 的 main()。本研究在 lambda_handler 中,以 boto3 的 API 去下載位於 IoT Analytics 和 S3 的感測器與圖片資料,並使用 AWS Layer 擴展出的 pandas 和 numpy 函數庫,對下載下來的資料做處理和分析 ```python def lambda_handler(event, context): ... ... ... return 1 ``` 編寫完 lambda_handler 函數後,如下圖,可以於組態頁面中的一般組態,更改該函數使用的記憶體量、處理的上限時間。並且,也能根據使用情況,設置 API Gateway、EventBridge 等觸發函數的方法 ![](https://i.imgur.com/lqdNPZt.png) 最後,值得注意的是,若要在 lambda_handler 中下載來自 IoT Analytics 和 S3 的感測器與圖片資料,需要給 Lambda 的 IAM 角色足夠的權限去讀取和寫入資料,否則執行 Lambda 函數時會有錯誤產生。以下是本研究在 IAM 服務中,某個 Lambda 角色的 JSON 權限設定檔,可供讀者參考。注意,以下 Json 檔案中的 Resource 會隨個人定義的檔案名稱而有所不同,切勿直接複製貼上 ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-east-1:912429886604:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-east-1:912429886604:log-group:/aws/lambda/Process_Envi_Data:*" ] }, { "Effect": "Allow", "Action": "iotanalytics:GetDatasetContent", "Resource": [ "arn:aws:iotanalytics:us-east-1:912429886604:dataset/shangsheng_field_dataset", "arn:aws:iotanalytics:us-east-1:912429886604:dataset/arktomato_field_dataset" ] }, { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::lambdaprocessdata", "arn:aws:s3:::lambdaprocessdata/*" ] } ] } ``` 如下圖所示,需要點入紅色框框內的連結,才會看到能修改權限的 Json 編輯器 ![](https://i.imgur.com/V7ZC5V4.png) ## Quicksight 在 AWS Quicksight 中,可以直覺地拉動圖塊、選擇資料集的屬性資料,進而編寫出精緻的 UI 介面 但是,在拉動圖塊,需要先匯入資料。於本研究中,匯入資料的方式有兩種 * 直接點選來自 IoT Analytics 的資料 * 透過上傳 Json 形式的檔案,將儲存在 S3 的 CSV 檔案連結到 Quicksight 中。其中,該 CSV 檔是透過 Lambda 處理過後的資料,處理包括最大、最小、平均值運算等等 第二種的 Json 格式如下所示。注意,以下 Json 檔案中的 URIs 會隨個人定義的檔案名稱而有所不同,切勿直接複製貼上 ```json { "fileLocations": [ { "URIs": [ "https://lambdaprocessdata.s3.amazonaws.com/ShangSheng_Soil_Uniformity_Data" ] } ], "globalUploadSettings": { "format": "CSV" } } ``` 如下圖所示,點選 S3 作為資料輸入後,會有頁面要求你上傳 Json 形式的檔案。該檔案的形式就是上方的 Json 格式編寫而成的檔案 ![](https://i.imgur.com/x55yXau.png)