

# Creación de un rol de IAM y una regla de IoT para el destino
<a name="sidewalk-destination-rule-role"></a>

Las reglas de AWS IoT envían mensajes del dispositivo a otros servicios. Las reglas de AWS IoT también pueden procesar los mensajes binarios recibidos de un dispositivo final Sidewalk para que los utilicen otros servicios. Los destinos de AWS IoT Core para Amazon Sidewalk asocian un dispositivo inalámbrico a la regla que procesa los datos de los mensajes del dispositivo para enviarlos a otros servicios. La regla actúa sobre los datos del dispositivo en cuanto AWS IoT Core para Amazon Sidewalk los recibe. Para todos los dispositivos que envían sus datos al mismo servicio, puede crear un destino que puedan compartir todos los dispositivos. También debe crear un rol de IAM que conceda permiso para enviar datos a la regla.

## Creación de un rol de IAM para los destinos
<a name="iot-sidewalk-destination-role"></a>

Cree un rol de IAM que le conceda a AWS IoT Core para Amazon Sidewalk el permiso necesario para enviar datos a la regla de AWS IoT. Para crear el rol, utilice la operación [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) de la API o el comando [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role) de la CLI. Puede nombrar el rol 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"}]}'
```

También puede definir la política de confianza para el rol con un archivo JSON.

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

A continuación se muestra el contenido del archivo JSON.

**Contenido de trust-policy.json**

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

## Creación de una regla para el destino
<a name="iot-sidewalk-destination-rule"></a>

Para crear una regla, utilice la operación [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html) de la API de AWS IoT Core o el comando [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) de la AWS CLI. El destino utilizará la regla del tema para enrutar los datos recibidos del dispositivo final de Sidewalk a otros Servicios de AWS. Por ejemplo, puede crear una acción de regla que envíe un mensaje a una función de Lambda. Puede definir la función de Lambda de manera que reciba los datos de la aplicación del dispositivo y utilice base64 para decodificar los datos de la carga para que puedan utilizarlos otras aplicaciones.

En los pasos siguientes se muestra cómo se crea la función de Lambda y, a continuación, una regla del tema que envía un mensaje a esta función.

1. 

**Creación de un rol y una política de ejecución**

   Cree el rol de IAM que concederá a su función permiso para obtener acceso a los recursos de AWS. También puede definir la política de confianza para el rol con un archivo JSON.

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

   A continuación se muestra el contenido del archivo JSON.

   **Contenido de lambda-trust-policy.json**

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

1. 

**Creación y prueba de la función de Lambda**

   Realice los siguientes pasos para crear una función de AWS Lambda que en base64 decodifique los datos de la carga.

   1. Escriba el código para decodificar los datos de la carga. Por ejemplo, puede usar el siguiente código Python de muestra. Especifique un nombre para el script, como *`base64_decode.py`*.

      **Contenido del archivo 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. Cree un paquete de implementación como un archivo zip que contenga el archivo Python y asígnele el nombre `base64_decode.zip`. Utilice la `CreateFunction` de la API o el comando `create-function` de la CLI para crear una función de Lambda para el código de ejemplo, *`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
      ```

      Debería ver la siguiente salida. Utilizará el valor del nombre de recurso de Amazon (ARN) de la salida, `FunctionArn`, al crear la regla del tema.

      ```
      {
          "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 obtener registros para una invocación desde la línea de comandos, utilice la opción `--log-type` con el comando `invoke`. La respuesta incluye un campo LogResult que contiene hasta 4 KB de registros con codificación base64 a partir de la invocación. 

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

      Debe recibir una respuesta con un `StatusCode` de 200. Para obtener más información acerca de la creación y el uso de las funciones de Lambda de la AWS CLI, consulte [Uso de Lambda con la AWS CLI](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html).

1. Creación de una regla del tema

   Utilice la `CreateTopicRule` de la API o el comando `create-topic-rule` de la CLI para crear una regla del tema que envíe un mensaje a esta función de Lambda. También puede añadir una segunda acción de regla que vuelva a publicar en un tema de AWS IoT. Asigne a esta regla del tema el nombre `Sidewalkrule`.

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

   Puede usar el archivo `myrule.json` para especificar más detalles sobre la regla. Por ejemplo, el siguiente archivo JSON muestra cómo volver a publicar un tema de AWS IoT y enviar un mensaje a una función de 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"
                }
           }
       ],
   }
   ```