為您的目的地建立 IAM 角色和 IoT 規則 - AWS IoT Wireless

為您的目的地建立 IAM 角色和 IoT 規則

AWS IoT 規則會將裝置訊息傳送至其他服務。AWS IoT 規則還可處理從 Sidewalk 終端裝置接收的二進位訊息,以供其他服務使用。適用於 Amazon Sidewalk 的 AWS IoT Core 目的地會將無線裝置與規則建立關聯,而此規則會處理裝置訊息資料以傳送至其他服務。一旦適用於 Amazon Sidewalk 的 AWS IoT Core 收到裝置資料,該規則就會對裝置資料採取行動。對於將其資料傳送至相同服務的所有裝置,您可建立可供所有裝置共用的目的地。您還需建立 IAM 角色,授與將資料傳送至規則的權限。

為您的目的地建立 IAM 角色

建立 IAM 角色,將傳送資料至 AWS IoT 規則的許可授予適用於 Amazon Sidewalk 的 AWS IoT Core。如要建立該角色,請使用 CreateRole API 操作或 create-role CLI 命令。您可將該角色命名為 SidewalkRole

aws iam create-role --role-name SidewalkRole \ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

您也可使用 JSON 檔案來定義角色的信任政策。

aws iam create-role --role-name SidewalkRole \ --assume-role-policy-document file://trust-policy.json

下列顯示 JSON 檔案的內容。

trust-policy.json 的內容

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

為您的目的地建立規則

請使用 AWS IoT Core API 操作 CreateTopicRule,或 AWS CLI 命令 create-topic-rule 來建立一個規則。您的目的地將使用主題規則,將從 Sidewalk 終端裝置接收的資料路由至其他 AWS 服務。例如,您可建立一個將訊息傳送至 Lambda 函數的規則動作。您可以定義 Lambda 函數,使其從您的裝置接收應用程式資料,並使用 base64 解碼承載資料,則其他應用程式可以使用該函數。

下列步驟顯示如何建立 Lambda 函數,接著建立將訊息傳送至此函數的主題規則。

  1. 建立執行角色和原則

    建立一個 IAM 角色,授予您函數存取 AWS 資源的權限。您也可使用 JSON 檔案來定義角色的信任政策。

    aws iam create-role --role-name lambda-ex \ --assume-role-policy-document file://lambda-trust-policy.json

    下列顯示 JSON 檔案的內容。

    lambda-trust-policy.json 的內容

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 建立並測試 Lambda 函數

    執行下列步驟來建立 base64 解碼承載資料的 AWS Lambda 函數。

    1. 撰寫用於解碼負載資料的程式碼。例如,您可使用下列 Python 程式碼範例。指定指令碼的名稱,例如 base64_decode.py

      base64_decode.py 的內容

      // ----------------------------------------------------------- // ----- Python script to decode incoming binary payload ----- // ----------------------------------------------------------- import json import base64 def lambda_handler(event, context): message = json.dumps(event) print (message) payload_data = base64.b64decode(event["PayloadData"]) print(payload_data) print(int(payload_data,16))
    2. 將部署套件建立為一個包含 Python 檔案的 zip 檔案,並將其命名為 base64_decode.zip。使用 CreateFunction API 或 create-function CLI 命令,為範例程式碼 base64_decode.py 建立 Lambda 函數。

    3. aws lambda create-function --function-name my-function \ --zip-file fileb://base64_decode.zip --handler index.handler \ --runtime python3.9 --role arn:aws:iam::123456789012:role/lambda-ex

      您應該會看到下列輸出。建立主題規則時,您將會使用輸出 FunctionArn 中的 Amazon Resource Name (ARN) 值。

      { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "Runtime": "python3.9", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }
    4. 如要從命令列取得某次調用的日誌,請使用具有 invoke 命令的 --log-type 選項。該回應包括 LogResult 欄位,其內含該次調用的 base64 編碼日誌 (最大達 4 KB)。

      aws lambda invoke --function-name my-function out --log-type Tail

      您應該會收到 StatusCode 為 200 的回應。如需有關從 AWS CLI 建立並使用 Lambda 函數的詳細資訊,請參閱 Lambda 與 AWS CLI 搭配使用

  3. 建立主題規則

    使用 CreateTopicRule API 或 create-topic-rule CLI 命令,建立將訊息傳送至此 Lambda 函數的主題規則。您還可新增一個重新發佈至 AWS IoT 主題的第二個規則動作。將此主題規則命名為 Sidewalkrule

    aws iot create-topic-rule --rule-name Sidewalkrule \ --topic-rule-payload file://myrule.json

    您可使用 myrule.json 檔案,來指定有關規則的更多詳細資訊。例如,下列 JSON 檔案顯示如何重新發佈至 AWS IoT 主題,及如何將訊息傳送至 Lambda 函數。

    { "sql": "SELECT * ", "actions": [ { // You obtained this functionArn when creating the Lambda function using the // create-function command. "lambda": { "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function" } }, { // This topic can be used to observe messages exchanged between the device and // AWS IoT Core for Amazon Sidewalk after the device is connected. "republish": { "roleArn": "arn:aws:iam::123456789012:role/service-role/SidewalkRepublishRole", "topic": "project/sensor/observed" } } ], }