

# Erstellen einer IAM-Rolle und einer IoT-Regel für Ihr Ziel
<a name="sidewalk-destination-rule-role"></a>

AWS IoT-Regeln senden Gerätenachrichten an andere Services. AWS IoT-Regeln können auch die von einem Sidewalk-Endgerät empfangenen Binärnachrichten verarbeiten, damit sie von anderen Services verwendet werden können. AWS IoT Core für Amazon Sidewalk-Ziele verknüpfen ein WLAN-Gerät mit der Regel, die die Nachrichtendaten des Geräts verarbeitet, um sie an andere Services zu senden. Die Regel wird auf die Daten des Geräts angewendet, sobald sie von AWS IoT Core für Amazon Sidewalk empfangen werden. Für Geräte, die ihre Daten an denselben Service senden, können Sie ein Ziel erstellen, das von allen Geräten gemeinsam genutzt werden kann. Sie müssen auch eine IAM-Rolle erstellen, die die Berechtigung zum Senden von Daten an die Regel erteilt.

## Erstellen einer IAM-Rolle für Ihr Ziel
<a name="iot-sidewalk-destination-role"></a>

Erstellen Sie eine IAM-Rolle, die AWS IoT Core für Amazon Sidewalk die Berechtigung zum Senden von Daten an die AWS IoT-Regel erteilt. Verwenden Sie die [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)-API-Operation oder den [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role)-CLI-Befehl, um die Rolle zu erstellen. Sie können die Rolle *`SidewalkRole`* nennen.

```
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"}]}'
```

Sie können die Vertrauensrichtlinie für die Rolle auch mithilfe einer JSON-Datei definieren.

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

Im Folgenden werden die Inhalte der JSON-Datei gezeigt.

**Inhalt von trust-policy.json**

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

## Erstellen einer Regel für Ihr Ziel
<a name="iot-sidewalk-destination-rule"></a>

Verwenden Sie die AWS IoT Core-API-Operation [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html) oder den AWS CLI-Befehl [https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html](https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html), um eine Rolle zu erstellen. Die Themenregel wird von Ihrem Ziel verwendet, um die von Ihrem Sidewalk-Endgerät empfangenen Daten an andere AWS-Services weiterzuleiten. Sie können beispielsweise eine Regelaktion erstellen, die eine Nachricht an eine Lambda-Funktion sendet. Sie können die Lambda-Funktion so definieren, dass sie die Anwendungsdaten von Ihrem Gerät empfängt und base64 verwendet, um die Nutzlastdaten zu dekodieren, sodass sie von anderen Anwendungen verwendet werden können.

In den folgenden Schritten wird gezeigt, wie Sie die Lambda-Funktion und anschließend eine Themenregel erstellen, die eine Nachricht an diese Funktion sendet.

1. 

**Erstellen einer Ausführungsrolle und einer Richtlinie**

   Erstellen Sie die IAM-Rolle, die Ihrer Funktion Zugriff auf AWS-Ressourcen gewährt. Sie können die Vertrauensrichtlinie für die Rolle auch mithilfe einer JSON-Datei definieren.

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

   Im Folgenden werden die Inhalte der JSON-Datei gezeigt.

   **Inhalt von lambda-trust-policy.json**

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

1. 

**Erstellen und testen der Lambda-Funktion**

   Führen Sie die folgenden Schritte aus, um eine AWS Lambda-Funktion zu erstellen, die die base64-Nutzlastdaten dekodiert.

   1. Schreiben Sie den Code für die Dekodierung der Nutzlastdaten. Sie können beispielsweise den folgenden Python-Beispielcode verwenden. Geben Sie einen Namen für das Skript an, z. B. *`base64_decode.py`*.

      **Inhalt von base64\$1decode.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))
      ```

   1. Erstellen Sie ein Bereitstellungspaket als Zip-Datei, die die Python-Datei enthält, und nennen Sie sie `base64_decode.zip`. Verwenden Sie die `CreateFunction`-API oder den `create-function`-CLI-Befehl, um eine Lambda-Funktion für den Beispielcode *`base64_decode.py`* zu erstellen.

   1. 

      ```
      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
      ```

      Die Ausgabe sollte folgendermaßen aussehen. Bei der Erstellung der Themenregel verwenden Sie den Wert des Amazon-Ressourcennamens (ARN) aus der Ausgabe `FunctionArn`.

      ```
      {
          "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",
          ...
      }
      ```

   1. Verwenden Sie die `--log-type`-Option mit dem `invoke`-Befehl, um Protokolle für einen Aufruf über die Befehlszeile abzurufen. Die Antwort enthält das Feld LogResult, das bis zu 4 KB base64-verschlüsselte Protokolle aus dem Aufruf enthält. 

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

      Sie erhalten die Antwort mit einem `StatusCode` von 200. Weitere Informationen zur Erstellung und Verwendung von Lambda-Funktionen aus AWS CLI finden Sie unter [Erstellen einer Lambda-Funktion mit der AWS CLI](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html).

1. Erstellen einer Themenregel

   Verwenden Sie die `CreateTopicRule`-API oder den `create-topic-rule`-CLI-Befehl, um eine Themenregel zu erstellen, die eine Nachricht an diese Lambda-Funktion sendet. Sie können auch eine zweite Regelaktion hinzufügen, die zu einem AWS IoT-Thema erneut veröffentlicht wird. Nennen Sie diese Themenregel `Sidewalkrule`.

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

   Sie können die `myrule.json`-Datei verwenden, um weitere Details zur Regel anzugeben. Die folgende JSON-Datei zeigt, wie Sie in einem AWS IoT-Thema erneut veröffentlichen und eine Nachricht an eine Lambda-Funktion senden.

   ```
   {
       "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"
                }
           }
       ],
   }
   ```