

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Tutorial: Demuestre acciones remotas (trabajos) con el cliente del AWS IoT dispositivo
<a name="iot-dc-runjobs"></a>

En estos tutoriales, configurará e implementará trabajos en su Raspberry Pi para demostrar cómo puede enviar operaciones remotas a sus dispositivos IoT.

**Para comenzar este tutorial:**
+ Configure su ordenador host local, una Raspberry Pi, tal como se utilizó en [la sección anterior](iot-dc-testconn.md). 
+ Si no has completado el tutorial de la sección anterior, puedes probar este tutorial utilizando la Raspberry Pi con una tarjeta microSD que contenga la imagen que guardaste después de instalar el AWS IoT Device Client. [(Opcional) Guardar la imagen de la tarjeta microSD](iot-dc-install-download.md#iot-dc-install-dc-save)
+ Si ya ha realizado esta demostración anteriormente, procure [Paso 2: Limpiar las demostraciones Cuenta de AWS después de crear con el cliente del AWS IoT dispositivo](iot-dc-cleanup.md#iot-dc-cleanup-cloud) eliminar todos los AWS IoT recursos que haya creado en ejecuciones anteriores para evitar errores de recursos duplicados.

Para completar este tutorial se necesitan aproximadamente 45 minutos.

**Cuando haya terminado con este tema:**
+ Habrás demostrado las diferentes formas en que tu dispositivo de IoT puede AWS IoT Core utilizarlos para ejecutar operaciones remotas gestionadas por AWS IoT .

**Equipo necesario:**
+ Su entorno local de desarrollo y pruebas que probó en [una sección anterior](iot-dc-install-dc.md)
+ La Raspberry Pi que probó en [una sección anterior](iot-dc-install-dc.md)
+ La tarjeta de memoria microSD de la Raspberry Pi que probó en [una sección anterior](iot-dc-install-dc.md)

**Topics**
+ [Preparación de Raspberry Pi para ejecutar trabajos](iot-dc-runjobs-prepare.md)
+ [Crea y ejecuta el trabajo AWS IoT con AWS IoT Device Client](iot-dc-runjobs-prepare-define.md)

# Preparación de Raspberry Pi para ejecutar trabajos
<a name="iot-dc-runjobs-prepare"></a>

Los procedimientos de esta sección describen cómo preparar la Raspberry Pi para ejecutar tareas mediante el AWS IoT Device Client.

**nota**  
Estos procedimientos son específicos del dispositivo. Si desea realizar los procedimientos de esta sección con más de un dispositivo al mismo tiempo, cada dispositivo necesitará su propia política y un certificado y un nombre únicos y específicos del dispositivo. Para asignar a cada dispositivo sus recursos exclusivos, realice este procedimiento una vez para cada dispositivo y, al mismo tiempo, cambie los elementos específicos del dispositivo, tal como se describe en los procedimientos.

**Topics**
+ [Aprovisionar la Raspberry Pi para demostrar trabajos](#iot-dc-runjobs-prepare-provision)
+ [Configure el cliente del AWS IoT dispositivo para ejecutar el agente de trabajos](#iot-dc-runjobs-prepare-config)

## Aprovisionar la Raspberry Pi para demostrar trabajos
<a name="iot-dc-runjobs-prepare-provision"></a>

Los procedimientos de esta sección aprovisionan tu Raspberry Pi AWS IoT mediante la creación de AWS IoT recursos y certificados de dispositivo para ella. 

**Topics**
+ [Cree y descargue archivos de certificados de dispositivos para demostrar los AWS IoT trabajos](#iot-dc-runjobs-prepare-cert)
+ [Cree AWS IoT recursos para demostrar los AWS IoT trabajos](#iot-dc-runjobs-prepare-iot)

### Cree y descargue archivos de certificados de dispositivos para demostrar los AWS IoT trabajos
<a name="iot-dc-runjobs-prepare-cert"></a>

Este procedimiento crea los archivos de certificado del dispositivo para esta demostración.

Si está preparando más de un dispositivo, este procedimiento debe realizarse en cada uno de ellos.

**Para crear y descargar los archivos de certificado del dispositivo para la Raspberry Pi:**

En la ventana del terminal de su ordenador host local que esté conectado a la Raspberry Pi, introduzca estos comandos:

1. Escriba el siguiente comando para crear los archivos de certificado del dispositivo.

   ```
   aws iot create-keys-and-certificate \
   --set-as-active \
   --certificate-pem-outfile "~/certs/jobs/device.pem.crt" \
   --public-key-outfile "~/certs/jobs/public.pem.key" \
   --private-key-outfile "~/certs/jobs/private.pem.key"
   ```

   El comando devuelve una respuesta similar a la siguiente: Guarde el valor de `certificateArn` para utilizarlo más tarde.

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. Introduzca los siguientes comandos para configurar los permisos en el directorio de certificados y sus archivos.

   ```
   chmod 700 ~/certs/jobs
   chmod 644 ~/certs/jobs/*
   chmod 600 ~/certs/jobs/private.pem.key
   ```

1. Ejecute este comando para revisar los permisos de sus directorios y archivos de certificados.

   ```
   ls -l ~/certs/jobs
   ```

   El resultado del comando debe ser el mismo que el que se muestra aquí, excepto que las fechas y horas de los archivos serán diferentes.

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

Una vez descargados los archivos de certificado del dispositivo en la Raspberry Pi, estará listo para continuar con [Aprovisionar la Raspberry Pi para demostrar trabajos](#iot-dc-runjobs-prepare-provision).

### Cree AWS IoT recursos para demostrar los AWS IoT trabajos
<a name="iot-dc-runjobs-prepare-iot"></a>

Cree los AWS IoT recursos para este dispositivo.

Si está preparando más de un dispositivo, este procedimiento debe realizarse en cada uno de ellos.



**Para aprovisionar el dispositivo en AWS IoT:**

En la ventana del terminal de su ordenador host local que esté conectado a la Raspberry Pi:

1. Introduzca el siguiente comando para obtener la dirección del punto de conexión de datos del dispositivo de su Cuenta de AWS.

   ```
   aws iot describe-endpoint --endpoint-type IoT:Data-ATS
   ```

   El valor del punto de conexión no ha cambiado desde la última vez que ejecutó este comando. Al volver a ejecutar el comando aquí, será más fácil buscar y pegar el valor del punto de conexión de datos en el archivo de configuración utilizado en este tutorial.

   El comando **describe-endpoint** devuelve una respuesta similar a la siguiente. Anote el valor `endpointAddress`: lo necesitará más adelante.

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. *uniqueThingName*Sustitúyalos por un nombre único para el dispositivo. Si desea realizar este tutorial con varios dispositivos, asigne a cada dispositivo su propio nombre. Por ejemplo, **TestDevice01**, **TestDevice02**, etc.

   Ingresa este comando para crear un nuevo recurso AWS IoT para tu Raspberry Pi.

   ```
   aws iot create-thing --thing-name "uniqueThingName"
   ```

   Como un AWS IoT recurso es una representación *virtual* de su dispositivo en la nube, podemos crear varios recursos AWS IoT para usarlos con diferentes propósitos. Todos pueden ser utilizados por el mismo dispositivo físico IoT para representar diferentes aspectos del dispositivo.
**nota**  
Cuando desee proteger la política para varios dispositivos, puede utilizar `${iot:Thing.ThingName}` en lugar del nombre del objeto estático, `uniqueThingName`.

   Estos tutoriales solo utilizarán un recurso a la vez por dispositivo. De esta forma, en estos tutoriales, se representan las diferentes demostraciones para que, después de crear los AWS IoT recursos para una demostración, pueda volver atrás y repetir las demostraciones utilizando los recursos que ha creado específicamente para cada una de ellas.

   Si AWS IoT se ha creado el recurso deseado, el comando devuelve una respuesta como esta. Registre el valor `thingArn` para usarlo más adelante cuando cree el trabajo para ejecutarlo en este dispositivo.

   ```
   {
   "thingName": "uniqueThingName",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/uniqueThingName",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. En la ventana del terminal:

   1. Abra un editor de texto, como `nano`.

   1. Copie este documento JSON y péguelo en el editor de texto abierto.  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:DescribeJobExecution",
                      "iot:GetPendingJobExecutions",
                      "iot:StartNextPendingJobExecution",
                      "iot:UpdateJobExecution"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
                  ]
              }
          ]
      }
      ```

   1. En el editor, en la `Resource` sección de cada declaración de política, *us-west-2:57EXAMPLE833* sustitúyalo por el tuyo Región de AWS, dos puntos (:)) y tu Cuenta de AWS número de 12 dígitos.

   1. En el editor, en cada declaración de política, *uniqueThingName* sustitúyala por el nombre que le diste al recurso.

   1. Guarde el archivo en el editor de texto como **\$1/policies/jobs\$1test\$1thing\$1policy.json**.

      Si ejecuta este procedimiento para varios dispositivos, guarde el archivo con este nombre de archivo en cada dispositivo.

1. *uniqueThingName*Reemplácelo por el nombre del dispositivo y, a continuación, ejecute este comando para crear una AWS IoT política que se adapte a ese dispositivo.

   ```
   aws iot create-policy \
   --policy-name "JobTestPolicyForuniqueThingName" \
   --policy-document "file://~/policies/jobs_test_thing_policy.json"
   ```

   Si se crea la política, el comando devuelve una respuesta como esta.  
****  

   ```
   {
       "policyName": "JobTestPolicyForuniqueThingName",
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/JobTestPolicyForuniqueThingName",
       "policyDocument": "{\n\"Version\": \"2012-10-17\",\n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
       "policyVersionId": "1"
   }
   ```

1. *uniqueThingName*Sustitúyalo por el nombre del dispositivo y `certificateArn` por el `certificateArn` valor que guardó anteriormente en esta sección para este dispositivo y, a continuación, ejecute este comando para adjuntar la política al certificado del dispositivo. 

   ```
   aws iot attach-policy \
   --policy-name "JobTestPolicyForuniqueThingName" \
   --target "certificateArn"
   ```

   Si se ejecuta correctamente, este comando no devuelve nada.

1.  *uniqueThingName*Sustitúyalo por el nombre del dispositivo, `certificateArn` sustitúyalo por el `certificateArn` valor que guardó anteriormente en esta sección y, a continuación, ejecute este comando para adjuntar el certificado del dispositivo al AWS IoT recurso del elemento.

   ```
   aws iot attach-thing-principal \
   --thing-name "uniqueThingName" \
   --principal "certificateArn"
   ```

   Si se ejecuta correctamente, este comando no devuelve nada.

Una vez aprovisionada correctamente la Raspberry Pi, podrá repetir esta sección con otra Raspberry Pi de la prueba o, si ya se han aprovisionado todos los dispositivos, podrá continuar con [Configure el cliente del AWS IoT dispositivo para ejecutar el agente de trabajos](#iot-dc-runjobs-prepare-config).

## Configure el cliente del AWS IoT dispositivo para ejecutar el agente de trabajos
<a name="iot-dc-runjobs-prepare-config"></a>

Este procedimiento crea un archivo de configuración para que el cliente del AWS IoT dispositivo ejecute el agente de trabajos:.

Nota: Si está preparando más de un dispositivo, este procedimiento debe realizarse en cada uno de ellos.

**Para crear el archivo de configuración para probar el cliente del AWS IoT dispositivo:**

1. En la ventana del terminal de su ordenador host local que esté conectado a la Raspberry Pi:

   1. Abra un editor de texto, como `nano`.

   1. Copie este documento JSON y péguelo en el editor de texto abierto.

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/jobs/device.pem.crt",
        "key": "~/certs/jobs/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "uniqueThingName",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": true,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": false,
            "publish-topic": "",
            "publish-file": "",
            "subscribe-topic": "",
            "subscribe-file": ""
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. Sustituya el *endpoint* valor por el valor del punto final de los datos del dispositivo Cuenta de AWS que encontró en[Aprovisione su dispositivo en AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision).

   1. *uniqueThingName*Sustitúyalo por el nombre del objeto que utilizaste para este dispositivo.

   1. Guarde el archivo en el editor de texto como **\$1/dc-configs/dc-jobs-config.json**.

1. Ejecute este comando para establecer los permisos de archivo del nuevo archivo de configuración.

   ```
   chmod 644 ~/dc-configs/dc-jobs-config.json
   ```

No utilizará el **cliente de prueba de MQTT** para esta prueba. Si bien el dispositivo intercambiará mensajes MQTT relacionados con las tareas AWS IoT, los mensajes de progreso de las tareas solo se intercambiarán con el dispositivo que las esté ejecutando. Como los mensajes de progreso del trabajo solo se intercambian con el dispositivo que ejecuta el trabajo, no puedes suscribirte a ellos desde otro dispositivo, como la consola. AWS IoT 

Después de guardar el archivo de configuración, estará listo para continuar con [Crea y ejecuta el trabajo AWS IoT con AWS IoT Device Client](iot-dc-runjobs-prepare-define.md).

# Crea y ejecuta el trabajo AWS IoT con AWS IoT Device Client
<a name="iot-dc-runjobs-prepare-define"></a>

Los procedimientos de esta sección crean un documento de trabajo y un recurso de AWS IoT trabajo. Tras crear el recurso de trabajo, AWS IoT envía el documento de trabajo a los destinos de trabajo especificados, a los que un agente de trabajos aplica el documento de trabajo al dispositivo o cliente.

**Topics**
+ [Creación y almacenamiento del documento de trabajo de IoT](#iot-dc-runjobs-prepare-define-jobdoc)
+ [Ejecute un trabajo AWS IoT para un dispositivo de IoT](#iot-dc-runjobs-prepare-define-job)

## Creación y almacenamiento del documento de trabajo de IoT
<a name="iot-dc-runjobs-prepare-define-jobdoc"></a>

Este procedimiento crea un documento de trabajo sencillo para incluirlo en un recurso de AWS IoT trabajo. Este documento de trabajo muestra el mensaje «¡Hola mundo\$1» en el destino del trabajo.

**Para crear y almacenar un documento de trabajo:**

1. Seleccione el bucket de Amazon S3 en el que guardará el documento de trabajo. Si no dispone de un bucket de Amazon S3 existente, deberá crear uno. Para obtener información sobre cómo crear buckets de Amazon S3, consulte los temas de [Introducción a Amazon S3](https://docs.aws.amazon.com//AmazonS3/latest/userguide/GetStartedWithS3.html).

1. Crear y guardar el documento de trabajo para este trabajo

   1. En el ordenador host local, abra un editor de texto.

   1. Copie y pegue este texto en el editor.

      ```
      {
          "operation": "echo",
          "args": ["Hello world!"]
      }
      ```

   1. En el equipo host local, guarde el contenido del editor en un archivo denominado **hello-world-job.json**.

   1. Confirme que el archivo se haya guardado correctamente. Algunos editores de texto agregan `.txt` automáticamente el nombre del archivo al guardar un archivo de texto. Si el editor lo ha agregado `.txt` al nombre del archivo, corrija el nombre del archivo antes de continuar.

1. Sustituya la *path\$1to\$1file* ruta por la ruta a**hello-world-job.json**, si no está en su directorio actual, *s3\$1bucket\$1name* sustitúyala por la ruta del bucket de Amazon S3 al bucket que ha seleccionado y, a continuación, ejecute este comando para colocar el documento de trabajo en el bucket de Amazon S3.

   ```
   aws s3api put-object \
   --key hello-world-job.json \
   --body path_to_file/hello-world-job.json --bucket s3_bucket_name
   ```

   La URL del documento de trabajo que identifica el documento de trabajo que ha almacenado en Amazon S3 se determina sustituyendo *s3\$1bucket\$1name* y *AWS\$1region* en la siguiente URL. Registre la URL resultante para utilizarla más adelante como *job\$1document\$1path*

   ```
   https://s3_bucket_name.s3.AWS_Region.amazonaws.com/hello-world-job.json
   ```
**nota**  
AWS la seguridad le impide abrir esta URL fuera de la suya Cuenta de AWS, por ejemplo, mediante un navegador. El motor de AWS IoT trabajos, que tiene acceso al archivo, utiliza la URL de forma predeterminada. En un entorno de producción, tendrá que asegurarse de que sus servicios de AWS IoT tengan permiso para acceder a los documentos de trabajo almacenados en Amazon S3.

Una vez que haya guardado la URL del documento de trabajo, continúe con [Ejecute un trabajo AWS IoT para un dispositivo de IoT](#iot-dc-runjobs-prepare-define-job).

## Ejecute un trabajo AWS IoT para un dispositivo de IoT
<a name="iot-dc-runjobs-prepare-define-job"></a>

Los procedimientos de esta sección inician el cliente del AWS IoT dispositivo en su Raspberry Pi para ejecutar el agente de tareas en el dispositivo y esperar a que se ejecuten las tareas. También crea un recurso de trabajo en AWS IoT, que enviará el trabajo a tu dispositivo IoT y se ejecutará en él.

**nota**  
Este procedimiento ejecuta un trabajo en un solo dispositivo.

**Para iniciar el agente de trabajos en su Raspberry Pi:**

1. En la ventana de terminal de tu ordenador host local que está conectado a tu Raspberry Pi, ejecuta este comando para iniciar el cliente del AWS IoT dispositivo.

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-jobs-config.json
   ```

1. En la ventana del terminal, confirma que el AWS IoT dispositivo es cliente y muestra estos mensajes

   ```
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Jobs is enabled
                         .
                         .
                         .
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Client base has been notified that Jobs has started
   2021-11-15T18:45:56.708Z [INFO]  {JobsFeature.cpp}: Running Jobs!
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to startNextPendingJobExecution accepted and rejected
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to nextJobChanged events
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusAccepted for jobId +
   2021-11-15T18:45:56.738Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionAccepted with code {0}
   2021-11-15T18:45:56.739Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusRejected for jobId +
   2021-11-15T18:45:56.753Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToNextJobChanged with code {0}
   2021-11-15T18:45:56.760Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobRejected with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobAccepted with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionRejected with code {0}
   2021-11-15T18:45:56.777Z [DEBUG] {JobsFeature.cpp}: Publishing startNextPendingJobExecutionRequest
   2021-11-15T18:45:56.785Z [DEBUG] {JobsFeature.cpp}: Ack received for StartNextPendingJobPub with code {0}
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1. En la ventana del terminal, cuando vea este mensaje, continúe con el siguiente procedimiento y cree el recurso de trabajo. Tenga en cuenta que puede que no sea la última entrada de la lista.

   ```
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

**Para crear un recurso de AWS IoT trabajo**

1. En el ordenador host local:

   1. *job\$1document\$1url*Sustitúyalo por la URL del documento de trabajo de[Creación y almacenamiento del documento de trabajo de IoT](#iot-dc-runjobs-prepare-define-jobdoc).

   1. *thing\$1arn*Reemplácelo por el ARN del recurso que creó para su dispositivo y, a continuación, ejecute este comando.

      ```
      aws iot create-job \
      --job-id hello-world-job-1 \
      --document-source "job_document_url" \
      --targets "thing_arn" \
      --target-selection SNAPSHOT
      ```

      Si se ejecuta correctamente, el comando devuelve un resultado como este.

      ```
      {
        "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
        "jobId": "hello-world-job-1"
      }
      ```

1. En la ventana del terminal, deberías ver un resultado del cliente del AWS IoT dispositivo como este.

   ```
   2021-11-15T18:02:26.688Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Job ids differ
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: Executing job: hello-world-job-1
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Assuming executable is in PATH
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: About to execute: echo Hello world!
   2021-11-15T18:10:24.890Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken 3TEWba9Xj6 in the updateJobExecution promises map
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process now running
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process about to call execvp
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Parent process now running, child PID is 16737
   2021-11-15T18:10:24.891Z [DEBUG] {16737}: Hello world!
   2021-11-15T18:10:24.891Z [DEBUG] {JobEngine.cpp}: JobEngine finished waiting for child process, returning 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job exited with status: 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job executed successfully!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.892Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.892Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken GmQ0HTzWGg in the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken 3TEWba9Xj6 from the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:24.917Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken GmQ0HTzWGg from the updateJobExecution promises map
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:25.861Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1. Mientras el cliente del AWS IoT dispositivo está en ejecución y esperando un trabajo, puede enviar otro trabajo cambiando el `job-id` valor y volviendo a ejecutar el **create-job** del paso 1.

Cuando termines de ejecutar las tareas, en la ventana del terminal, ingresa ^C (Control-C) para detener el cliente del AWS IoT dispositivo.