

# Creazione di un ruolo IAM e della regola IoT per la destinazione
<a name="sidewalk-destination-rule-role"></a>

Le regole AWS IoT inviano messaggi del dispositivo ad altri servizi. Le regole AWS IoT possono anche elaborare i messaggi binari ricevuti da un dispositivo finale Sidewalk per l'utilizzo in altri servizi. Le destinazioni AWS IoT Core per Amazon Sidewalk associano un dispositivo wireless alla regola che elabora i dati dei messaggi del dispositivo da inviare ad altri servizi. La regola agisce sui dati del dispositivo non appena vengono ricevuti da AWS IoT Core per Amazon Sidewalk. Per tutti i dispositivi che inviano i propri dati allo stesso servizio, è possibile creare una destinazione che può essere condivisa da tutti i dispositivi. È inoltre necessario creare un ruolo IAM che conceda l'autorizzazione per inviare dati alla regola.

## Creazione di un ruolo IAM per la destinazione
<a name="iot-sidewalk-destination-role"></a>

Crea un ruolo IAM che concede l'autorizzazione AWS IoT Core per Amazon Sidewalk per inviare dati alla regola AWS IoT. Per creare il ruolo, utilizza l'operazione API [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) o il comando dell'interfaccia a riga di comando [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role). Puoi denominare il ruolo come {{`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"}]}'
```

È inoltre possibile definire la policy di affidabilità per il ruolo utilizzando un file JSON.

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

Nell'esempio seguente viene mostrato il contenuto del file JSON.

**Contenuto di trust-policy.json**

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

## Creazione di una regola per la destinazione
<a name="iot-sidewalk-destination-rule"></a>

Utilizza l'operazione API AWS IoT Core, [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html) o il comando AWS CLI, [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), per creare una regola. La regola dell'argomento verrà utilizzata dalla destinazione per instradare i dati ricevuti dal dispositivo finale Sidewalk ad altri Servizi AWS. Ad esempio, è possibile creare un'operazione della regola che invia un messaggio a una funzione Lambda. È possibile definire la funzione Lambda in modo che riceva i dati dell'applicazione dal dispositivo e utilizzi base64 per decodificare i dati del payload in modo da poter essere utilizzati da altre applicazioni.

Nelle fasi seguenti viene illustrato come creare la funzione Lambda e quindi una regola dell'argomento che invia un messaggio a questa funzione.

1. 

**Creazione del ruolo di esecuzione e della policy**

   Crea il ruolo IAM che concede alla funzione l'autorizzazione per accedere alle risorse AWS. È inoltre possibile definire la policy di affidabilità per il ruolo utilizzando un file JSON.

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

   Nell'esempio seguente viene mostrato il contenuto del file JSON.

   **Contenuto di lambda-trust-policy.json**

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

1. 

**Creazione e verifica della funzione Lambda**

   Esegui la procedura seguente per creare una funzione AWS Lambda che esegue la decodifica base64 dei dati del payload.

   1. Scrivi il codice per decodificare i dati del payload. Ad esempio, puoi utilizzare il seguente codice Python di esempio. Specifica un nome per lo script, ad esempio {{`base64_decode.py`}}.

      **Contenuto di 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))
      ```

   1. Crea un pacchetto di implementazione come un file zip contenente il file Python e assegna un nome come `{{base64_decode.zip}}`. Utilizza l'API `CreateFunction` o il comando dell'interfaccia a riga di comando `create-function` per creare una funzione Lambda per il codice di esempio, {{`base64_decode.py`}}.

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

      Vedrai il seguente output. Durante la creazione della regola dell'argomento, utilizzerai il valore nome della risorsa Amazon (ARN) dell'output, `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. Per ottenere i log per una chiamata dalla riga di comando, utilizza l'opzione `--log-type` con il comando `invoke`. La risposta include un campo LogResult contenente fino a 4 KB di log con codifica base64 dalla chiamata. 

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

      La risposta ricevuta deve contenere un `StatusCode` di 200. Per ulteriori informazioni sulla creazione e l'utilizzo di funzioni Lambda da AWS CLI, consultare [Utilizzo di Lambda con AWS CLI](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html).

1. Creazione di una regola dell'argomento

   Utilizza l'API `CreateTopicRule` o il comando dell'interfaccia a riga di comando `create-topic-rule` per creare una regola dell'argomento che invia un messaggio a questa funzione Lambda. Puoi anche aggiungere una seconda operazione della regola che ripubblica su un argomento AWS IoT. Assegna a questa regola dell'argomento un nome come `{{Sidewalkrule}}`.

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

   Puoi utilizzare il file `myrule.json` per specificare ulteriori dettagli relativi alla regola. Ad esempio, il seguente file JSON mostra come ripubblicare su un argomento AWS IoT e inviare un messaggio a una funzione 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"}}
                }
           }
       ],
   }
   ```