[AWS] IoT Core Job

Joney의 SW 공부 블로그·2023년 5월 17일
0

AWS IoT Core

목록 보기
5/7

IoT Core Job의 기본 개념

  • 하나 이상의 디바이스로 전송되고 실행되는 원격 작업
  • 작업을 실행할 디바이스를 지정하거나 디바이스 그룹을 지정해서 여러개의 디바이스에 작업을 실행
    • 예시) 애플리케이션 다운로드 및 설치, 펌웨어 업데이트, 재부팅

작업 문서

  • 디바이스에서 수행할 원격 작업을 설명하는 문서
  • JSON 형식의 파일
{
  "version": "1.0",
  "steps": [
    {
      "action": {
        "name": "Run-Command_01",
        "type": "runCommand",
        "input": {
          "command": "${aws:iot:parameter:command}"
        },
        "runAsUser": "${aws:iot:parameter:runAsUser}"
      }
    },
    {
      "action": {
        "name": "Run-Command_02",
        "type": "runCommand",
        "input": {
          "command": "${aws:iot:parameter:command}"
        },
        "runAsUser": "${aws:iot:parameter:runAsUser}"
      }
    }
  ]
}

작업 유형

  • 스냅샷
    • 대상이 작업을 마치면 작업 완료
  • 연속 작업
    • 작업이 계속 진행되며, 새로운 디바이스가 작업 그룹에 추가되면 새 디바이스에도 배포

작업 구성 개념

롤아웃

  • 디바이스에 대기 중인 작업을 얼마나 빨리 알릴지 지정
  • 분당 알릴 최대 작업 대상 수를 지정하려면 상수 롤아웃 사용
  • 임계값이 충족되면 기하급수적 롤아웃 속도를 사용해 배포 가능
  • 분당 최대값을 정하는 일정 비율 롤아웃과 증분을 설정하는 지수 비율 롤아웃 중 선택
  • 지수 비율 롤아웃 구성 예시
    • 분당 50개의 디바이스에 알림 속도, 증분 2, 알림을 받고 성공한 분당 디바이스 수 1000으로 설정
    • 분당 50개의 작업 속도로 시작되고 1000개의 디바이스가 작업을 수신하거나 1000개의 작업이 성공할 때까지 해당 속도로 지속
    • 임계를 넘으면 분당 알림 속도와 임계값 변경

예약

  • 예약 기능을 사용하면 연속 작업과 스냅샷 작업에서 디바이스에 대한 작업 문서의 롤아웃 기간을 예약
  • 작업 단위로 설정 가능하며,  한 작업 안에 나눠져 있는 개별 작업(step) 별로 설정은 불가능
  • 시작 날짜 시간, 종료 날짜 시간, 종료 동작을 설정
    • STOP_ROLLOUT
      • 작업 대상 그룹의 나머지 디바이스의 작업 롤아웃 중지 (기본 동작)
    • CANCEL
      • 작업 대상 그룹의 나머지 디바이스의 작업 롤아웃 중지, QUEUED 작업은 취소, IN_PROGRESS 작업은 계속 실행
    • FORCE_CANCEL
      • 작업 대상 그룹의 나머지 디바이스의 작업 롤아웃 중지, QUEUED, IN_PROGRESS 작업 모두 취소

중단

  • 지정된 특정 기준을 충족하지 않으면 롤아웃을 취소할 조건 생성
  • 실패 유형(FAILED, REJECTED, TIMED_OUT, 모두)과 임계값 비율, 최소 디바이스 수를 설정
  • 작업 실패 수가 임계값 비율에 도달하고, 작업이 최소 디바이스 수에 배포된 경우 작업이 취소

작업 실행 제한 시간

  • 작업 배포가 예상치 않게 장시간 IN_PROGRESS 상태일 때 알림
  • 작업이 IN_PROGRESS 상태이면 작업 배포 진행 상황을 모니터링
  • 진행 중 타이머
    • 1분 ~ 7일 사이 값을 지정 가능
    • 작업 실행 전에는 타이머 값 업데이트 가능
    • 해당 작업의 모든 step에 타이머 적용
    • 제한 시간보다 길게 IN_PROGRESS 상태인 경우 작업 상태를 TIMED_OUT으로 하며 작업은 실패함
  • 단계 타이머
    • 진행 중 타이머에는 영향을 끼치지 않으며, 작업이 업데이트 될 때마다 단계 타이머에 새 값 설정 가능
    • 제한 시간보다 길게 IN_PROGRESS 상태인 경우 작업 상태를 TIMED_OUT으로 하며 작업은 실패함

재시도

  • 작업이 실패하거나 시간이 초과되는 경우 작업을 재시도
  • 최대 10번 재실행 가능
  • 재시도 진행 상황,  성공 여부 모니터링
  • 실패 유형에 대해 재시도 횟수 설정

작업 및 작업 실행 상태

작업 상태

  • SCHEDULED
    • 작업 생성 시, 예약 구성을 한 경우, 작업은 SCHEDULED 상태로 생성 됨
    • 작업 시작 시간이 되면 IN_PROGRESS 가 되고 모든 디바이스에 롤아웃 되기 시작함
  • IN_PROGRESS
    • 작업이 생성되면, IN_PROGRESS 상태가 되며, 디바이스에 롤아웃 됨
    • 작업이 완료될 때까지 대기
  • COMPLETED
    • 작업 실행이 SUCCEEDED, FAILED, TIMED_OUT, REMOVED 또는 CANCELED와 같은 종료 상태가 되면 작업 상태가 COMPLETED로 변경
  • CANCELED
    • 작업 중단 구성을 사용하여 작업이 취소된 경우 CANCELED로 변경
  • DELETION_IN_PROGRESS
    • 작업을 삭제하면 작업 상태가 DELETION_IN_PROGRESS로 변경

작업 실행 상태

  • QUEUED
    • 디바이스에 작업이 롤아웃 되면 작업 실행 상태가 QUEUED가 됨
    • 디바이스가 작업을 시작하면 IN_PROGRESS로 변경됨
    • 사용자가 취소하거나, 중단 구성의 중단 조건이 충족되면, CANCELED로 변경됨
    • 디바이스가 삭제되거나, 디바이스 그룹에서 제거되면 REMOVED로 변경됨

  • IN_PROGRESS
    • 디바이스가 StartPendingJobExecution API 또는 UpdateJobExecution API를 호출해서 작업 실행 상태를 IN_PROGRESS로 변경

  • SUCEEDED
    • 디바이스는 원격 작업을 성공적으로 완료할 경우 SUCCEEDED 상태로 UpdateJobExecution API를 호출

  • FAILED
    • 디바이스는 원격 작업을 완료하지 못할 경우 FAILED상태로 UpdateJobExecution API를 호출
    • 재시도 구성을 했을 경우, 해당 디바이스에 대해 작업 실행을 재시도할 수 있음

  • TIMED_OUT
    • 상태가 IN_PROGRESS인 경우, 디바이스가 작업 단계를 완료하지 못하거나 진행 중인 타이머의 제한 시간 내에 원격 작업을 완료하지 못할 경우 AWS IoT Core는 작업 실행 상태를 TIMED_OUT으로 설정
    • 재시도 구성을 했을 경우, 해당 디바이스에 대해 작업 실행을 재시도할 수 있음

  • REJECTED

    • 디바이스는 유효하지 않거나 호환되지 않는 요청을 수신할 경우 REJECTED 상태로 UpdateJobExecution API를 호출
  • REMOVED

    • 디바이스가 사물 그룹에서 분리된 경우와 같이 디바이스가 더 이상 작업 실행의 유효한 대상이 아닌 경우 AWS IoT Core는 작업 실행 상태를 REMOVED로 설정
  • CANCELED

    • 사용자가 작업 실행을 취소하거나 작업 중단 구성을 사용하여 지정된 중단 기준이 충족되는 경우 AWS IoT Core는 작업을 취소하고 작업 실행 상태를 CANCELED로 설정

디바이스 워크플로우

1. 디바이스를 온라인에 연결 시

  • 디바이스 시작 시, 디바이스는 아래의 topic을 구독해서, 디바이스에 생성된 작업의 정보를 가져옴 

  • $aws/things/{thing-name}/jobs/notify

    • 보류 중인 작업 실행 목록에서 작업 실행이 추가되거나 제거될 때 알림을 받으려면 이 주제를 구독
    • 새 작업이 생성되면 AWS IoT Core는 대상이 되는 디바이스 마다 해당 주제에 메시지를 개시
      {
        "timestamp" : 10011,
        "jobs" : {
          "IN_PROGRESS" : [ {
            "jobId" : "other-job",
            "queuedAt" : 10003,
            "lastUpdatedAt" : 10009,
            "executionNumber" : 1,
            "versionNumber" : 1
          } ],
          "QUEUED" : [ {
            "jobId" : "this-job",
            "queuedAt" : 10011,
            "lastUpdatedAt" : 10011,
            "executionNumber" : 1,
            "versionNumber" : 0
          } ]
        }
      }
  • $aws/things/{thing-name}/jobs/notify-next
    • 보류 중인 다음 작업 실행이 변경될 때 알림을 받으려면 이 주제를 구독
    • 작업 queue에 가장 먼저 진행되어야 할 작업에 대한 알림을 받을 수 있음
      {
          "timestamp": 1517186269,
          "execution": {
            "jobId": "job2",
            "status": "QUEUED",
            "queuedAt": 1517017191,
            "lastUpdatedAt": 1517017191,
            "versionNumber": 1,
            "executionNumber": 1,
            "jobDocument": {
              "operation": "test"
            }
          }
      }
  • $aws/things/{thing-name}/jobs/{request-name}/accepted
    • request-name은 GET과 같은 요청의 이름
    • 요청에 성공하면 AWS IoT Core는 $aws/things/{thing-name}/jobs/get/accepted 주제에 대한 성공 메시지를 게시
  • $aws/things/{thing-name}/jobs/{request-name}/rejected
    • 요청에 실패하면 AWS IoT Core이 $aws/things/{thing-name}/jobs/get/rejected 주제에 실패 메시지를 게시

2. 디바이스에 생성되어 있는 작업 가져오기

방법 1 (실행 가능한 작업에서 선택)

  • $aws/things/{thing-name}/jobs/get

    • 지정된 사물에 대해 종료 상태가 아닌 사물의 모든 작업 목록을 가져옴
    { "clientToken": "string" } // 요청과 응답을 일치 시키기 위한 항목
  • AWS IoT Core는 $aws/things/{thing-name}/jobs/get/accepted 에 응답을 게시
    (요청 거절일 경우 $aws/things/{thing-name}/jobs/get/rejected에 게시)

    {
      "inProgressJobs" : [
          {
              "jobId": "string",
              "queuedAt": timestamp,
              "startedAt": timestamp,
              "lastUpdatedAt": timestamp,
              "versionNumber": "number",
              "executionNumber": long 
          }
      ], 
      "queuedJobs" : [
          {
              "jobId": "string",
              "queuedAt": timestamp,
              "startedAt": timestamp,
              "lastUpdatedAt": timestamp,
              "versionNumber": "number",
              "executionNumber": long 
          }
      ],
      "timestamp" : "timestamp",
      "clientToken" :  "string"
    }
  • $aws/things/{thing-name}/jobs/{job-id}/get

    • 해당 주제에 job-id를 지정하여 메시지를 게시하면 해당 작업에 대한 세부 정보를 받을 수 있음
      { 
          "executionNumber": long, // (option) 디바이스에서 작업 실행을 식별하기 위한 숫자, 지정하지 않으면 최신 작업 실행이 반환
          "includeJobDocument": boolean, // (option) 작업 문서 포함 여부, 기본값 true
          "clientToken": "string" 
      }
  • AWS IoT Core는 $aws/things/{thing-name}/jobs/{job-id}/get/accepted 에 응답을 게시
    (요청 거절일 경우 $aws/things/{thing-name}/jobs/{job-id}/get/rejected에 게시)

    {
      "execution" : {
        "jobId" : "string",
        "thingName" : "string",
        "jobDocument" : "string",
        "status": "QUEUED|IN_PROGRESS|FAILED|SUCCEEDED|CANCELED|TIMED_OUT|REJECTED|REMOVED",
        "statusDetails": {
            "string": "string"
        },
        "queuedAt" : "timestamp",
        "startedAt" : "timestamp",
        "lastUpdatedAt" : "timestamp",
        "versionNumber" : "number",
        "executionNumber": long
      },
      "timestamp": "timestamp",
      "clientToken": "string"
    }

방법 2 (다음 대기중인 작업 가져오기)

  • $aws/things/{thing-name}/jobs/$next/get
    • 해당 주제에 메시지를 게시하면 다음 대기 중인(IN_PROGRESS, QUEUED) 작업을 가져올 수 있음
  • AWS IoT Core는 $aws/things/{thing-name}/jobs/get/accepted 에 응답을 게시 (요청 거절일 경우 $aws/things/{thing-name}/jobs/get/rejected에 게시)

3. 작업 실행 및 상태 업데이트

  • $aws/things/{thing-name}/jobs/{job-id}/update

    • 해당 주제에 메시지를 게시해서 상태를 업데이트 할 수 있음
      {
          "status": "job-execution-state", // IN_PROGRESS, FAILED, SUCCEEDED, REJECTED
          "statusDetails": { 
              "string": "string" // 작업 실행 상태를 설명하는 이름-값 페어의 모음
              ...
          },
          "expectedVersion": "number", // 예상되는 현재 작업 실행 버전
          "executionNumber": long, // (option) 디바이스에서 작업 실행을 식별하기 위한 숫자
          "includeJobExecutionState": boolean, // (option) true로 설정하면 응답에 JobExecutionState 필드가 포함. 기본값은 false
          "includeJobDocument": boolean, // (option) true로 설정하면 응답에 JobDocument 필드가 포함. 기본값은 false
          "stepTimeoutInMinutes": long, // 디바이스가 이 작업 실행을 마쳐야 하는 시간을 지정
          "clientToken": "string"
      }
  • AWS IoT Core는 $aws/things/{thing-name}/jobs/{job-id}/get/accepted 에 응답을 게시
    (요청 거절일 경우 $aws/things/{thing-name}/jobs/{job-id}/get/rejected에 게시)


4. 작업 완료

  • $aws/things/{thing-name}/jobs/{job-id}/update
    • 해당 주제에 status를 FAILED 혹은 SUCCEEDED로 해서 메시지를 게시
  • AWS IoT Core는 $aws/things/{thing-name}/jobs/{job-id}/get/accepted 에 응답을 게시
    (요청 거절일 경우 $aws/things/{thing-name}/jobs/{job-id}/get/rejected에 게시)
profile
SW 지식 노트 블로그

0개의 댓글