

# Criar um perfil do IAM e regra de IoT para o destino
<a name="sidewalk-destination-rule-role"></a>

As regras do AWS IoT enviam mensagens de dispositivos a outros serviços. As regras do AWS IoT também podem processar as mensagens binárias recebidas de um dispositivo final do Sidewalk para utilização de outros serviços. Os destinos do AWS IoT Core para Amazon Sidewalk associam um dispositivo sem fio à regra que processa os dados da mensagem do dispositivo para envio a outros serviços. A regra atua nos dados do dispositivo assim que o AWS IoT Core para Amazon Sidewalk os recebe. Para todos os dispositivos que enviam seus dados para o mesmo serviço, você pode criar um destino que possa ser compartilhado por todos eles. É preciso criar um perfil do IAM que conceda permissão para enviar dados para a regra.

## Criar um perfil do IAM para o destino
<a name="iot-sidewalk-destination-role"></a>

Crie um perfil do IAM que conceda permissão ao AWS IoT Core para Amazon Sidewalk para enviar dados à regra do AWS IoT. Para criar o perfil, use a operação de API [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) ou o comando de CLI [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role). Você pode nomear a função como *`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"}]}'
```

Também é possível definir a política de confiança para a função usando um arquivo JSON.

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

O exemplo a seguir mostra o conteúdo do arquivo JSON.

**Conteúdo do trust-policy.json**

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

## Criar uma regra para o destino
<a name="iot-sidewalk-destination-rule"></a>

Use a operação da 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), ou o comando da 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), para criar uma regra. A regra do tópico será usada pelo destino para direcionar os dados recebidos do seu dispositivo final do Sidewalk para outros Serviços da AWS. Por exemplo, você pode criar uma ação de regra que envia uma mensagem para uma função do Lambda. Você pode definir a função do Lambda de maneira que ela receba os dados do aplicativo do seu dispositivo e use base64 para decodificar os dados da carga útil para que possam ser usados por outros aplicativos.

As etapas a seguir mostram como criar a função do Lambda e, em seguida, uma regra de tópico que envie uma mensagem para essa função.

1. 

**Criar uma função e uma política de execução**

   Crie um perfil do IAM que dá à sua função permissão para acessar recursos da AWS. Também é possível definir a política de confiança para a função usando um arquivo JSON.

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

   O exemplo a seguir mostra o conteúdo do arquivo JSON.

   **Conteúdo do lambda-trust-policy.json**

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

1. 

**Criar e testar a função do Lambda**

   Execute as etapas a seguir para criar uma função do AWS Lambda que permita que base64 decodifique os dados da carga útil.

   1. Escreva o código para decodificar os dados da carga útil. Você pode usar o exemplo de código Python a seguir. Especifique um nome para o script, como *`base64_decode.py`*.

      **Conteúdo do 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. Criar um pacote de implantação como um arquivo zip que contenha o arquivo Python e nomeá-lo como `base64_decode.zip`. Use a API `CreateFunction` ou o comando da CLI `create-function` para criar uma função do Lambda para o código de amostra, *`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
      ```

      Você verá a saída a seguir. Você usará o valor do nome do recurso da Amazon (ARN) da saída,`FunctionArn`, ao criar a regra de tópico.

      ```
      {
          "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. Para obter logs para uma invocação a partir da linha de comando, use a opção `--log-type` com o comando `invoke`. A resposta inclui um campo LogResult que contém até 4 KB de logs codificados em base64 da invocação. 

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

      Você receberá uma resposta com um `StatusCode` de 200. Para obter mais informações sobre como criar e usar as funções do Lambda com a AWS CLI, consulte [Como usar o Lambda com a AWS CLI](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html).

1. Criar uma regra de tópico

   Use a API `CreateTopicRule` ou o comando da CLI `create-topic-rule` para criar uma regra de tópico que envia uma mensagem para essa função do Lambda. Você também pode adicionar uma segunda ação de regra que republica em um tópico de AWS IoT. Nomeie essa regra de tópico como `Sidewalkrule`.

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

   Você pode usar o arquivo `myrule.json` para especificar mais detalhes sobre a regra. Por exemplo, o arquivo JSON a seguir mostra como republicar em um tópico de AWS IoT e enviar uma mensagem para uma função do 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"
                }
           }
       ],
   }
   ```