基於 OpenWrt 作業系統下運行 AWS IoT GreenGrass Version 2

- 作者 -
詹東恩 (Tec Chan)
AWS IoT Solutions Architect

AWS IoT Greengrass Version 2 是一種開源物聯網 (Internet of Thing, IoT) 邊緣運行 (Edge Computing) 時和雲端服務 (Cloud Service),可協助您在設備上構建、部署和管理 IoT 應用程序。您可以使用 AWS IoT Greengrass Version 2 來建置軟體,使您的設備能夠對它們生成的數據進行本地操作、基於機器學習模型運行預測以及過濾和彙總設備數據。AWS IoT Greengrass Version 2 使您的設備能夠在距離數據生成位置更近的位置收集和分析數據,自主回應本地事件,並與本地網路上的其他設備進行安全通訊。運行 AWS IoT Greengrass Version 2 的設備還可以與 AWS IoT Core 進行安全的通訊,並將 IoT 數據導至 AWS 的雲端服務上。您可以使用 AWS IoT Greengrass Version 2 使用預先構建好的的軟體元件(稱之為Component)來建構邊緣應用程序,這些軟體元件可以將您的邊緣設備連接到AWS上的其他服務或第三方服務。您還可以使用 AWS IoT Greengrass Version 2 使用 Lambda 函數、Docke 容器、原生作業系統處理程序或您選擇的自訂程序來封裝和運行您的軟體。根據 AWS 官方文件,目前 AWS IoT Greengrass Version 2 所支援的硬體平台與作業系統 (Operating System, OS) 如下表所示。


CPU 架構 作業系統
Armv7l Linux
Armv8(AArch64) Linux
x86_64 Linux


下圖演示 AWS IoT Greengrass 的裝置是如何與 AWS IoT Greengrass 雲端服務以及其他 AWS 服務的互動。

而在廣大的嵌入式作業系統中,OpenWrt 是一個適合用於嵌入式裝置的一個 Linux 發行版本,目前市面上許多的嵌入式硬體平台皆採用以 OpenWrt 作為其基礎,例如路由器(Network Router)、網路閘道(Network Gateway)或工業用電腦,藉由在 OpenWrt 上運行 AWS IoT Greengrass Version 2,將使其在雲端上強大的功能帶至邊緣端設備。由於目前 AWS IoT Greengrass Version 2 尚未正式支援OpenWrt 上的運行,在本文中我將向您說明如何基於在 OpenWrt 作業系統下運行 AWS IoT Greengrass Version 2,並透過範例演示 AWS IoT Greengrass Version 2 強大的功能,其中搭配使用的硬體平台為 Raspberry Pi 4。

先決條件與事前準備
在您進行本文中的技術操作與範例演示之前,請先確認以下的開發環境與需求。
  1. 一台可以進行 OpenWrt 原始碼編譯的個人電腦或筆記型電腦,建議搭配 Ubuntu 18.04 或較新的 Linux 作業系統版本,本文採用的是Ubuntu 18.04。
  2. 一個註冊的 AWS 帳號,可參考此鏈結進行 AWS 帳號申請,每個 AWS 帳號皆有提供相關服務的免費額度,關於服務免費額度的相關訊息可參考此鏈結
  3. 一個 Raspberry Pi 4 硬體開發平台。
  4. 選項:AWS Command Line Interface(AWS CLI),可以讓您使用命令列的方式來使用 AWS 相關服務,請參考此鏈結在適合您的作業系統環境下安裝 AWS CLI。

OpenWrt
目前由 OpenWrt 論壇所提供給 Raspberry Pi 4 的映象檔是基於 musl-c 所編譯產生(可參考此鏈結),因為目前 AWS IoT Greengrass Version 2 尚未支援 musl-c,本節將帶您建置基於 glib-c 所編譯出來適合運行 AWS IoT Greengrass Version 2 的 OpenWrt 映像檔。
  1. 登入建置 OpenWrt 的個人電腦或筆記型電腦,執行系統更新與安裝編譯所需之軟體。



  2. 下載 OpenWrt 原始碼,並進行環境設置,您可以從此鏈結下載編譯 OpenWrt 時所需要用到的組態檔。


  3. 複製下載的組態檔至OpenWrt的根目錄,並進行組態檔的載入。



    按照下列圖示,進行組態檔的載入。


 


 


 


 


  1. 在載入 OpenWrt 組態檔之後進行編譯,視您的機器能力不同,編譯的時間需數十分鐘不等。



  2. 若編譯完成並沒有產生任何錯誤,您可以在此目錄下找到 openwrt-bcm27xx-bcm2711-rpi-4-squashfs-factory.img.gz



  3. 準備一個空的 SD card,建議容量大於 32GB,在本文中我們使用的是 balenaEtcher 來進行映像檔的刷入,您可以從此鏈結下載 balenaEtcher。


Raspberry Pi 4
在製作完 OpenWrt SD card 之後,將其插入Raspberry Pi 4 進行開機,第一次開啟時您必須使用鍵盤與螢幕來進行 Raspberry Pi 4 上OpenWrt 的設定,以便進行後續 AWS IoT Greengrass Version 2 的運行與範例演示。請注意:OpenWrt 預設使用者為 root,預設沒有密碼,本文中使用是預設的 root 權限,登入系統後之命令列提示為井字號 #
  1. 請參照下列指令與設定進行 OpenWrt 上的網路介面設定。



    在此檔案最後加入下列兩行設定,儲存並離開。



  2. 本文在 Raspberry Pi 4 使用無線網路來存取網際網路的資源,請參照下列指令與設定進行 OpenWrt 上的無線網路設定。



    在此檔案上註記掉原本的無線網路設定,並根據您的無線網路環境增加設定。



  3. 當您設置完網路介面與無線網路之後,重啟 OpenWrt 的網路服務使其生效。



  4. 為了方便遠端操作 OpenWrt,本文建議開啟 ssh 遠端登入,由於 OpenWrt 預設會開啟防火牆,在本文中我們會先行關閉防火牆進行遠端的登入,在運行本文中的範例之後,請您根據您原有的防火牆設定再次開啟防火牆。



  5. 透過遠端機器建立 ssh 連線連至您的 OpenWrt,本文中使用 putty 來進行 ssh 連線,您可以從此鏈結下載 putty。



    其中參數 your_rpi_ip 可以在 OpenWrt 內使用下列指令獲取。



    登入之後的畫面會如下,其中 OpenWrt 的版本號會根據您當下所下載的原始碼不同而異。


  6. 由於 AWS IoT Greengrass Version 2 為 JAVA的rumtime,在此需要下載 JDK 的環境以便後續運行 AWS IoT Greengrass Version 2,本文使用的 JDK 為 Amazon Corretto 11,請參考下列的指令下載並設定 JAVA 環境變數。



    運行之後您將會看到如下圖所示 Amazon Corretto 11 資訊,其中 Amazon Corretto 11 的版本號會根據您當下所下載的檔案不同而異。


  7. 您也可以將 JAVA 的參數寫入以下檔案,重新登入後使其永久生效。



    於此檔案新增以下兩行



 

AWS IoT Greengrass Version 2
在開始運行 AWS IoT Greengrass Version 2 之前,請參考此鏈結確認您的 AWS 帳號與使用者具有針對 AWS IoT與AWS IoT Greengrass Version 2 的服務存取權限,本文假設您已經被賦予這些服務的存取權限。請您也留意您所選擇的 AWS 服務區是否有提供AWS IoT Greengrass Version 2 的服務,您可以透過此鏈結來確認。


  1. 登入您的 AWS 控制台,搜尋 IoT Core 服務並點擊進入。


    登入 IoT Core 控制台後會如下圖所示。


  2. 若您登入後的主控台沒有顯示左手邊相關服務資訊列,請點擊左上方三條槓圖示以便展開。


  3. 點擊 Greengrass 展開服務,選擇 Getting started 之後在畫面右方點擊 Set up one core device

     

  4. Core device name 的欄位中輸入您想要的名稱,或者您可以選擇使用系統預設值。


  5. Thing group 中點選 Enter a new group name 並輸入您想要的群組名稱,或者您可以選擇使用系統預設值。


  6. 往下捲動至 Run the installer,點選 Copy 並記錄下此行指令,在後續的步驟將會使用到此指令。


  7. 點擊 View core devices


開始運行 AWS IoT Greengrass Version 2
在開始運行 AWS IoT Greengrass Version 2 之前,請先確認您可以取得 AWS 使用者帳號的存取金鑰(Access Key ID, AK)與秘密金鑰(Secret Key ID, SK),您可以參考此鏈結獲得更多關於存取金鑰與秘密金鑰的資訊。
  1. 登入您的 OpenWrt,參考下列命令設定您的 AWS 存取金鑰與秘密金鑰。



  2. 下載 AWS IoT Greengrass Version 2 最新版本,其中 AWS IoT Greengrass Version 2 的版本號會根據您當下所下載的檔案不同而異。



  3. 從雲端開始部署安裝 AWS IoT Greengrass Version 2。請複製前面在 AWS IoT 控制台上的命令列,並修改成如下列範例開始進行部署。



    當您成功部署與運行 AWS IoT Greengrass Version 2 之後,您應該會在終端畫面上看到如下圖所示的訊息。


  4. 檢查您是否成功運行 AWS IoT Greengrass Version 2,請您參考下列的命令列,若尚未看到 greengrass-cli,請稍等片刻在進行測試。



    當您成功部署並執行了 greengrass-cli 之後,您應該會在終端畫面上看到如下圖所示的訊息。


創建並部署第一個 AWS IoT Greengrass Version 2 的元件
在前面的章節,您已經成功的在 OpenWrt 上將 AWS IoT Greengrass Version 2 運行起來,並且透過命令列成功的部署了一個來自AWS IoT Greengrass Version 2 的元件:Greengrass CLI,Greengrass CLI 提供了一個在裝置端上的命令介面,讓您可以在裝置端輕鬆的開發並除錯任何在裝置端上部署的 AWS IoT Greengrass Version 2 元件,Greengrass CLI 也可以讓您在裝置端直接部署新的元件或者重啟元件。接下來,我將帶您透過 Greengrass CLI 創建並從裝置端部署第一個 AWS IoT Greengrass Version 2 的範例元件,具體的架構圖如下。


  1. 透過遠端機器建立 ssh 連線連至您的 OpenWrt,參考下列的命令列建置 artifact 的資料夾與 python 範例程式。



  1. 使用編輯器開啟範例程式,並將以下範例程式碼貼上並儲存離開,此時範例程式應為空的內容。



  2. 參考下列的命令創建您元件的範例食譜(recipe),此例子使用的是 JSON 格式,您也可以使用 YAML 格式來撰寫您的食譜。



  1. 使用編輯器開啟範例食譜,並將以下範例內容貼上並儲存離開,此時範例食譜應為空的內容。

  2. 運行與測試您的元件,以下建議您開啟多個終端連線至 OpenWrt,以利於您觀察範例的運行。



  3. 登入另一個終端連線至 OpenWrt,參考以下的命令透過 Greengrass CLI 從裝置端發起部署元件。



    當您看到類似以下的訊息,代表此元件的部署已完成


  1. 參考以下的命令觀看此元件的日誌。



    當您看到類似以下的訊息,代表此範例元件已成功部署並運行。


透過 AWS CLI 打包並發佈 AWS IoT Greengrass Version 2 元件
您已經在前一章節成功從裝置端創建並部署了第一個 AWS IoT Greengrass Version 2 的元件,以下我將帶您透過 AWS CLI 命令列打包您的元件並發佈至 AWS IoT Greengrass Version 雲端服務,請注意此章節會使用到 Amazon Simple Storage Service(Amazon S3),請確認您的 AWS 帳號的使用者權限,您可參考此鏈結了解更多 Amazon S3。
  1. 登入您已經安裝好 AWS CLI 命令列的機器,確保您可以使用 AWS CLI 命令列,您可以參考此鏈結設定您的 AWS CLI。請參考下列指令來設定您的 AWS CLI。



    並於提示下輸入您 AWS 帳號的訊息,畫面如下。其中 AWS Access Key ID 與A WS Secret Access Key 請參考先前的章節,Default region name 則是輸入您所使用 AWS 服務的服務區。


  1. 請參考下列的命令創建 Amazon S3 的儲存貯體(bucket)並賦予儲存貯體名稱。



  2. 登入您的 OpenWrt 並修改前面章節創立的食譜。



  3. 參考下列範例修改您的食譜。其中請以步驟 2 中的 S3_BUCKET 名稱置換 [YOUR BUCKET NAME]



    其中請以步驟 2 中的 S3_BUCKET 名稱置換 [YOUR BUCKET NAME],可參考下列的指令獲取 S3_BUCKET名稱。



  4. 登入您的 OpenWrt,請參考下列的指令壓縮打包 GreengrassCore 資料夾並上傳至遠端機器。



  5. 登入您遠端的機器,請參考下列指令解壓縮您剛剛上傳的 GreengrassCore 檔案,並透過 AWS CLI 上傳您元件的 artifacts 至Amazon S3 儲存貯體。



  1. 請參考下列的命令發佈您的 AWS IoT Greengrass Version 2 元件。



    您應該會得到與下列相似的返回值。其中 arn 會根據您 AWS 使用者帳號不同而異。



  1. 登入您的 AWS IoT Core 終端,您可以從 Greengrass 中的 Components 看到您已發佈的元件。

參考資料

https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html
https://catalog.us-east-1.prod.workshops.aws/v2/workshops/5ecc2416-f956-4273-b729-d0d30556013f/en-US/



  • 免費註冊AWS帳號

    數百萬名客戶正使用 AWS 雲端解決方案建立提升彈性、可擴展性、安全性和可靠性的應用程式,歡迎探索各類免費方案在 AWS 上進行建置。

    免費註冊>>

  • 與我們聯絡

    遇到問題?不管是架構設計、架構優化、效能提升等等,都竭誠歡迎你/妳聯絡 AWS 的雲端業務!

    留下資料 >>

  • 與專人線上對談

    有任何新專案的想法,想要評估使用 AWS 服務,或目前在使用上需要原廠協助之處,都可以跟我們聊聊!

    開啓對話>>