명령 실행 시작 및 모니터링 - AWS IoT Core

명령 실행 시작 및 모니터링

명령 리소스를 생성한 후 대상 디바이스에서 명령 실행을 시작할 수 있습니다. 디바이스가 명령을 실행하기 시작하면, 명령 실행의 결과 업데이트를 시작하고 상태 업데이트 및 결과 정보를 MQTT 예약 주제에 게시할 수 있습니다. 그러면 명령 실행 상태를 검색하고 계정의 실행 상태를 모니터링할 수 있습니다.

이 섹션에서는 AWS IoT 콘솔과 AWS CLI를 사용하여 명령을 시작하고 모니터링하는 방법을 모두 보여줍니다.

명령 실행 시작

중요

안전하고 관련 법률을 준수하는 방식으로 명령을 배포하는 것은 전적으로 사용자의 책임입니다.

명령 실행을 시작하기 전에 다음을 확인해야 합니다.

  • AWS IoT 네임스페이스에서 명령이 생성되고 페이로드 정보가 제공되었습니다. 명령 실행을 시작하면 디바이스가 페이로드의 지침을 처리하고 지정된 작업을 수행합니다. 명령 생성에 대한 자세한 내용은 명령 리소스 생성 섹션을 참조하세요.

  • 디바이스가 명령에 대한 MQTT 예약 주제를 구독했습니다. 명령 실행을 시작하면 페이로드 정보가 다음 예약된 MQTT 요청 주제에 게시됩니다.

    이 경우 <devices>는 IoT 사물 또는 MQTT 클라이언트일 수 있으며 <DeviceID>는 사물 이름 또는 클라이언트 ID입니다. 지원되는 <PayloadFormat>은 JSON 및 CBOR입니다. 이러한 명령 주제에 대한 자세한 내용은 명령 주제 섹션을 참조하세요.

    $aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>

    <PayloadFormat>이 JSON 및 CBOR가 아닌 경우, 다음은 명령 주제 형식을 보여줍니다.

    $aws/commands/<devices>/<DeviceID>/executions/+/request

명령을 실행하려면, 명령을 수신하고 지정된 지침을 수행할 대상 디바이스를 지정해야 합니다. 대상 디바이스는 AWS IoT 사물일 수도 있고, 디바이스가 AWS IoT 레지스트리에 등록되지 않은 경우에는 클라이언트 ID일 수도 있습니다. 명령 페이로드를 수신한 후 디바이스는 명령 실행을 시작하고 지정된 작업을 수행할 수 있습니다.

AWS IoT 사물

명령의 대상 디바이스는 AWS IoT 사물 레지스트리에 등록한 AWS IoT 사물일 수 있습니다. AWS IoT의 사물을 사용하면 디바이스를 더 쉽게 검색하고 관리할 수 있습니다.

디바이스 연결 페이지에서 또는 CreateThing API를 사용하여 디바이스를 AWS IoT에 연결할 때 디바이스를 사물로 등록할 수 있습니다. AWS IoT 콘솔의 Thing Hub 페이지에서 또는 DescribeThing API를 사용하여 명령을 실행할 기존 사물을 찾을 수 있습니다. 디바이스를 AWS IoT 사물로 등록하는 방법에 대한 자세한 내용은 레지스트리를 사용하여 사물 관리를 참조하세요.

클라이언트 ID

디바이스가 AWS IoT에 사물로 등록되지 않은 경우 클라이언트 ID를 대신 사용할 수 있습니다.

클라이언트 ID는 디바이스 또는 클라이언트에 할당하는 고유 식별자입니다. 클라이언트 ID는 MQTT 프로토콜에 정의되어 있으며 영숫자, 밑줄 또는 대시를 포함할 수 있습니다. AWS IoT에 연결하는 각 디바이스에 고유해야 합니다.

참고
  • 디바이스가 AWS IoT 레지스트리에 사물로 등록된 경우 클라이언트 ID는 사물 이름과 동일할 수 있습니다.

  • 명령 실행이 특정 MQTT 클라이언트 ID를 대상으로 하는 경우, 클라이언트 ID 기반 명령 주제에서 명령 페이로드를 수신하려면 디바이스가 동일한 클라이언트 ID를 사용하여 AWS IoT에 연결되어야 합니다.

클라이언트 ID는 일반적으로 AWS IoT Core에 연결할 때 디바이스가 사용할 수 있는 MQTT 클라이언트 ID입니다. 이 ID는 AWS IoT에서 각 특정 디바이스를 식별하고 연결 및 구독을 관리하는 데 사용됩니다.

제한 시간은 디바이스가 명령 실행 결과를 제공할 수 있는 기간(초)이 만료되는 시간을 나타냅니다.

명령 실행을 생성하면 타이머가 시작됩니다. 디바이스가 오프라인 상태가 되거나 시간 초과 기한 내에 실행 결과를 보고하지 못한 경우, 명령 실행 시간이 초과되고 실행 상태는 TIMED_OUT으로 보고됩니다.

이 필드는 선택 사항이며, 값을 지정하지 않을 경우 기본값은 10초입니다. 또한 최대 12시간으로 제한 시간을 구성할 수 있습니다.

제한 시간 값 및 TIMED_OUT 명령 실행 상태

클라우드와 디바이스 모두에서 제한 시간 초과가 보고될 수 있습니다.

명령이 디바이스로 전송되면 타이머가 시작됩니다. 위에서 설명한 대로 지정된 제한 시간 내에 디바이스로부터 응답을 받지 못한 경우를 살펴봅니다. 이 경우, 클라우드는 명령 실행 상태를 TIMED_OUT으로 설정하고 이유 코드는 $NO_RESPONSE_FROM_DEVICE로 설정합니다.

이는 다음 경우 중 하나에서 발생할 수 있습니다.

  • 명령을 실행하는 동안 디바이스가 오프라인 상태가 되었습니다.

  • 디바이스가 지정된 기간 내에 명령 실행을 완료하지 못했습니다.

  • 디바이스가 제한 시간 내에 업데이트된 상태 정보를 보고하지 못했습니다.

이 경우에 실행 상태가 클라우드에서 TIMED_OUT으로 보고되면 명령 실행은 비터미널 상태입니다. 디바이스는 상태를 터미널 상태인 SUCCEEDED, FAILED 또는 REJECTED로 재정의하는 응답을 게시할 수 있습니다. 이제 명령 실행이 터미널 상태가 되고 추가 업데이트를 수락하지 않습니다.

또한 디바이스는 명령을 실행할 때 시간 초과가 발생했음을 보고하여 클라우드에서 시작된 TIMED_OUT 상태를 업데이트할 수 있습니다. 이 경우에 명령 실행 상태는 TIMED_OUT으로 유지되지만 statusReason 객체가 디바이스에서 보고한 정보를 기반으로 업데이트됩니다. 이제 명령 실행이 터미널 상태가 되고 추가 업데이트를 수락하지 않습니다.

MQTT 영구 세션 사용

MQTT 영구 세션에서 AWS IoT Device Management 명령 기능을 사용하도록 구성할 수 있습니다. 이 기능은 디바이스가 오프라인 상태가 되고 디바이스가 제한 시간 전에 다시 온라인 상태가 될 때 명령을 계속 수신하고 지정된 지침을 수행하는지 확인하려는 경우에 특히 유용합니다.

기본적으로 MQTT 영구 세션 만료는 60분으로 설정됩니다. 명령 실행 제한 시간이 이 기간보다 긴 값으로 구성된 경우, 메시지 브로커가 60분보다 더 오래 실행하는 명령 실행을 거부하여 명령이 실패할 수 있습니다. 지속 시간이 60분을 초과하는 명령을 실행하려면 영구 세션 만료 시간을 늘리도록 요청할 수 있습니다.

참고

MQTT 영구 세션 기능을 올바르게 사용하려면 지우고 시작 플래그를 0으로 설정해야 합니다. 자세한 내용은 MQTT 영구 세션을 참조하세요.

콘솔에서 명령 실행을 시작하려면 AWS IoT 콘솔의 Command Hub 페이지로 이동하여 다음 단계를 수행합니다.

  1. 생성한 명령을 실행하려면 명령 실행을 선택합니다.

  2. 생성한 명령, 페이로드 파일 및 형식 유형, 예약된 MQTT 주제에 대한 정보를 검토합니다.

  3. 명령을 실행할 대상 디바이스를 지정합니다. 디바이스가 AWS IoT에 등록된 경우 AWS IoT 사물로 지정할 수 있고, 디바이스가 아직 등록되지 않은 경우 클라이언트 ID를 사용할 수 있습니다. 자세한 내용은 대상 디바이스 고려 사항 섹션을 참조하세요.

  4. (선택 사항) 제한 시간을 초과하기 전에 명령을 실행할 기간을 결정하는 명령의 제한 시간 값을 구성합니다. 명령을 60분 이상 실행해야 하는 경우, MQTT 영구 세션 만료 시간을 늘려야 할 수 있습니다. 자세한 내용은 명령 실행의 제한 시간 고려 사항 섹션을 참조하세요.

  5. 명령 실행을 선택합니다.

StartCommandExecution HTTP 데이터 플레인 API 작업을 사용하여 명령 실행을 시작합니다. API 요청 및 응답은 명령 실행 ID와 상관관계를 가집니다. 디바이스가 명령 실행을 완료한 후, 명령 응답 주제에 메시지를 게시하여 상태 및 실행 결과를 클라우드에 보고할 수 있습니다. 사용자 지정 응답 코드의 경우, 소유한 애플리케이션 코드는 응답 메시지를 처리하고 결과를 AWS IoT에 게시할 수 있습니다.

디바이스가 명령 요청 주제를 구독한 경우에 StartCommandExecution API는 페이로드 메시지를 주제에 게시합니다. 페이로드는 원하는 형식을 사용할 수 있습니다. 자세한 내용은 명령 페이로드 섹션을 참조하세요.

$aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>

페이로드 형식이 JSON 또는 CBOR이 아닌 경우, 다음은 명령 요청 주제의 형식을 보여줍니다.

$aws/commands/<devices>/<DeviceID>/executions/+/request

샘플 IAM 정책

이 API 작업을 사용하기 전에 IAM 정책이 디바이스에서 이 작업을 수행할 수 있는 권한을 부여하는지 확인합니다. 다음은 사용자가 StartCommandExecution 작업을 수행할 수 있도록 허용하는 IAM 정책 예시입니다.

대체 예시:

  • region 대신 AWS 리전(예: ap-south-1)로 대체합니다.

  • account-id 대신 AWS 계정 번호(예: 123456789012)로 대체합니다.

  • command-id 대신 AWS IoT 명령의 고유 식별자(예: LockDoor)로 대체합니다. 둘 이상의 명령을 보내려면 IAM 정책에서 이러한 명령을 지정할 수 있습니다.

  • 디바이스가 AWS IoT 사물로 등록되었는지 또는 MQTT 클라이언트로 지정되었는지에 따라 devicesthing 또는 client로 대체합니다.

  • device-id을 사용자의 AWS IoT, thing-name 또는 client-id로 대체합니다.

{ "Effect": "Allow", "Action": [ "iot:StartCommandExecution" ], "Resource": [ "arn:aws:iot:region:account-id:command/command-id", "arn:aws:iot:region:account-id:devices/device-id" ] }

계정별 데이터 플레인 엔드포인트 획득

API 명령을 실행하기 전에 엔드포인트에 대한 계정별 엔드포인트 URL을 얻어야 합니다. 듀얼 스택 엔드포인트(IPv4 및 IPv6)를 사용하는 경우 iot:Data-ATS를 사용합니다. iot:Jobs 엔드포인트는 IPv4 전용입니다. 예를 들면 다음 명령을 실행하는 경우

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

아래 샘플 응답과 같이 계정별 엔드포인트 URL을 반환합니다.

{ "endpointAddress": "<account-specific-prefix>-ats.iot.<region>.api.com" }

명령 실행 시작 예제(AWS CLI)

다음 예제에서는 start-command-execution AWS CLI 명령을 사용하여 명령 실행을 시작하는 방법을 보여줍니다.

대체 예시:

  • <command-arn>대신 실행하려는 명령의 ARN을 사용합니다. create-command CLI 명령의 응답에서 이 정보를 얻을 수 있습니다. 예를 들어, 조향 모드를 변경하는 명령을 실행하는 경우 arn:aws:iot:region:account-id:command/SetComfortSteeringMode를 사용합니다.

  • <target-arn>대신 명령을 실행하려는 IoT 사물 또는 MQTT 클라이언트일 수 있는 대상 디바이스의 사물 ARN을 사용합니다. 예를 들어, 대상 디바이스 myRegisteredThing에 대해 명령을 실행하는 경우 arn:aws:iot:region:account-id:thing/myRegisteredThing을 사용합니다.

  • <endpoint-url> 대신 계정별 데이터 플레인 엔드포인트 획득에서 얻은 계정별 엔드포인트를 사용하며 https://가 접두사로 붙습니다. 예를 들어 https://123456789012abcd.jobs.iot.ap-south-1.amazonaws.com입니다.

  • (선택 사항) StartCommandExecution API 작업을 수행할 때 추가 파라미터로 executionTimeoutSeconds를 지정할 수도 있습니다. 이 선택 필드는 디바이스가 명령 실행을 완료해야 하는 시간을 초 단위로 지정합니다. 기본값은 10초입니다. 명령 실행 상태가 CREATED이면 타이머가 시작됩니다. 타이머가 만료되기 전에 명령 실행 결과가 수신되지 않으면 상태가 자동으로 TIMED_OUT으로 변경됩니다.

aws iot-jobs-data start-command-execution \ --command-arn <command-arn> \ --target-arn <target-arn> \ --endpoint <endpoint-url> \ --execution-timeout-seconds 900

이 명령을 실행하면 명령 실행 ID가 반환됩니다. 이 ID를 사용하여 명령 실행 상태, 세부 정보 및 명령 실행 기록을 쿼리할 수 있습니다.

참고

명령이 더 이상 사용되지 않는 경우, StartCommandExecution API 요청은 검증 예외로 실패합니다. 이 오류를 해결하려면, 먼저 UpdateCommand API를 사용하여 명령을 복원한 다음 StartCommandExecution 요청을 수행합니다.

{ "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542" }

명령 실행 결과 업데이트

UpdateCommandExecution MQTT 데이터 플레인 API 작업을 사용하여 명령 실행의 상태 또는 결과를 업데이트합니다.

참고

이 API를 사용하기 전에:

  • 디바이스가 MQTT 연결을 설정하고 명령 요청 및 응답 주제를 구독해야 합니다. 자세한 내용은 상위 수준 명령 워크플로 섹션을 참조하세요.

  • StartCommandExecution API 작업을 사용하여 이 명령을 이미 실행했어야 합니다.

이 API 작업을 사용하기 전에 IAM 정책이 디바이스에 이러한 작업을 수행할 수 있는 권한을 부여해야 합니다. 다음은 디바이스에 작업을 수행할 권한을 부여하는 정책의 예입니다. 사용자 권한이 UpdateCommandExecution 작업을 수행하도록 허용하는 추가 샘플 IAM 정책은 연결 및 게시 정책 예제 섹션을 참조하세요.

대체 예시:

  • Region 대신 AWS 리전(예: ap-south-1)로 대체합니다.

  • AccountID 대신 AWS 계정 번호(예: 123456789012)로 대체합니다.

  • ThingName 대신 명령 실행을 대상으로 하는 AWS IoT 사물의 이름(예: myRegisteredThing)으로 대체합니다.

  • commands-request-topiccommands-response-topic 대신AWS IoT 명령 요청 및 응답 주제의 이름으로 대체합니다. 자세한 내용은 상위 수준 명령 워크플로 섹션을 참조하세요.

MQTT 클라이언트 ID에 대한 샘플 IAM 정책

다음 코드는 MQTT 클라이언트 ID를 사용할 때의 샘플 디바이스 정책을 보여줍니다.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/json" ] }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/request", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/accepted", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/rejected", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/request/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/request", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/accepted", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/rejected", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/request/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:us-east-1:123456789012:client/${iot:ClientId}" } ] }

IoT 사물에 대한 샘플 IAM 정책

다음 코드는 AWS IoT 사물을 사용할 때의 샘플 디바이스 정책을 보여줍니다.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/request", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/accepted", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/rejected", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/request/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/request", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/accepted", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/rejected", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/request/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:us-east-1:123456789012:client/${iot:ClientId}" } ] }

요청 주제에서 명령 실행이 수신되면 디바이스는 명령을 처리합니다. 그런 다음 UpdateCommandExecution API를 사용하여 명령 실행의 상태 및 결과를 다음 응답 주제로 업데이트합니다.

$aws/commands/<devices>/<DeviceID>/executions/<ExecutionId>/response/<PayloadFormat>

이 예제에서 <DeviceID>는 대상 디바이스의 고유 식별자이고, <execution-id>는 대상 디바이스에서 명령 실행의 식별자입니다. <PayloadFormat>은 JSON 또는 CBOR일 수 있습니다.

참고

AWS IoT에 디바이스를 등록하지 않은 경우, 사물 이름 대신 클라이언트 ID를 식별자로 사용할 수 있습니다.

$aws/commands/clients/<ClientID>/executions/<ExecutionId>/response/<PayloadFormat>

디바이스의 실행 상태 업데이트 보고

디바이스는 API를 사용하여 명령 실행에 다음과 같은 상태 업데이트를 보고할 수 있습니다. 이러한 상태에 대한 자세한 내용은 명령 실행 상태 섹션을 참조하세요.

  • IN_PROGRESS: 디바이스가 명령 실행을 시작하면 상태를 IN_PROGRESS로 업데이트할 수 있습니다.

  • SUCCEEDED: 디바이스가 명령을 성공적으로 처리하고 실행을 완료하면 디바이스는 응답 주제에 SUCCEEDED로 메시지를 게시할 수 있습니다.

  • FAILED: 디바이스가 명령을 실행하지 못한 경우 응답 주제에 FAILED로 메시지를 게시할 수 있습니다.

  • REJECTED: 디바이스가 명령을 수락하지 못한 경우 응답 주제에 REJECTED로 메시지를 게시할 수 있습니다.

  • TIMED_OUT: 다음과 같은 이유로 명령 실행 상태가 TIMED_OUT으로 변경될 수 있습니다.

    • 명령 실행 결과가 수신되지 않았습니다. 이는 지정된 기간 내에 실행이 완료되지 않았거나, 디바이스가 상태 정보를 응답 주제에 게시하지 못했기 때문에 발생할 수 있습니다.

    • 해당 디바이스는 명령을 실행하려고 시도할 때 시간 초과가 발생했음을 보고합니다.

TIMED_OUT 상태에 대한 자세한 내용은 제한 시간 값 및 TIMED_OUT 명령 실행 상태 섹션을 참조하세요.

UpdateCommandExecution API 사용 시 고려 사항

다음은 UpdateCommandExecution API를 사용할 때 고려해야 할 몇 가지 중요한 사항입니다.

  • 디바이스는 선택적 statusReason 객체를 사용할 수 있으며, 이 객체는 실행에 대한 추가 정보를 제공하기 위해 사용할 수 있습니다. 디바이스에서 이 객체를 제공하는 경우, 객체의 reasonCode 필드는 필수이지만 reasonDescription 필드는 선택 사항입니다.

  • 디바이스가 statusReason 객체를 사용하는 경우, reasonCode는 패턴 [A-Z0-9_-]+을 사용해야 하며 길이는 64자를 초과하지 않습니다. reasonDescription을 제공하는 경우, 길이가 1,024자를 초과하지 않도록 해야 합니다. 개행 문자와 같은 제어 문자를 제외한 모든 문자를 사용할 수 있습니다.

  • 디바이스는 선택적 result 객체를 사용하여 원격 함수 직접 호출의 반환 값과 같은 명령 실행 결과에 대해 정보를 제공할 수 있습니다. result를 제공하는 경우 하나 이상의 항목이 필요합니다.

  • result 필드에서 항목을 키-값 페어로 지정합니다. 각 항목에 대해 데이터 유형 정보를 문자열, 부울 또는 바이너리로 지정해야 합니다. 문자열 데이터 형식은 s 키를 사용하고, 부울 데이터 형식은 b 키를 사용하며, 바이너리 데이터 형식은 bin 키를 사용해야 합니다. 이러한 데이터 형식은 소문자로 작성해야 합니다.

  • UpdateCommandExecution API를 실행할 때 오류가 발생하면 Amazon CloudWatch의 AWSIoTLogsV2 로그 그룹에서 오류를 볼 수 있습니다. 로깅 활성화 및 로그 보기에 대한 자세한 내용은 AWS IoT 로깅 구성 섹션을 참조하세요.

UpdateCommandExecution API 예제

다음 코드는 자동차 배터리 백분율을 예로 들어서 디바이스가 UpdateCommandExecution API를 사용하여 실행 상태를 보고하고, statusReason 필드를 사용하여 상태에 대한 추가 정보를 제공하고, 결과 필드를 사용하여 실행 결과에 대한 정보를 제공하는 방법을 보여줍니다.

{ "status": "IN_PROGRESS", "statusReason": { "reasonCode": "200", "reasonDescription": "Execution_in_progress" }, "result": { "car_battery": { "s": "car battery at 50 percent" } } }

명령 실행 검색

명령을 실행한 후 AWS IoT 콘솔에서 또는 AWS CLI를 사용하여 해당 명령 실행에 대한 정보를 검색할 수 있습니다. 다음 정보를 획득할 수 있습니다.

참고

최신 명령 실행 상태를 검색하려면 디바이스가 아래 설명과 같이 UpdateCommandExecution MQTT API를 사용하여 상태 정보를 응답 주제에 게시해야 합니다. 디바이스가 이 주제에 게시될 때까지 GetCommandExecution API는 상태를 CREATED 또는 TIMED_OUT으로 보고합니다.

생성하는 각 명령 실행에는 다음이 포함됩니다.

  • 명령 실행의 고유 식별자인 실행 ID

  • 명령 실행의 상태. 대상 디바이스에서 명령을 실행하면 명령 실행은 CREATED 상태가 됩니다. 그런 다음 아래에 설명된 대로 다른 명령 실행 상태로 전환할 수 있습니다.

  • 명령 실행의 결과.

  • 고유한 명령 ID 및 실행이 생성된 대상 디바이스

  • 명령 실행이 생성된 시간을 보여주는 시작 날짜

다음 방법 중 하나를 사용하여 콘솔에서 명령 실행을 검색할 수 있습니다.

  • Command Hub 페이지에서

    AWS IoT 콘솔의 Command Hub 페이지로 이동하여 다음 단계를 수행합니다.

    1. 대상 디바이스에서 실행을 생성한 명령을 선택합니다.

    2. 명령 세부 정보 페이지의 명령 내역 탭에 생성한 실행이 표시됩니다. 정보를 검색할 실행을 선택합니다.

    3. 디바이스가 UpdateCommandExecution API를 사용하여 결과 정보를 제공한 경우, 이 페이지의 결과 탭에서 이 정보를 찾을 수 있습니다.

  • Thing Hub 페이지에서

    명령을 실행할 때 AWS IoT 사물을 대상 디바이스로 선택한 경우, Thing Hub 페이지에서 실행 세부 정보를 볼 수 있습니다.

    1. AWS IoT 콘솔의 Thing Hub 페이지로 이동하여 명령 실행을 생성한 사물을 선택합니다.

    2. 사물 세부 정보 페이지의 명령 내역에 생성한 실행이 표시됩니다. 정보를 검색할 실행을 선택합니다.

    3. 디바이스가 UpdateCommandExecution API를 사용하여 결과 정보를 제공한 경우, 이 페이지의 결과 탭에서 이 정보를 찾을 수 있습니다.

GetCommandExecution AWS IoT Core 컨트롤 플레인 HTTP API 작업을 사용하여 명령 실행에 대한 정보를 검색합니다. StartCommandExecution API 작업을 사용하여 이 명령을 이미 실행했어야 합니다.

샘플 IAM 정책

이 API 작업을 사용하기 전에 IAM 정책이 디바이스에서 이 작업을 수행할 수 있는 권한을 부여하는지 확인합니다. 다음은 사용자가 GetCommandExecution 작업을 수행할 수 있도록 허용하는 IAM 정책 예시입니다.

대체 예시:

  • region 대신 AWS 리전(예: ap-south-1)로 대체합니다.

  • account-id 대신 AWS 계정 번호(예: 123456789012)로 대체합니다.

  • command-id 대신 고유 AWS IoT 명령 식별자(예: LockDoor)로 대체합니다.

  • 디바이스가 AWS IoT 사물로 등록되었는지 또는 MQTT 클라이언트로 지정되었는지에 따라 devicesthing 또는 client로 대체합니다.

  • device-id을 사용자의 AWS IoT, thing-name 또는 client-id로 대체합니다.

{ "Effect": "Allow", "Action": [ "iot:GetCommandExecution" ], "Resource": [ "arn:aws:iot:region:account-id:command/command-id", "arn:aws:iot:region:account-id:devices/device-id" ] }

명령 실행 검색 예제

다음 예제에서는 start-command-execution AWS CLI 명령을 사용하여 실행된 명령에 대한 정보를 검색하는 방법을 보여줍니다. 다음 예제에서는 조향 모드를 끄기 위해 실행된 명령에 대한 정보를 검색하는 방법을 보여줍니다.

대체 예시:

  • <execution-id> 대신 정보를 검색하려는 명령 실행의 식별자를 사용합니다.

  • <target-arn> 대신 실행을 대상으로 하는 디바이스의 Amazon 리소스 번호(ARN)를 사용합니다. start-command-execution CLI 명령의 응답에서 이 정보를 얻을 수 있습니다.

  • 선택적으로, 디바이스가 UpdateCommandExection API를 사용하여 실행 결과를 제공한 경우, GetCommandExecution API를 사용하여 GetCommandExecution API의 응답에 명령 실행 결과를 포함할지 여부를 지정할 수 있습니다.

aws iot get-command-execution --execution-id <execution-id> \ --target-arn <target-arn> \ --include-result

이 명령을 실행하면, 명령 실행의 ARN, 실행 상태, 실행이 시작된 시간 및 완료된 시간에 대한 정보를 포함한 응답이 생성됩니다. 또한, 상태에 대한 추가 정보가 포함된 statusReason 객체를 제공합니다. 다양한 상태 및 상태 이유에 대한 자세한 내용은 명령 실행 상태 섹션을 참조하세요.

다음 코드는 API 요청의 샘플 응답을 보여줍니다.

참고

실행 응답의 completedAt 필드는 디바이스가 클라우드에 터미널 상태를 보고하는 시간에 해당합니다. TIMED_OUT 상태인 경우, 디바이스가 제한 시간 초과를 보고할 때만 이 필드가 설정됩니다. 클라우드에서 TIMED_OUT 상태를 설정하면 TIMED_OUT 상태가 업데이트되지 않습니다. 이 제한 시간 초과 동작에 대한 자세한 내용은 명령 실행의 제한 시간 고려 사항 섹션을 참조하세요.

{ "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542", "commandArn": "arn:aws:iot:ap-south-1:123456789012:command/LockDoor", "targetArn": "arn:aws:iot:ap-south-1:123456789012:thing/myRegisteredThing", "status": "SUCCEEDED", "statusReason": { "reasonCode": "DEVICE_SUCCESSFULLY_EXECUTED", "reasonDescription": "SUCCESS" }, "result": { "sn": { "s": "ABC-001" }, "digital": { "b": true } }, "createdAt": "2024-03-23T00:50:10.095000-07:00", "completedAt": "2024-03-23T00:50:10.095000-07:00" }

MQTT 테스트 클라이언트를 사용하여 명령 업데이트 보기

MQTT 테스트 클라이언트를 사용하여, 명령 기능을 사용할 때 MQTT를 통한 메시지 교환을 볼 수 있습니다. 디바이스가 AWS IoT와 MQTT 연결을 설정한 후, 명령을 생성하고 페이로드를 지정한 다음 디바이스에서 실행할 수 있습니다. 명령을 실행할 때, 디바이스가 명령에 대한 MQTT 예약 요청 주제를 구독한 경우 이 주제에 게시된 페이로드 메시지가 표시됩니다.

그러면 디바이스가 페이로드 지침을 수신하고 IoT 디바이스에서 지정된 작업을 수행합니다. 그런 다음 UpdateCommandExecution API를 사용하여 명령 실행 결과 및 상태 정보를 명령에 대한 MQTT 예약 응답 주제에 게시합니다. AWS IoT Device Management는 응답 주제에 대한 업데이트를 수신하고 업데이트된 정보를 저장하고 AWS CloudTrail 및 Amazon CloudWatch에 로그를 게시합니다. 그런 다음 콘솔에서 또는 GetCommandExecution API를 사용하여 최신 명령 실행 정보를 검색할 수 있습니다.

다음 단계에서는 MQTT 테스트 클라이언트를 사용하여 메시지를 관찰하는 방법을 보여줍니다.

  1. AWS IoT 콘솔에서 MQTT 테스트 클라이언트를 엽니다.

  2. 구독 탭에서 다음 주제를 입력한 다음 구독을 선택합니다. 여기서 <thingId>는 AWS IoT에 등록한 디바이스의 사물 이름입니다.

    참고

    AWS IoT 콘솔의 Thing Hub 페이지에서 디바이스의 사물 이름을 찾거나, 디바이스를 사물로 등록하지 않은 경우에는 디바이스 연결 페이지에서 AWS IoT에 연결할 때 디바이스를 등록할 수 있습니다.

    $aws/commands/things/<thingId>/executions/+/request
  3. (선택 사항) 구독 탭에서 다음 주제를 입력하고 구독을 선택할 수도 있습니다.

    $aws/commands/things/+/executions/+/response/accepted/json $aws/commands/things/+/executions/+/response/rejected/json
  4. 명령 실행을 시작하면, 디바이스가 구독한 요청 주제인 $aws/commands/things/<thingId>/executions/+/request를 사용하여 메시지 페이로드가 해당 디바이스로 전송됩니다. MQTT 테스트 클라이언트에는 디바이스가 명령을 처리하는 지침이 포함된 명령 페이로드가 표시됩니다.

  5. 디바이스가 명령 실행을 시작하면, 명령에 대한 다음 MQTT 예약 응답 주제에 상태 업데이트를 게시할 수 있습니다.

    $aws/commands/<devices>/<device-id>/executions/<executionId>/response/json

    예를 들어, 온도를 원하는 값으로 낮추기 위해 차량의 AC를 켜는 명령을 실행했다고 가정해 보겠습니다. 다음 JSON은 차량이 응답 주제에 게시한 샘플 메시지로 명령을 실행하지 못했음을 보여줍니다.

    { "deviceId": "My_Car", "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542", "status": "FAILED", "statusReason": { "reasonCode": "CAR_LOW_ON_BATTERY", "reasonDescription": "Car battery is lower than 5 percent" } }

    이 경우 차량의 배터리를 충전한 다음, 명령을 다시 실행할 수 있습니다.

AWS 계정의 명령 실행 나열

명령을 실행한 후 AWS IoT 콘솔에서 또는 AWS CLI를 사용하여 해당 명령 실행에 대한 정보를 검색할 수 있습니다. 다음 정보를 획득할 수 있습니다.

  • 명령 실행의 고유 식별자인 실행 ID

  • 명령 실행의 상태. 대상 디바이스에서 명령을 실행하면 명령 실행은 CREATED 상태가 됩니다. 그런 다음 아래에 설명된 대로 다른 명령 실행 상태로 전환할 수 있습니다.

  • 고유한 명령 ID 및 실행이 생성된 대상 디바이스

  • 명령 실행이 생성된 시간을 보여주는 시작 날짜

다음 방법 중 하나를 사용하여 콘솔에서 모든 명령 실행을 볼 수 있습니다.

  • Command Hub 페이지에서

    AWS IoT 콘솔의 Command Hub 페이지로 이동하여 다음 단계를 수행합니다.

    1. 대상 디바이스에서 실행을 생성한 명령을 선택합니다.

    2. 명령 세부 정보 페이지에서 명령 내역 탭으로 이동하면 생성한 실행 목록이 표시됩니다.

  • Thing Hub 페이지에서

    명령을 실행할 때 AWS IoT 사물을 대상 디바이스로 선택하고 단일 디바이스에 대해 여러 명령 실행을 생성한 경우, Thing Hub 페이지에서 디바이스의 실행을 볼 수 있습니다.

    1. AWS IoT 콘솔의 Thing Hub 페이지로 이동하여 실행을 생성한 사물을 선택합니다.

    2. 사물 세부 정보 페이지의 명령 내역에 디바이스에 대해 생성한 실행 목록이 표시됩니다.

ListCommandExecutions AWS IoT Core 컨트롤 플레인 HTTP API 작업을 사용하여 계정의 모든 명령 실행을 나열합니다.

샘플 IAM 정책

이 API 작업을 사용하기 전에 IAM 정책이 디바이스에서 이 작업을 수행할 수 있는 권한을 부여하는지 확인합니다. 다음은 사용자가 ListCommandExecutions 작업을 수행할 수 있도록 허용하는 IAM 정책 예시입니다.

대체 예시:

  • region 대신 AWS 리전(예: ap-south-1)로 대체합니다.

  • account-id 대신 AWS 계정 번호(예: 123456789012)로 대체합니다.

  • command-id 대신 고유 AWS IoT 명령 식별자(예: LockDoor)로 대체합니다.

{ "Effect": "Allow", "Action": "iot:ListCommandExecutions", "Resource": * }

명령 실행 나열 예제

다음 예제에서는 AWS 계정에서 명령 실행을 나열하는 방법을 보여줍니다.

명령을 실행할 때 목록을 필터링할 때, targetArn을 사용하여 특정 디바이스에 대해 생성된 명령 실행만 표시할지 또는 commandArn을 사용하여 지정된 특정 명령에 대한 실행만 표시할지 지정해야 합니다.

대체 예시:

  • <target-arn> 대신 실행을 대상으로 하는 디바이스의 Amazon 리소스 번호(ARN)(예: arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f)를 사용합니다.

  • <target-arn> 대신 실행을 대상으로 하는 디바이스의 Amazon 리소스 번호(ARN)(예: arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f)를 사용합니다.

  • <after> 대신 생성된 실행을 나열하려는 시간(예: 2024-11-01T03:00)이 표시됩니다.

aws iot list-command-executions \ --target-arn <target-arn> \ --started-time-filter '{after=<after>}' \ --sort-order "ASCENDING"

이 명령을 실행하면 생성한 명령 실행 목록, 실행이 시작된 시간 및 완료된 시간이 포함된 응답이 생성됩니다. 또한, 상태 정보, 그리고 상태에 대한 추가 정보가 포함된 statusReason 객체도 제공합니다.

{ "commandExecutions": [ { "commandArn": "arn:aws:iot:us-east-1:123456789012:command/TestMe002", "executionId": "b2b654ca-1a71-427f-9669-e74ae9d92d24", "targetArn": "arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f", "status": "TIMED_OUT", "createdAt": "2024-11-24T14:39:25.791000-08:00", "startedAt": "2024-11-24T14:39:25.791000-08:00" }, { "commandArn": "arn:aws:iot:us-east-1:123456789012:command/TestMe002", "executionId": "34bf015f-ef0f-4453-acd0-9cca2d42a48f", "targetArn": "arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f", "status": "IN_PROGRESS", "createdAt": "2024-11-24T14:05:36.021000-08:00", "startedAt": "2024-11-24T14:05:36.021000-08:00" } ] }

다양한 상태 및 상태 이유에 대한 자세한 내용은 명령 실행 상태 섹션을 참조하세요.

명령 실행 삭제

명령 실행을 더 이상 사용하지 않을 경우, 계정에서 영구적으로 제거할 수 있습니다.

참고
  • 명령 실행은 SUCCEEDED, FAILED 또는 REJECTED와 같은 터미널 상태가 된 경우에만 삭제할 수 있습니다.

  • 이 작업은 AWS IoT Core API 또는 AWS CLI를 사용해야만 수행할 수 있습니다. 콘솔에서는 이 작업을 사용할 수 없습니다.

이 API 작업을 사용하기 전에 IAM 정책이 디바이스에 이러한 작업을 수행할 수 있는 권한을 부여해야 합니다. 다음은 디바이스에 작업을 수행할 권한을 부여하는 정책의 예입니다.

대체 예시:

  • Region 대신 AWS 리전(예: ap-south-1)로 대체합니다.

  • AccountID 대신 AWS 계정 번호(예: 123456789012)로 대체합니다.

  • CommandID 대신 실행을 삭제하려는 명령의 식별자로 대체합니다.

  • 디바이스가 AWS IoT 사물로 등록되었는지 또는 MQTT 클라이언트로 지정되었는지에 따라 devicesthing 또는 client로 대체합니다.

  • device-id을 사용자의 AWS IoT, thing-name 또는 client-id로 대체합니다.

{ "Effect": "Allow", "Action": [ "iot:DeleteCommandExecution" ], "Resource": [ "arn:aws:iot:region:account-id:command/command-id", "arn:aws:iot:region:account-id:devices/device-id" ] }

다음 예제에서는 delete-command AWS CLI 명령을 사용하여 명령을 삭제하는 방법을 보여줍니다. 애플리케이션에 따라 <execution-id>를 삭제하려는 명령 실행의 식별자로 대체하고 <target-arn>를 대상 디바이스의 ARN으로 바꿉니다.

aws iot delete-command-execution \ --execution-id <execution-id> \ --target-arn <target-arn>

API 요청이 성공하면 명령 실행은 상태 코드 200을 생성합니다. GetCommandExecution API를 사용하여 명령 실행이 계정에 더 이상 존재하지 않는지 확인할 수 있습니다.