

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# OTA 자습서
<a name="dev-guide-ota-workflow"></a>

이 섹션에는 OTA 업데이트를 사용하여 FreeRTOS를 실행하는 디바이스에서 펌웨어를 업데이트하는 방법을 설명하는 자습서가 포함되어 있습니다. 펌웨어 이미지 외에도 OTA 업데이트를 사용하여 모든 유형의 파일을 AWS IoT에 연결된 디바이스로 보낼 수 있습니다.

 AWS IoT 콘솔 또는를 사용하여 OTA 업데이트를 AWS CLI 생성할 수 있습니다. 콘솔을 사용하면 많은 작업이 자동으로 수행되므로 OTA를 가장 쉽게 시작할 수 있습니다. AWS CLI 는 OTA 업데이트 작업을 자동화하거나, 많은 수의 디바이스로 작업하거나, FreeRTOS에 적합하지 않은 디바이스를 사용할 때 유용합니다. FreeRTOS용 디바이스 검증에 대한 자세한 내용은 [FreeRTOS 파트너](https://aws.amazon.com/partners/dqp/) 웹 사이트를 참조하세요.<a name="create-update"></a>

**OTA 업데이트를 생성하려면**

1. 초기 펌웨어 버전을 하나 이상의 디바이스에 배포합니다.

1. 펌웨어가 올바르게 실행되는지 확인합니다.

1. 펌웨어를 업데이트해야 하는 경우 코드를 변경하고 새 이미지를 빌드합니다.

1. 펌웨어에 수동으로 서명할 경우 서명 후 서명된 펌웨어 이미지를 Amazon S3 버킷에 업로드합니다. 에 코드 서명을 사용하는 경우 서명되지 않은 펌웨어 이미지를 Amazon S3 버킷에 AWS IoT업로드합니다.

1. OTA 업데이트를 생성합니다.

OTA 업데이트를 생성할 때 이미지 전송 프로토콜(MQTT 또는 HTTP)을 지정하거나 둘 다 지정하여 디바이스가 선택할 수 있도록 합니다. 디바이스의 FreeRTOS OTA 에이전트가 업데이트된 펌웨어 이미지를 수신하고 새 이미지의 디지털 서명, 체크섬 및 버전 번호를 확인합니다. 펌웨어 업데이트가 확인된 후 디바이스가 재설정되고 나면 애플리케이션 정의 로직에 따라 업데이트를 커밋합니다. 디바이스에서 FreeRTOS를 실행하고 있지 않은 경우 디바이스에서 실행되는 OTA 에이전트를 구현해야 합니다.

# 초기 펌웨어 설치
<a name="dg-ota-initial-firmware"></a>

펌웨어를 업데이트하려면 OTA 에이전트 라이브러리를 사용하여 OTA 업데이트 작업을 수신하는 초기 펌웨어 버전을 설치해야 합니다. FreeRTOS를 실행하지 않는 경우 이 단계를 건너뜁니다. 대신 OTA 에이전트 구현을 디바이스에 복사해야 합니다.

**Topics**
+ [Texas Instruments CC3220SF-LAUNCHXL에 초기 펌웨어 버전 설치](burn-initial-firmware-ti.md)
+ [Espressif ESP32에 초기 펌웨어 버전 설치](burn-initial-firmware-esp.md)
+ [Nordic nRF52840 DK에 초기 펌웨어 버전 설치](burn-initial-firmware-nordic.md)
+ [Windows 시뮬레이터의 초기 펌웨어](burn-initial-firmware-windows.md)
+ [사용자 지정 보드에 초기 펌웨어 버전 설치](burn-initial-firmware-other.md)

# Texas Instruments CC3220SF-LAUNCHXL에 초기 펌웨어 버전 설치
<a name="burn-initial-firmware-ti"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

이 단계는 [Texas Instruments CC3220SF-LAUNCHXL에 대한 FreeRTOS OTA 데모 다운로드, 빌드, 플래시 및 실행](download-ota-ti.md)에 설명된 대로 `aws_demos` 프로젝트를 이미 빌드했다는 가정하에 작성되었습니다.<a name="burn-demo-ti"></a>

1. Texas Instruments CC3220SF-LAUNCHXL에서 SOP 점퍼를 중간 핀 집합(위치 = 1)에 두고 보드를 재설정합니다.

1. [TI Uniflash 도구](http://www.ti.com/tool/UNIFLASH)를 다운로드한 후 설치합니다.

1. Uniflash를 시작합니다. 구성 목록에서 **CC3220SF-LAUNCHXL**을 선택한 후 **Start Image Creator(이미지 생성자 시작)**를 선택합니다.

1. **새 프로젝트**를 선택합니다.

1. **Start new project(새 프로젝트 시작)** 페이지에서 프로젝트의 이름을 입력합니다. **Device Type(디바이스 유형)**에서 **CC3220SF**를 선택합니다. **Device Mode(디바이스 모드)**에서 **Develop(개발)**을 선택합니다. **프로젝트 생성**을 선택합니다.

1. 터미널 에뮬레이터를 연결 해제합니다.

1. Uniflash 애플리케이션 창의 오른쪽에서 **연결**을 선택합니다.

1. **고급**, **파일**에서 **사용자 파일**을 선택합니다.

1. **파일** 선택기 창에서 **파일 추가** 아이콘 ![\[Document icon representing a file or page.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/add-file.png)을 선택합니다.

1. `/Applications/Ti/simplelink_cc32xx_sdk_version/tools/cc32xx_tools/certificate-playground` 디렉터리로 이동한 후 `dummy-root-ca-cert`, **열기**, **쓰기**를 차례로 선택합니다.

1. **파일** 선택기 창에서 **파일 추가** 아이콘 ![\[Document icon representing a file or page.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/add-file.png)을 선택합니다.

1. 코드 서명 인증서 및 프라이빗 키를 생성한 작업 디렉터리로 이동하여 `tisigner.crt.der`, **열기**, **쓰기**를 차례로 선택합니다.

1. **작업** 드롭다운 목록에서 **Select MCU Image(MCU 이미지 선택)**을 선택한 후 **찾아보기**를 선택하여 디바이스에 쓰기에 사용할 펌웨어 이미지(**aws\$1demos.bin**)를 선택합니다. 이 파일은 `freertos/vendors/ti/boards/cc3220_launchpad/aws_demos/ccs/Debug` 디렉터리에 위치합니다. **Open**을 선택합니다.

   1. 파일 대화 상자에서 파일 이름이 `mcuflashimg.bin`으로 설정되어 있는지 확인합니다.

   1. **공급업체** 확인란을 선택합니다.

   1. **File Token(파일 토큰)**에 **1952007250**을 입력합니다.

   1. **Private Key File Name(프라이빗 키 파일 이름)**에서 **찾아보기**를 선택한 후 코드 서명 인증서와 프라이빗 키를 생성한 작업 디렉터리에서 `tisigner.key`를 선택합니다.

   1. **Certification File Name(인증서 파일 이름)**에서 `tisigner.crt.der`을 선택합니다.

   1. **쓰기**를 선택합니다.

1. 왼쪽 창의 **파일**에서 **서비스 팩**을 선택합니다.

1. **Service Pack File Name(서비스 팩 파일 이름)**에서 **찾아보기**를 선택하고 `simplelink_cc32x_sdk_version/tools/cc32xx_tools/servicepack-cc3x20`으로 이동하여 `sp_3.7.0.1_2.0.0.0_2.2.0.6.bin`을 선택한 후 **열기**를 선택합니다.

1. 왼쪽 창의 **파일**에서 **Trusted Root-Certificate Catalog(신뢰할 수 있는 루트 인증서 카탈로그)**를 선택합니다.

1. **Use default Trusted Root-Certificate Catalog(기본 신뢰할 수 있는 루트 인증서 카탈로그 사용)** 확인란의 선택을 취소합니다.

1. **Source File(소스 파일)**에서 **찾아보기**를 선택하고 **simplelink\$1cc32xx\$1sdk\$1*version*/tools/cc32xx\$1tools/certificate-playground/certcatalogPlayGround20160911.lst**를 선택한 후 **열기**를 선택합니다.

1. **Signature Source File(서명 소스 파일)**에서 **찾아보기**를 선택하고 **simplelink\$1cc32xx\$1sdk\$1*version*/tools/cc32xx\$1tools/certificate-playground/certcatalogPlayGround20160911.lst.signed\$13220.bin**을 선택한 후 **열기**를 선택합니다.

1. ![\[Floppy disk icon representing a save or storage function.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/save.png) 버튼을 선택하여 프로젝트를 저장합니다.

1. ![\[Feather icon representing a lightweight or simplified feature or concept.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/flame.png) 버튼을 선택합니다.

1. **Program Image(Create and Program)(프로그램 이미지[생성 및 프로그램])**을 선택합니다.

1. 프로그래밍 프로세스가 완료되면 SOP 점퍼를 첫 번째 핀 집합(위치 = 0)에 두고 보드를 재설정한 후 터미널 에뮬레이터를 다시 연결하여 Code Composer Studio에서 출력을 디버깅할 때와 출력이 동일한지 확인합니다. 터미널 출력의 애플리케이션 버전 번호를 메모해 두십시오. 나중에 이 버전 번호를 사용하여 OTA 업데이트에 의해 펌웨어가 업데이트되었는지 확인합니다.

   터미널에 다음과 같은 출력이 표시됩니다.

   ```
   0 0 [Tmr Svc] Simple Link task created
   
   Device came up in Station mode
   
   1 369 [Tmr Svc] Starting key provisioning...
   2 369 [Tmr Svc] Write root certificate...
   3 467 [Tmr Svc] Write device private key...
   4 568 [Tmr Svc] Write device certificate...
   SL Disconnect...
   
   5 664 [Tmr Svc] Key provisioning done...
   Device came up in Station mode
   
   Device disconnected from the AP on an ERROR..!! 
   
   [WLAN EVENT] STA Connected to the AP: Guest , BSSID: 11:22:a1:b2:c3:d4
   
   [NETAPP EVENT] IP acquired by the device
   
   
   Device has connected to Guest
   
   Device IP Address is 111.222.3.44 
   
   
   6 1716 [OTA] OTA demo version 0.9.0
   7 1717 [OTA] Creating MQTT Client...
   8 1717 [OTA] Connecting to broker...
   9 1717 [OTA] Sending command to MQTT task.
   10 1717 [MQTT] Received message 10000 from queue.
   11 2193 [MQTT] MQTT Connect was accepted. Connection established.
   12 2193 [MQTT] Notifying task.
   13 2194 [OTA] Command sent to MQTT task passed.
   14 2194 [OTA] Connected to broker.
   15 2196 [OTA Task] Sending command to MQTT task.
   16 2196 [MQTT] Received message 20000 from queue.
   17 2697 [MQTT] MQTT Subscribe was accepted. Subscribed.
   18 2697 [MQTT] Notifying task.
   19 2698 [OTA Task] Command sent to MQTT task passed.
   20 2698 [OTA Task] [OTA] Subscribed to topic: $aws/things/TI-LaunchPad/jobs/$next/get/accepted
   
   21 2699 [OTA Task] Sending command to MQTT task.
   22 2699 [MQTT] Received message 30000 from queue.
   23 2800 [MQTT] MQTT Subscribe was accepted. Subscribed.
   24 2800 [MQTT] Notifying task.
   25 2801 [OTA Task] Command sent to MQTT task passed.
   26 2801 [OTA Task] [OTA] Subscribed to topic: $aws/things/TI-LaunchPad/jobs/notify-next
   
   27 2814 [OTA Task] [OTA] Check For Update #0
   28 2814 [OTA Task] Sending command to MQTT task.
   29 2814 [MQTT] Received message 40000 from queue.
   30 2916 [MQTT] MQTT Publish was successful.
   31 2916 [MQTT] Notifying task.
   32 2917 [OTA Task] Command sent to MQTT task passed.
   33 2917 [OTA Task] [OTA] Set job doc parameter [ clientToken: 0:TI-LaunchPad ]
   34 2917 [OTA Task] [OTA] Missing job parameter: execution
   35 2917 [OTA Task] [OTA] Missing job parameter: jobId
   36 2918 [OTA Task] [OTA] Missing job parameter: jobDocument
   37 2918 [OTA Task] [OTA] Missing job parameter: ts_ota
   38 2918 [OTA Task] [OTA] Missing job parameter: files
   39 2918 [OTA Task] [OTA] Missing job parameter: streamname
   40 2918 [OTA Task] [OTA] Missing job parameter: certfile
   41 2918 [OTA Task] [OTA] Missing job parameter: filepath
   42 2918 [OTA Task] [OTA] Missing job parameter: filesize
   43 2919 [OTA Task] [OTA] Missing job parameter: sig-sha1-rsa
   44 2919 [OTA Task] [OTA] Missing job parameter: fileid
   45 2919 [OTA Task] [OTA] Missing job parameter: attr
   47 3919 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
   48 4919 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
   49 5919 [OTA] [OTA] Queued: 1   Processed: 1   Dropped: 0
   ```

# Espressif ESP32에 초기 펌웨어 버전 설치
<a name="burn-initial-firmware-esp"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

이 안내서는 [Espressif ESP32-DevKitC 및 ESP-WROVER-KIT 시작하기](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html) 및 [무선 업데이트(OTA) 사전 조건](https://docs.aws.amazon.com/freertos/latest/userguide/ota-prereqs.html)의 단계를 이미 수행했다는 가정하에 작성되었습니다. OTA 업데이트를 시도하기 전에 [FreeRTOS 시작하기](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-getting-started.html)에서 설명한 MQTT 데모 프로젝트를 실행하여 보드와 도구 체인이 올바르게 설정되어 있는지 확인할 수 있습니다.

**초기 출고 시 이미지를 보드에 플래시하려면**

1. `freertos/vendors/vendor/boards/board/aws_demos/config_files/aws_demo_config.h`를 열고 `#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED`를 주석으로 처리한 다음 `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` 또는 `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED`를 정의합니다.

1. [OTA 업데이트 사전 조건](ota-prereqs.md)에서 생성한 SHA-256/ECDSA PEM 형식 코드 서명 인증서를 `vendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h`에 복사합니다. 다음 방식으로 형식을 지정해야 합니다.

   ```
   #define otapalconfigCODE_SIGNING_CERTIFICATE  \
   "-----BEGIN CERTIFICATE-----\n" \
   "...base64 data...\n" \
   "-----END CERTIFICATE-----\n";
   ```

1. OTA 업데이트 데모를 선택한 상태에서 [ESP32 시작하기](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html)에 요약된 것과 동일한 단계에 따라 이미지를 빌드 후 플래시합니다. 프로젝트를 이미 빌드하여 플래시한 경우 먼저 `make clean`을 실행해야 할 수 있습니다. `make flash monitor`를 실행하면 다음과 유사한 내용이 표시됩니다. 데모 애플리케이션은 한 번에 여러 작업을 실행하므로 일부 메시지의 순서가 다를 수 있습니다.

   ```
   I (28) boot: ESP-IDF v3.1-dev-322-gf307f41-dirty 2nd stage bootloader
   I (28) boot: compile time 16:32:33
   I (29) boot: Enabling RNG early entropy source...
   I (34) boot: SPI Speed : 40MHz
   I (38) boot: SPI Mode : DIO
   I (42) boot: SPI Flash Size : 4MB
   I (46) boot: Partition Table:
   I (50) boot: ## Label Usage Type ST Offset Length
   I (57) boot: 0 nvs WiFi data 01 02 00010000 00006000
   I (64) boot: 1 otadata OTA data 01 00 00016000 00002000
   I (72) boot: 2 phy_init RF data 01 01 00018000 00001000
   I (79) boot: 3 ota_0 OTA app 00 10 00020000 00100000
   I (87) boot: 4 ota_1 OTA app 00 11 00120000 00100000
   I (94) boot: 5 storage Unknown data 01 82 00220000 00010000
   I (102) boot: End of partition table
   I (106) esp_image: segment 0: paddr=0x00020020 vaddr=0x3f400020 size=0x14784 ( 83844) map
   I (144) esp_image: segment 1: paddr=0x000347ac vaddr=0x3ffb0000 size=0x023ec ( 9196) load
   I (148) esp_image: segment 2: paddr=0x00036ba0 vaddr=0x40080000 size=0x00400 ( 1024) load
   I (151) esp_image: segment 3: paddr=0x00036fa8 vaddr=0x40080400 size=0x09068 ( 36968) load
   I (175) esp_image: segment 4: paddr=0x00040018 vaddr=0x400d0018 size=0x719b8 (465336) map
   I (337) esp_image: segment 5: paddr=0x000b19d8 vaddr=0x40089468 size=0x04934 ( 18740) load
   I (345) esp_image: segment 6: paddr=0x000b6314 vaddr=0x400c0000 size=0x00000 ( 0) load
   I (353) boot: Loaded app from partition at offset 0x20000
   I (353) boot: ota rollback check done
   I (354) boot: Disabling RNG early entropy source...
   I (360) cpu_start: Pro cpu up.
   I (363) cpu_start: Single core mode
   I (368) heap_init: Initializing. RAM available for dynamic allocation:
   I (375) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
   I (381) heap_init: At 3FFC0748 len 0001F8B8 (126 KiB): DRAM
   I (387) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
   I (393) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
   I (400) heap_init: At 4008DD9C len 00012264 (72 KiB): IRAM
   I (406) cpu_start: Pro cpu start user code
   I (88) cpu_start: Starting scheduler on PRO CPU.
   I (113) wifi: wifi firmware version: f79168c
   I (113) wifi: config NVS flash: enabled
   I (113) wifi: config nano formating: disabled
   I (113) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
   I (123) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
   I (133) wifi: Init dynamic tx buffer num: 32
   I (143) wifi: Init data frame dynamic rx buffer num: 32
   I (143) wifi: Init management frame dynamic rx buffer num: 32
   I (143) wifi: wifi driver task: 3ffc73ec, prio:23, stack:4096
   I (153) wifi: Init static rx buffer num: 10
   I (153) wifi: Init dynamic rx buffer num: 32
   I (163) wifi: wifi power manager task: 0x3ffcc028 prio: 21 stack: 2560
   0 6 [main] WiFi module initialized. Connecting to AP <Your_WiFi_SSID>...
   I (233) phy: phy_version: 383.0, 79a622c, Jan 30 2018, 15:38:06, 0, 0
   I (233) wifi: mode : sta (30:ae:a4:80:0a:04)
   I (233) WIFI: SYSTEM_EVENT_STA_START
   I (363) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
   I (1343) wifi: state: init -> auth (b0)
   I (1343) wifi: state: auth -> assoc (0)
   I (1353) wifi: state: assoc -> run (10)
   I (1373) wifi: connected with <Your_WiFi_SSID>, channel 1
   I (1373) WIFI: SYSTEM_EVENT_STA_CONNECTED
   1 302 [IP-task] vDHCPProcess: offer c0a86c13ip
   I (3123) event: sta ip: 192.168.108.19, mask: 255.255.224.0, gw: 192.168.96.1
   I (3123) WIFI: SYSTEM_EVENT_STA_GOT_IP
   2 302 [IP-task] vDHCPProcess: offer c0a86c13ip
   3 303 [main] WiFi Connected to AP. Creating tasks which use network...
   4 304 [OTA] OTA demo version 0.9.6
   5 304 [OTA] Creating MQTT Client...
   6 304 [OTA] Connecting to broker...
   I (4353) wifi: pm start, type:0
   
   I (8173) PKCS11: Initializing SPIFFS
   I (8183) PKCS11: Partition size: total: 52961, used: 0
   7 1277 [OTA] Connected to broker.
   8 1280 [OTA Task] [prvSubscribeToJobNotificationTopics] OK: $aws/things/<Your_Thing_Name>/jobs/$next/get/accepted
   I (12963) ota_pal: prvPAL_GetPlatformImageState
   I (12963) esp_ota_ops: [0] aflags/seq:0x2/0x1, pflags/seq:0xffffffff/0x0
   9 1285 [OTA Task] [prvSubscribeToJobNotificationTopics] OK: $aws/things/<Your_Thing_Name>/jobs/notify-next
   10 1286 [OTA Task] [OTA_CheckForUpdate] Request #0
   11 1289 [OTA Task] [prvParseJSONbyModel] Extracted parameter [ clientToken: 0:<Your_Thing_Name> ]
   12 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: execution
   13 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: jobId
   14 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: jobDocument
   15 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: afr_ota
   16 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: streamname
   17 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: files
   18 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: filepath
   19 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: filesize
   20 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: fileid
   21 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: certfile
   22 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: sig-sha256-ecdsa
   23 1289 [OTA Task] [prvParseJobDoc] Ignoring job without ID.
   24 1289 [OTA Task] [prvOTA_Close] Context->0x3ffbb4a8
   25 1290 [OTA] [OTA_AgentInit] Ready.
   26 1390 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   27 1490 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   28 1590 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   29 1690 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   [ ... ]
   ```

1. 이제 ESP32 보드에서 OTA 업데이트를 수신합니다. ESP-IDF 모니터는 `make flash monitor` 명령에 의해 시작됩니다. **Ctrl\$1]**를 눌러 종료할 수 있습니다. 선호하는 TTY 터미널 프로그램(예: PuTTY, Tera Term, GNU Screen)을 사용하여 보드의 직렬 출력을 수신할 수도 있습니다. 보드의 직렬 포트에 연결할 때 재부팅될 수 있습니다.

# Nordic nRF52840 DK에 초기 펌웨어 버전 설치
<a name="burn-initial-firmware-nordic"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

이 안내서는 [Nordic nRF52840-DK 시작하기](getting_started_nordic.md) 및 [무선 업데이트(OTA) 사전 조건](https://docs.aws.amazon.com/freertos/latest/userguide/ota-prereqs.html)의 단계를 이미 수행했다는 가정하에 작성되었습니다. OTA 업데이트를 시도하기 전에 [FreeRTOS 시작하기](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-getting-started.html)에서 설명한 MQTT 데모 프로젝트를 실행하여 보드와 도구 체인이 올바르게 설정되어 있는지 확인할 수 있습니다.

**초기 출고 시 이미지를 보드에 플래시하려면**

1. `freertos/vendors/nordic/boards/nrf52840-dk/aws_demos/config_files/aws_demo_config.h`를 엽니다.

1. `#define CONFIG_CORE_MQTT_MUTUAL_AUTH_DEMO_ENABLED`을 `CONFIG_OTA_MQTT_UPDATE_DEMO_ENABLED` 또는 `CONFIG_OTA_HTTP_UPDATE_DEMO_ENABLED`로 바꿉니다.

1. OTA 업데이트 데모를 선택한 상태에서 [Nordic nRF52840-DK 시작하기](getting_started_nordic.md)에 요약된 것과 동일한 단계에 따라 이미지를 빌드 후 플래시합니다.

   다음과 유사한 출력 화면이 표시되어야 합니다.

   ```
   9 1285 [OTA Task] [prvSubscribeToJobNotificationTopics] OK: $aws/things/your-thing-name/jobs/notify-next
   10 1286 [OTA Task] [OTA_CheckForUpdate] Request #0
   11 1289 [OTA Task] [prvParseJSONbyModel] Extracted parameter [ clientToken: 0:your-thing-name ]
   12 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: execution
   13 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: jobId
   14 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: jobDocument
   15 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: afr_ota
   16 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: streamname
   17 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: files
   18 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: filepath
   19 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: filesize
   20 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: fileid
   21 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: certfile
   22 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: sig-sha256-ecdsa
   23 1289 [OTA Task] [prvParseJobDoc] Ignoring job without ID.
   24 1289 [OTA Task] [prvOTA_Close] Context->0x3ffbb4a8
   25 1290 [OTA] [OTA_AgentInit] Ready.
   26 1390 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   27 1490 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   28 1590 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   29 1690 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
   ```

   이제 보드에서 OTA 업데이트를 수신합니다.

# Windows 시뮬레이터의 초기 펌웨어
<a name="burn-initial-firmware-windows"></a>

Windows 시뮬레이터를 사용하는 경우 초기 펌웨어 버전을 플래시할 필요가 없습니다. Windows 시뮬레이터는 `aws_demos` 애플리케이션의 일부이며, 펌웨어를 포함합니다.

# 사용자 지정 보드에 초기 펌웨어 버전 설치
<a name="burn-initial-firmware-other"></a>

IDE를 사용하여 `aws_demos` 프로젝트를 빌드합니다. 이때 OTA 라이브러리를 포함해야 합니다. FreeRTOS 소스 코드의 구조에 대한 자세한 내용은 [FreeRTOS 데모](freertos-next-steps.md) 단원을 참조하세요.

FreeRTOS 프로젝트 또는 디바이스에 코드 서명 인증서, 프라이빗 키 및 인증서 신뢰 체인을 포함해야 합니다.

적절한 도구를 사용하여 애플리케이션을 보드에 번인하고 올바르게 실행되는지 확인합니다.

# 펌웨어 버전 업데이트
<a name="dg-ota-update-firmware"></a>

FreeRTOS에 포함된 OTA 에이전트에서 업데이트 버전을 확인한 후 기존 펌웨어 버전보다 최신 버전이 있는 경우에만 해당 버전을 설치합니다. 다음 단계에서는 OTA 데모 애플리케이션의 펌웨어 버전을 높이는 방법을 보여 줍니다.

1. IDE에서 `aws_demos` 프로젝트를 엽니다.

1. ` /vendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h` 파일을 찾아 **APP\$1VERSION\$1BUILD**의 값을 높입니다.

1. 0이 아닌 파일 유형(비 펌웨어 파일)의 Renesas rx65n 플랫폼에 대한 업데이트를 예약하려면 Renesas Secure Flash Programmer 도구를 사용하여 파일에 서명해야 합니다. 그렇지 않으면 디바이스에서 서명 검사가 실패합니다. 이 도구는 Renesas 전용 파일 유형인 `.rsu` 확장명을 사용하여 서명된 파일 패키지를 생성합니다. 이 도구는 [Github](https://github.com/renesas/Amazon-FreeRTOS-Tools)에서 찾을 수 있습니다. 다음 예제 명령을 사용하여 이미지를 생성할 수 있습니다.

   ```
   "Renesas Secure Flash Programmer.exe" CUI Update "RX65N(ROM 2MB)/Secure Bootloader=256KB" "sig-sha256-ecdsa" 1 "file_name" "output_file_name.rsu"
   ```

1. 프로젝트를 다시 빌드합니다.

[업데이트를 저장할 Amazon S3 버킷 생성](dg-ota-bucket.md)에 설명된 대로 펌웨어 업데이트를 생성된 Amazon S3 버킷에 복사해야 합니다. Amazon S3에 복사할 파일 이름은 사용 중인 하드웨어 플랫폼에 따라 다릅니다.
+ Texas Instruments CC3220SF-LAUNCHXL: `vendors/ti/boards/cc3220_launchpad/aws_demos/ccs/debug/aws_demos.bin`
+ Espressif ESP32: `vendors/espressif/boards/esp32/aws_demos/make/build/aws_demos.bin`

# OTA 업데이트 생성(AWS IoT 콘솔)
<a name="ota-console-workflow"></a>

1.  AWS IoT 콘솔의 탐색 창에서 **관리**에서 **원격 작업을** 선택한 다음 **작업을** 선택합니다.

1. **작업 생성**을 선택합니다.

1. **작업 유형**에서 **FreeRTOS OTA 업데이트 작업 생성**을 선택하고 **다음**을 선택합니다.

1. **작업 속성**에서 **작업 이름**을 입력한 후 (선택적으로) 작업에 대한 **설명**을 입력하고 **다음**을 선택합니다.

1. OTA 업데이트를 단일 디바이스 또는 디바이스 그룹에 배포할 수 있습니다. **업데이트할 디바이스**의 드롭다운에서 하나 이상의 사물 또는 사물 그룹을 선택합니다.

1. **파일 전송을 위한 프로토콜 선택**에서 **HTTP** 또는 **MQTT**를 선택하거나 둘 다 선택하여 각 디바이스가 사용할 프로토콜을 결정할 수 있도록 합니다.

1. **서명 및 파일 선택**에서 **나를 위해 새 파일에 서명**을 선택합니다.

1. **코드 서명 프로필**에서 **새 프로필 생성**을 선택합니다.

1. **Create a code signing profile(코드 서명 프로필 생성)**에 코드 서명 프로필의 이름을 입력합니다.

   1. **디바이스 하드웨어 플랫폼**에서 하드웨어 플랫폼을 선택합니다.
**참고**  
FreeRTOS에 적격한 하드웨어 플랫폼만 이 목록에 표시됩니다. 비적격 플랫폼을 테스트하는 경우 서명에 ECDSA P-256 SHA-256 ciphersuite를 사용하면 Windows Simulator 코드 서명 프로파일을 선택하여 호환되는 서명을 생성할 수 있습니다. 정규화되지 않은 플랫폼을 사용 중이고 ECDSA P-256 SHA-256 이외의 ciphersuite를 사용하여 서명하는 경우 용 코드 서명을 사용하거나 펌웨어 업데이트에 직접 서명 AWS IoT할 수 있습니다. 자세한 내용은 [펌웨어 업데이트에 디지털 방식으로 서명](ota-cli-workflow.md#ota-sign-cli) 단원을 참조하십시오.

   1. **코드 서명 인증서**에서 **기존 인증서 선택**을 선택하고 이전에 가져온 인증서를 선택하거나, **새 코드 서명 인증서 가져오기**를 선택하고 파일을 선택한 다음 **가져오기**를 선택하여 새 인증서를 가져옵니다.

   1. **디바이스에 있는 코드 서명 인증서의 경로 이름**에 디바이스에 있는 코드 서명 인증서에 대한 정규화된 경로 이름을 입력합니다. 대부분의 디바이스에서는 이 필드를 비워 둘 수 있습니다. Windows 시뮬레이터 및 인증서를 특정 파일 위치에 저장하는 디바이스의 경우 여기에 경로 이름을 입력합니다.
**중요**  
Texas Instruments CC3220SF-LAUNCHXL에서 코드 서명 인증서가 파일 시스템의 루트에 있는 경우 파일 이름 앞에 슬래시(**/**)를 포함하지 마십시오. 그렇지 않으면 인증 중에 `file not found` 오류가 발생하고 OTA 업데이트가 실패합니다.

   1. **생성**을 선택합니다.

1. **파일**에서 **기존 파일 선택**을 선택한 다음 **S3 찾아보기**를 선택합니다. Amazon S3 버킷 목록이 표시됩니다. 펌웨어 업데이트가 포함된 버킷을 선택한 후 버킷에서 펌웨어 업데이트를 선택합니다.
**참고**  
Microchip Curiosity PIC32MZEF 데모 프로젝트에서는 기본 이름 `mplab.production.bin` 및 `mplab.production.ota.bin`으로 두 이진 이미지를 생성합니다. OTA 업데이트를 위해 이미지를 업로드할 때 두 번째 파일을 사용합니다.

1. **디바이스의 파일 경로 이름**에 OTA 작업이 펌웨어 이미지를 복사할 디바이스의 위치에 대한 정규화된 경로 이름을 입력합니다. 이 위치는 플랫폼마다 다릅니다.
**중요**  
Texas Instruments CC3220SF-LAUNCHXL에서는 보안 제한으로 인해 펌웨어 이미지 경로 이름이 `/sys/mcuflashimg.bin`이어야 합니다.

1. **파일 유형**을 열고 0\$1255 범위의 정수 값을 입력합니다. 입력한 파일 유형은 MCU로 전달되는 작업 문서에 추가됩니다. MCU 펌웨어/소프트웨어 개발자는 이 값으로 수행할 작업에 대한 완전한 소유권을 갖습니다. 가능한 시나리오로는 기본 프로세서와 독립적으로 펌웨어를 업데이트할 수 있는 보조 프로세서가 있는 MCU가 있습니다. 디바이스가 OTA 업데이트 작업을 받으면 파일 유형을 사용하여 업데이트가 필요한 프로세서를 식별할 수 있습니다.

1. **IAM 역할**에서 [OTA 업데이트 서비스 역할 생성](create-service-role.md)의 지침에 따라 역할을 선택합니다.

1. **다음**을 선택합니다.

1. OTA 업데이트 작업에 대한 ID와 설명을 입력합니다.

1. **작업 유형**에서 **작업이 선택한 디바이스/그룹에 배포된 후 완료됩니다(스냅샷)**를 선택합니다.

1. 작업에 적합한 선택적 구성(**작업 실행 롤아웃**, **작업 중단**, **작업 실행 제한 시간** 및 **태그**)을 선택합니다.

1. **생성(Create)**을 선택합니다.<a name="previously-signed"></a>

**이전에 서명된 펌웨어 이미지를 사용하려면**

1. **펌웨어 이미지 선택 및 서명**에서 **이전에 서명된 펌웨어 이미지 선택**을 선택합니다.

1. **디바이스에 있는 펌웨어 이미지의 경로 이름**에 OTA 작업이 펌웨어 이미지를 복사할 디바이스의 위치에 대한 정규화된 경로 이름을 입력합니다. 이 위치는 플랫폼마다 다릅니다.

1. **이전 코드 서명 작업**에서 **선택**을 선택한 후 OTA 업데이트에 사용 중인 펌웨어 이미지에 서명하는 데 사용된 이전 코드 서명 작업을 선택합니다.<a name="custom-signed"></a>

**서명된 사용자 지정 펌웨어 이미지 사용**

1. **펌웨어 이미지 선택 및 서명**에서 **서명된 내 사용자 지정 펌웨어 이미지 사용**을 선택합니다.

1. **디바이스에 있는 코드 서명 인증서의 경로 이름**에 디바이스에 있는 코드 서명 인증서에 대한 정규화된 경로 이름을 입력합니다. 대부분의 디바이스에서는 이 필드를 비워 둘 수 있습니다. Windows 시뮬레이터 및 인증서를 특정 파일 위치에 저장하는 디바이스의 경우 여기에 경로 이름을 입력합니다.

1. **디바이스에 있는 펌웨어 이미지의 경로 이름**에 OTA 작업이 펌웨어 이미지를 복사할 디바이스의 위치에 대한 정규화된 경로 이름을 입력합니다. 이 위치는 플랫폼마다 다릅니다.

1. **서명** 아래에 PEM 형식 서명을 붙여 넣습니다.

1. **원래 해시 알고리즘**에서 파일 서명을 생성할 때 사용한 해시 알고리즘을 선택합니다.

1. **원래 암호화 알고리즘**에서 파일 서명을 생성할 때 사용한 알고리즘을 선택합니다.

1. **Amazon S3에서 펌웨어 이미지 선택**에서 Amazon S3 버킷과 Amazon S3 버킷에 있는 서명된 펌웨어 이미지를 선택합니다.

코드 서명 정보를 지정한 후 OTA 업데이트 작업 유형, 서비스 역할 및 업데이트 ID를 지정합니다.

**참고**  
OTA 업데이트에 대한 작업 ID에 개인 식별 정보(OTA)를 사용하지 마십시오. 개인 식별 정보의 예는 다음과 같습니다.  
이름
IP 주소
이메일 주소
위치
은행 세부 정보
의료 정보

1. **작업 유형**에서 **작업이 선택한 디바이스/그룹에 배포된 후 완료됩니다(스냅샷)**를 선택합니다.

1. **OTA 업데이트 작업의 IAM 역할**에서 OTA 서비스 역할을 선택합니다.

1. 작업에 대한 영숫자 ID를 입력한 후 **생성**을 선택합니다.

작업이 AWS IoT 콘솔에 **진행 중** 상태로 나타납니다.

**참고**  
 AWS IoT 콘솔은 작업 상태를 자동으로 업데이트하지 않습니다. 브라우저를 새로 고쳐 업데이트를 확인합니다.

직렬 UART 터미널을 디바이스에 연결합니다. 디바이스에서 업데이트된 펌웨어를 다운로드하고 있다고 나타내는 출력이 표시됩니다.

디바이스가 업데이트된 펌웨어를 다운로드하고 다시 시작된 이후에 펌웨어를 설치합니다. UART 터미널에서 무슨 일이 일어나고 있는지 알 수 있습니다.

콘솔을 사용하여 OTA 업데이트를 생성하는 방법을 보여 주는 자습서는 [OTA(Over-the-Air) 업데이트 데모 애플리케이션](ota-demo.md) 단원을 참조하십시오.

# 를 사용하여 OTA 업데이트 생성 AWS CLI
<a name="ota-cli-workflow"></a>

 AWS CLI 를 사용하여 OTA 업데이트를 생성할 때 다음을 수행합니다.

1. 펌웨어 이미지에 디지털 방식으로 서명합니다.

1. 디지털 방식으로 서명된 펌웨어 이미지의 스트림을 생성합니다.

1. OTA 업데이트 작업을 시작합니다.

## 펌웨어 업데이트에 디지털 방식으로 서명
<a name="ota-sign-cli"></a>

 AWS CLI 를 사용하여 OTA 업데이트를 수행할 때에 대한 코드 서명을 사용하거나 펌웨어 업데이트에 직접 서명 AWS IoT할 수 있습니다. Code Signing for에서 지원하는 암호화 서명 및 해싱 알고리즘 목록은 SigningConfigurationOverrides를 AWS IoT참조하세요. [ SigningConfigurationOverrides](https://docs.aws.amazon.com/signer/latest/api/API_SigningConfigurationOverrides.html) Code Signing for에서 지원하지 않는 암호화 알고리즘을 사용하려면 펌웨어 바이너리에 서명한 후 Amazon S3에 업로드해야 AWS IoT합니다.

### 용 코드 서명을 사용하여 펌웨어 이미지에 서명 AWS IoT
<a name="ota-sign-csfa"></a>

Code Signing for를 사용하여 펌웨어 이미지에 서명하려면 [AWS SDKs 또는 명령줄 도구](https://aws.amazon.com/tools/) 중 하나를 사용할 AWS IoT수 있습니다. 에 대한 코드 서명에 대한 자세한 내용은에 대한 코드 서명을 AWS IoT참조하세요. [AWS IoT](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 

코드 서명 도구를 설치하고 구성한 후 서명되지 않은 펌웨어 이미지를 Amazon S3 버킷에 복사하고 다음 AWS CLI 명령을 사용하여 코드 서명 작업을 시작합니다. **put-signing-profile** 명령은 재사용 가능한 코드 서명 프로필을 생성합니다. **start-signing-job** 명령은 서명 작업을 시작합니다.

```
aws signer put-signing-profile \
    --profile-name your_profile_name \
    --signing-material certificateArn=arn:aws:acm::your-region:your-aws-account-id:certificate/your-certificate-id \
    --platform your-hardware-platform \
    --signing-parameters certname=your_certificate_path_on_device
```

```
aws signer start-signing-job \
    --source 's3={bucketName=your_s3_bucket,key=your_s3_object_key,version=your_s3_object_version_id}' \
    --destination 's3={bucketName=your_destination_bucket}' \
    --profile-name your_profile_name
```

**참고**  
*your-source-bucket-name* 및 *your-destination-bucket-name*은 동일한 Amazon S3 버킷일 수 있습니다.

다음은 **put-signing-profile** 및 **start-signing-job** 명령의 파라미터입니다.

**`source`**  
S3 버킷에서 서명되지 않은 펌웨어 위치를 지정합니다.  
+ `bucketName`: S3 버킷의 이름
+ `key`: S3 버킷의 펌웨어 키(파일 이름)
+ `version`: S3 버킷에 있는 펌웨어의 S3 버전 펌웨어 버전과 다릅니다. Amazon S3 콘솔로 이동한 후 버킷을 선택하고 페이지 상단의 **버전** 옆에 있는 **표시**를 선택하여 찾을 수 있습니다.

**`destination`**  
S3 버킷의 서명된 펌웨어가 복사될 디바이스의 대상. 이 파라미터의 형식은 `source` 파라미터의 형식과 동일합니다.

**`signing-material`**  
코드 서명 인증서의 ARN입니다. 이 ARN은 인증서를 ACM으로 가져올 때 생성됩니다.

**`signing-parameters`**  
서명을 위한 키-값 페어의 맵입니다. 여기에는 서명 중에 사용할 정보가 포함될 수 있습니다.  
 AWS IoT용 코드 서명을 사용하여 OTA 업데이트에 서명하기 위한 코드 서명 프로필을 생성할 때 이 파라미터가 필요합니다.

**`platform`**  
OTA 업데이트를 배포할 하드웨어 플랫폼의 `platformId`입니다.  
사용 가능한 플랫폼 및 `platformId` 값 목록을 반환하려면 `aws signer list-signing-platforms` 명령을 사용합니다.

서명 작업이 시작되고 서명된 펌웨어 이미지를 대상 Amazon S3 버킷에 씁니다. 서명된 펌웨어 이미지의 파일 이름은 GUID입니다. 스트림을 생성할 때 이 파일 이름이 필요합니다. Amazon S3 콘솔로 이동한 후 버킷을 선택하여 파일 이름을 찾을 수 있습니다. GUID 파일 이름을 가진 파일이 표시되지 않는 경우 브라우저를 새로 고칩니다.

이 명령은 작업 ARN 및 작업 ID를 표시합니다. 이러한 값은 나중에 필요합니다. 에 대한 코드 서명에 대한 자세한 내용은에 대한 코드 서명을 AWS IoT참조하세요. [AWS IoT](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 

### 펌웨어 이미지에 수동으로 서명
<a name="ota-sign-manual"></a>

펌웨어 이미지에 디지털 방식으로 서명하고 서명된 펌웨어 이미지를 Amazon S3 버킷에 업로드합니다.

## 펌웨어 업데이트 스트림 생성
<a name="ota-stream"></a>

스트림은 디바이스에서 사용할 수 있는 데이터에 대한 추상적 인터페이스입니다. 스트림은 서로 다른 위치 또는 다른 클라우드 기반 서비스에 저장된 데이터에 액세스하는 복잡성을 숨길 수 있습니다. OTA 업데이트 관리자 서비스를 사용하면 Amazon S3의 여러 위치에 저장된 여러 데이터를 사용하여 OTA 업데이트를 수행할 수 있습니다.

 AWS IoT OTA 업데이트를 생성할 때 서명된 펌웨어 업데이트가 포함된 스트림을 생성할 수도 있습니다. 서명된 펌웨어 이미지를 식별하는 JSON 파일(`stream.json`)을 생성합니다. JSON 파일에는 다음이 포함되어야 합니다.

```
[
  {
    "fileId":"your_file_id",
    "s3Location":{
      "bucket":"your_bucket_name",
      "key":"your_s3_object_key"
    }
  }   
]
```

다음은 JSON 파일의 속성입니다.

**`fileId`**  
펌웨어 이미지를 식별하는 0\$1255 사이의 임의 정수입니다.

**`s3Location`**  
스트리밍할 펌웨어에 대한 버킷 및 키입니다.    
**`bucket`**  
서명되지 않은 펌웨어 이미지가 저장되는 Amazon S3 버킷입니다.  
**`key`**  
Amazon S3 버킷에 있는 서명된 펌웨어 이미지의 파일 이름입니다. Amazon S3 콘솔에서 버킷 내용을 조사하여 이 값을 찾을 수 있습니다.  
에 코드 서명을 사용하는 경우 AWS IoT파일 이름은 Code Signing for에서 생성한 GUID입니다 AWS IoT.

**create-stream** AWS CLI 명령을 사용하여 스트림을 만듭니다.

```
aws iot create-stream \
    --stream-id your_stream_id \
    --description your_description \
    --files file://stream.json \
    --role-arn your_role_arn
```

다음은 **create-stream** AWS CLI 명령의 인수입니다.

**`stream-id`**  
스트림을 식별하는 임의 문자열입니다.

**`description`**  
스트림에 대한 설명(선택 사항)입니다.

**`files`**  
스트리밍할 펌웨어 이미지에 대한 데이터를 포함하는 JSON 파일에 대한 하나 이상의 참조입니다. JSON 파일은 다음 속성을 포함해야 합니다.    
**`fileId`**  
임의 파일 ID입니다.  
**`s3Location`**  
서명된 펌웨어 이미지가 저장되는 버킷 이름 및 서명된 펌웨어 이미지의 키(파일 이름)입니다.  
**`bucket`**  
서명된 펌웨어 이미지가 저장되는 Amazon S3 버킷입니다.  
**`key`**  
서명된 펌웨어 이미지의 키(파일 이름)입니다.  
에 코드 서명을 사용하는 경우 AWS IoT이 키는 GUID입니다.
다음은 예 `stream.json` 파일입니다.  

```
[
    {
        "fileId":123,
        "s3Location": {
            "bucket":"codesign-ota-bucket",
            "key":"48c67f3c-63bb-4f92-a98a-4ee0fbc2bef6"
        }
    }
]
```

**`role-arn`**  
펌웨어 이미지가 저장된 Amazon S3 버킷에 대한 액세스 권한도 부여하는 [OTA 서비스 역할](create-service-role.md)입니다.

서명된 펌웨어 이미지의 Amazon S3 객체 키를 찾으려면 **aws signer describe-signing-job --job-id *my-job-id*** 명령을 사용합니다. 여기서 `my-job-id`는 **create-signing-job** AWS CLI 명령으로 표시되는 작업 ID입니다. **describe-signing-job** 명령의 출력에는 서명된 펌웨어 이미지의 키가 포함됩니다.

```
... text deleted for brevity ...
  "signedObject": {
    "s3": {
      "bucketName": "ota-bucket",
      "key": "7309da2c-9111-48ac-8ee4-5a4262af4429"
    }
  }
... text deleted for brevity ...
```

## OTA 업데이트 생성
<a name="create-ota-update"></a>

**create-ota-update** AWS CLI 명령을 사용하여 OTA 업데이트 작업을 생성합니다.

**참고**  
OTA 업데이트 작업 ID에 개인 식별 정보(PII)를 사용하지 마십시오. 개인 식별 정보의 예는 다음과 같습니다.  
이름
IP 주소
이메일 주소
위치
은행 세부 정보
의료 정보

```
aws iot  create-ota-update \
    --ota-update-id value \
    [--description value] \
    --targets value \
    [--protocols value] \
    [--target-selection value] \
    [--aws-job-executions-rollout-config value] \
    [--aws-job-presigned-url-config value] \
    [--aws-job-abort-config value] \
    [--aws-job-timeout-config value] \
    --files value \
    --role-arn value \
    [--additional-parameters value] \
    [--tags value]  \
    [--cli-input-json value] \
    [--generate-cli-skeleton]
```

 `cli-input-json` 형식

```
{
  "otaUpdateId": "string",
  "description": "string",
  "targets": [
    "string"
  ],
  "protocols": [
    "string"
  ],
  "targetSelection": "string",
  "awsJobExecutionsRolloutConfig": {
    "maximumPerMinute": "integer",
    "exponentialRate": {
      "baseRatePerMinute": "integer",
      "incrementFactor": "double",
      "rateIncreaseCriteria": {
        "numberOfNotifiedThings": "integer",
        "numberOfSucceededThings": "integer"
      }
    }
  },
  "awsJobPresignedUrlConfig": {
    "expiresInSec": "long"
  },
  "awsJobAbortConfig": {
    "abortCriteriaList": [
      {
        "failureType": "string",
        "action": "string",
        "thresholdPercentage": "double",
        "minNumberOfExecutedThings": "integer"
      }
    ]
  },
  "awsJobTimeoutConfig": {
    "inProgressTimeoutInMinutes": "long"
  },
  "files": [
    {
      "fileName": "string",
      "fileType": "integer",
      "fileVersion": "string",
      "fileLocation": {
        "stream": {
          "streamId": "string",
          "fileId": "integer"
        },
        "s3Location": {
          "bucket": "string",
          "key": "string",
          "version": "string"
        }
      },
      "codeSigning": {
        "awsSignerJobId": "string",
        "startSigningJobParameter": {
          "signingProfileParameter": {
            "certificateArn": "string",
            "platform": "string",
            "certificatePathOnDevice": "string"
          },
          "signingProfileName": "string",
          "destination": {
            "s3Destination": {
              "bucket": "string",
              "prefix": "string"
            }
          }
        },
        "customCodeSigning": {
          "signature": {
            "inlineDocument": "blob"
          },
          "certificateChain": {
            "certificateName": "string",
            "inlineDocument": "string"
          },
          "hashAlgorithm": "string",
          "signatureAlgorithm": "string"
        }
      },
      "attributes": {
        "string": "string"
      }
    }
  ],
  "roleArn": "string",
  "additionalParameters": {
    "string": "string"
  },
  "tags": [
    {
      "Key": "string",
      "Value": "string"
    }
  ]
}
```


**`cli-input-json` 필드**  

| 이름 | Type | 설명 | 
| --- | --- | --- | 
| `otaUpdateId` |  문자열  (최대:128분:1)  | 생성할 OTA 업데이트의 ID입니다. | 
| `description` |  문자열  (최대:2028)  | OTA 업데이트에 대한 설명입니다. | 
| `targets` |  목록  | OTA 업데이트를 수신할 대상 디바이스입니다. | 
| `protocols` |  목록  |  OTA 업데이트 이미지를 전송하는 데 사용되는 프로토콜입니다. 유효한 값은 [HTTP], [MQTT], [HTTP, MQTT]입니다. HTTP와 MQTT가 모두 지정되면 대상 디바이스가 프로토콜을 선택할 수 있습니다.  | 
| `targetSelection` | 문자열 |  대상으로 지정된 모든 사물이 업데이트를 마친 후 업데이트를 계속해서 실행할지(CONTINUOUS), 혹은 완료할지(SNAPSHOT) 지정합니다. CONTINUOUS인 경우에는 대상에서 변경이 감지되면 사물에서 업데이트를 계속 실행할 수 있습니다. 예를 들어 사물이 대상 그룹에 추가되면 처음에 그룹에 포함되었던 모든 사물에서 업데이트가 완료되었다고 해도 사물에서 업데이트가 계속 실행됩니다. 유효 값: CONTINUOUS \$1 SNAPSHOT 열거형: CONTINUOUS \$1 SNAPSHOT  | 
| `awsJobExecutionsRolloutConfig` |  | OTA 업데이트의 롤아웃에 대한 구성. | 
| `maximumPerMinute` |  정수  (최대:1000분:1)  | 분당 시작한 OTA 업데이트 작업 실행 최대 수. | 
| `exponentialRate` |  |  작업 롤아웃 증가 속도입니다. 이 파라미터를 사용하면 작업 롤아웃에 대한 기하급수적 속도 증가를 정의할 수 있습니다.  | 
| `baseRatePerMinute` |  정수  (최대:1000분:1)  |  작업 롤아웃 시작 시 대기 중인 작업에 대한 알림을 받을 분당 최소 사물 수입니다. 이는 롤아웃의 초기 속도입니다.  | 
|   `rateIncreaseCriteria`  |   |  작업에 대한 롤아웃 속도 증가를 시작하는 기준입니다. AWS IoT 는 소수점 뒤에 최대 1자리까지 지원합니다(예: 1.5는 지원하지만 1.55는 지원하지 않음).  | 
|   `numberOfNotifiedThings`  |  정수  (최소:1)  |  이 사물 수에 대한 알림을 받으면 롤아웃 속도가 증가하기 시작합니다.  | 
|   `numberOfSucceededThings`  |  정수  (최소:1)  |  이 사물 수가 작업 실행에서 성공하면 롤아웃 속도가 증가하기 시작합니다.  | 
| `awsJobPresignedUrlConfig` |  |  미리 서명된 URL의 구성 정보입니다. | 
|   `expiresInSec`  |  long |  미리 서명된 URL의 유효 시간(초)입니다. 유효한 값은 60\$13,600이며, 기본값은 1,800초입니다. 사전 서명된 URL은 작업 문서에 대한 요청이 수신될 때 생성됩니다.  | 
|   `awsJobAbortConfig`  |   |  작업 중지가 발생하는 시기와 방법을 결정하는 기준입니다. | 
|   `abortCriteriaList`  |  목록  |  작업을 중지할 시기와 방법을 결정하는 기준 목록입니다. | 
|   `failureType`  |  문자열 |  작업 중지를 시작할 수 있는 작업 실행 실패 유형입니다.  enum: FAILED \$1 REJECTED \$1 TIMED\$1OUT \$1 ALL  | 
|   `action`  |  문자열 |  작업 중지를 시작하기 위해 수행할 작업 유형입니다.  enum: CANCEL  | 
|   `minNumberOfExecutedThings`  |  정수  (최소:1)  |  작업을 중지하기 전에 작업 실행 알림을 받아야 하는 최소 사물 수입니다.  | 
|   `awsJobTimeoutConfig`  |   |  각 디바이스가 작업 실행을 마쳐야 하는 시간을 지정합니다. 타이머는 작업 실행 상태가 `IN_PROGRESS`에 설정되면 시작합니다. 타이머가 만료하기 전에 작업 실행 상태가 다른 터미널 상태로 설정되어 있지 않으면 `TIMED_OUT`로 자동으로 설정됩니다.  | 
|   `inProgressTimeoutInMinutes`  |  long |  이 디바이스가 이 작업 실행을 마쳐야 하는 시간(분)을 지정합니다. 제한 시간 간격은 1분\$17일(1\$110080분) 사이의 어떤 값이든 가능합니다. 진행 중 타이머는 업데이트될 수 없으며 이 작업에 대한 모든 작업 실행에 적용됩니다. 작업 실행이 이 간격보다 오랫동안 IN\$1PROGRESS 상태를 유지할 때마다 작업 실행은 실패하며 터미널 `TIMED_OUT` 상태로 전환합니다.  | 
|   `files`  |  목록  |  OTA 업데이트에서 스트리밍되는 파일입니다. | 
|   `fileName`  |  문자열 |   파일의 이름입니다. | 
|   `fileType`  |  정수  최대 범위: 255 최소 범위: 0  |  디바이스가 클라우드에서 수신한 파일 유형을 식별할 수 있도록 작업 문서에 포함할 수 있는 정수 값입니다.  | 
|   `fileVersion`  |  문자열 |  파일 버전입니다. | 
|   `fileLocation`  |   |  업데이트된 펌웨어 위치 | 
|   `stream`  |   |  OTA 업데이트를 포함하는 스트림. | 
|   `streamId`  |  문자열  (최대:128분:1)  |  스트림 ID입니다. | 
|   `fileId`  |  정수  (최대:255분:0)  |  스트림과 연결된 파일의 ID입니다. | 
|   `s3Location`  |   |  S3에 업데이트된 펌웨어 위치. | 
|   `bucket`  |  문자열  (최소:1)  |  S3 버킷 | 
|   `key`  |  문자열  (최소:1)  |  S3 키입니다. | 
|   `version`  |  문자열 |  S3 버킷 버전 | 
|   `codeSigning`  |   |  파일의 코드 서명 메서드입니다. | 
|   `awsSignerJobId`  |  문자열 |  파일 서명을 위해 생성된 AWSSignerJob의 ID입니다. | 
|   `startSigningJobParameter`  |   |  코드 서명 작업을 설명합니다. | 
|   `signingProfileParameter`  |   |  코드 서명 프로파일을 설명합니다. | 
|   `certificateArn`  |  문자열 |  인증서 ARN. | 
|   `platform`  |  문자열 |  디바이스 하드웨어 플랫폼. | 
|   `certificatePathOnDevice`  |  문자열 |  디바이스의 코드 서명 인증서의 위치. | 
|   `signingProfileName`  |  문자열 |  코드 서명 프로파일 이름. | 
|   `destination`  |   |  코드 서명한 파일을 쓸 위치. | 
|   `s3Destination`  |   |  업데이트된 펌웨어의 S3의 위치를 설명합니다. | 
|   `bucket`  |  문자열  (최소:1)  |  업데이트된 펌웨어를 포함하는 S3 버킷. | 
|   `prefix`  |  문자열 |  S3 접두사. | 
|   `customCodeSigning`  |   |  파일 코드 서명을 위한 사용자 지정 메서드입니다. | 
|   `signature`  |   |  파일 서명입니다. | 
|   `inlineDocument`  |  blob |  코드 서명에 대한 base64 인코딩 바이너리 표현입니다. | 
|   `certificateChain`  |   |  인증서 체인입니다. | 
|   `certificateName`  |  문자열 |  인증서 이름입니다 | 
|   `inlineDocument`  |  문자열 |  코드 서명 인증서 체인에 대한 base64 인코딩 바이너리 표현입니다. | 
|   `hashAlgorithm`  |  문자열 |  파일의 코드 서명에 사용되는 해시 알고리즘입니다. | 
|   `signatureAlgorithm`  |  문자열 |  파일의 코드 서명에 사용되는 서명 알고리즘입니다. | 
|   `attributes`  |  map |  이름/속성 페이의 목록입니다. | 
|   `roleArn`  |  문자열  (최대:2048분:20)  |  OTA 업데이트 작업을 생성하기 위해 Amazon S3, AWS IoT 작업 및 AWS 코드 서명 리소스에 대한 AWS IoT 액세스 권한을 부여하는 IAM 역할입니다. | 
|   `additionalParameters`  |  map |  이름-값 페어로 추가되는 OTA 업데이트 파라미터의 목록입니다. | 
|   `tags`  |  목록  |  업데이트 관리에 사용할 수 있는 메타데이터입니다. | 
|   `Key`  |  문자열  (최대:128분:1)  |  태그 키. | 
|   `Value`  |  문자열  (최대: 256분:1)  |  태그 값입니다. | 

출력

```
{
  "otaUpdateId": "string",
  "awsIotJobId": "string",
  "otaUpdateArn": "string",
  "awsIotJobArn": "string",
  "otaUpdateStatus": "string"
}
```


**AWS CLI 출력 필드**  

|  이름 |  Type |  설명 | 
| --- | --- | --- | 
|   `otaUpdateId`  |  문자열  (최대:128분:1)  |  OTA 업데이트 ID입니다. | 
|   `awsIotJobId`  |  문자열 |  OTA 업데이트와 연결된 AWS IoT 작업 ID입니다. | 
|   `otaUpdateArn`  |  문자열 |  OTA 업데이트 ARN입니다. | 
|   `awsIotJobArn`  |  문자열 |  OTA 업데이트와 연결된 AWS IoT 작업 ARN입니다. | 
|   `otaUpdateStatus`  |  문자열 |  OTA 업데이트 상태입니다.  열거형: CREATE\$1PENDING \$1 CREATE\$1IN\$1PROGRESS \$1 CREATE\$1COMPLETE \$1 CREATE\$1FAILED  | 

다음은 코드 서명을 사용하는 **create-ota-update** 명령에 전달되는 JSON 파일의 예입니다 AWS IoT.

```
[
  {
    "fileName": "firmware.bin",                
    "fileType": 1,
    "fileLocation": {
      "stream": {
        "streamId": "004",                         
        "fileId":123
      }                        
    },
    "codeSigning": {
      "awsSignerJobId": "48c67f3c-63bb-4f92-a98a-4ee0fbc2bef6"     
    }
  }
]
```

다음은 인라인 파일을 사용하여 사용자 지정 코드 서명 구성 요소를 제공하는 **create-ota-update** AWS CLI 명령에 전달되는 JSON 파일의 예입니다.

```
[
  {
    "fileName": "firmware.bin",
    "fileType": 1,
    "fileLocation": {
      "stream": {
        "streamId": "004",
        "fileId": 123
      }
    },
    "codeSigning": {
      "customCodeSigning":{
        "signature":{
          "inlineDocument":"your_signature"
        },
        "certificateChain": {
          "certificateName": "your_certificate_name",
          "inlineDocument":"your_certificate_chain"
        },
        "hashAlgorithm":"your_hash_algorithm",
        "signatureAlgorithm":"your_signature_algorithm"
      }
    }
  }
]
```

다음은 FreeRTOS OTA가 코드 서명 작업을 시작하고 코드 서명 프로파일 및 스트림을 생성하도록 허용하는 **create-ota-update** AWS CLI 명령에 전달되는 JSON 파일의 예입니다.

```
[
  {
    "fileName": "your_firmware_path_on_device",
    "fileType": 1,
    "fileVersion": "1",
    "fileLocation": {
      "s3Location": {
        "bucket": "your_bucket_name",
        "key": "your_object_key",
        "version": "your_S3_object_version"
      }
    },
    "codeSigning":{
      "startSigningJobParameter":{
        "signingProfileName": "myTestProfile",
        "signingProfileParameter": {
          "certificateArn": "your_certificate_arn",
          "platform": "your_platform_id",
          "certificatePathOnDevice": "certificate_path"
        },
        "destination": {
          "s3Destination": {
            "bucket": "your_destination_bucket"
          }
        }
      }
    }  
  }
]
```

다음은 기존 프로파일로 코드 서명 작업을 시작하고 지정된 스트림을 사용하는 OTA 업데이트를 생성하는 **create-ota-update** AWS CLI 명령에 전달되는 JSON 파일의 예입니다.

```
[
  {
    "fileName": "your_firmware_path_on_device",
    "fileType": 1,
    "fileVersion": "1",
    "fileLocation": {
      "s3Location": {
        "bucket": "your_s3_bucket_name",
        "key": "your_object_key",
        "version": "your_S3_object_version"
      }
    },
    "codeSigning":{
      "startSigningJobParameter":{
        "signingProfileName": "your_unique_profile_name",
        "destination": {
          "s3Destination": {
            "bucket": "your_destination_bucket"
          }
        }
      }
    }  
  }
]
```

다음은 FreeRTOS OTA가 기존 코드 서명 작업 ID로 스트림을 생성할 수 있도록 허용하는 **create-ota-update** AWS CLI 명령에 전달되는 JSON 파일의 예입니다.

```
[
  {
    "fileName": "your_firmware_path_on_device",
    "fileType": 1,
    "fileVersion": "1",
    "codeSigning":{
      "awsSignerJobId": "your_signer_job_id"
    }  
  }
]
```

다음은 OTA 업데이트를 생성하는 **create-ota-update** AWS CLI 명령에 전달되는 JSON 파일의 예입니다. 업데이트는 지정된 S3 객체에서 스트림을 생성하고 사용자 지정 코드 서명을 사용합니다.

```
[
  {
    "fileName": "your_firmware_path_on_device",
    "fileType": 1,
    "fileVersion": "1",
    "fileLocation": {
      "s3Location": {
        "bucket": "your_bucket_name",
        "key": "your_object_key",
        "version": "your_S3_object_version"
      }
    },
    "codeSigning":{
      "customCodeSigning": {
        "signature":{
          "inlineDocument":"your_signature"
        },
        "certificateChain": {
          "inlineDocument":"your_certificate_chain",
          "certificateName": "your_certificate_path_on_device"
        },
        "hashAlgorithm":"your_hash_algorithm",
        "signatureAlgorithm":"your_sig_algorithm"
      }
    }  
  }
]
```

## OTA 업데이트 나열
<a name="list-ota-updates"></a>

**list-ota-updates** AWS CLI 명령을 사용하여 모든 OTA 업데이트 목록을 가져올 수 있습니다.

```
aws iot list-ota-updates
```

**list-ota-updates** 명령의 출력은 다음과 같습니다.

```
{
  "otaUpdates": [
     
    {
      "otaUpdateId": "my_ota_update2",
      "otaUpdateArn": "arn:aws:iot:us-west-2:123456789012:otaupdate/my_ota_update2",
      "creationDate": 1522778769.042
    },
    {
      "otaUpdateId": "my_ota_update1",
      "otaUpdateArn": "arn:aws:iot:us-west-2:123456789012:otaupdate/my_ota_update1",
      "creationDate": 1522775938.956
    },
    {
      "otaUpdateId": "my_ota_update",
      "otaUpdateArn": "arn:aws:iot:us-west-2:123456789012:otaupdate/my_ota_update",
      "creationDate": 1522775151.031
    }
  ]
}
```

## OTA 업데이트에 대한 정보 가져오기
<a name="get-ota-updates"></a>

**get-ota-update** AWS CLI 명령을 사용하여 OTA 업데이트의 생성 또는 삭제 상태를 가져올 수 있습니다.

```
aws iot get-ota-update --ota-update-id your-ota-update-id
```

**get-ota-update** 명령에 대한 출력은 다음과 같습니다.

```
{ 
    "otaUpdateInfo": { 
        "otaUpdateId": "ota-update-001", 
        "otaUpdateArn": "arn:aws:iot:region:123456789012:otaupdate/ota-update-001", 
        "creationDate": 1575414146.286, 
        "lastModifiedDate": 1575414149.091, 
        "targets": [ 
            "arn:aws:iot:region:123456789012:thing/myDevice" 
        ], 
        "protocols": [ "HTTP" ], 
        "awsJobExecutionsRolloutConfig": { 
            "maximumPerMinute": 0 
        }, 
        "awsJobPresignedUrlConfig": { 
            "expiresInSec": 1800 
        }, 
        "targetSelection": "SNAPSHOT", 
        "otaUpdateFiles": [ 
            { 
                "fileName": "my_firmware.bin", 
                "fileType": 1,
                "fileLocation": { 
                    "s3Location": { 
                        "bucket": "my-bucket", 
                        "key": "my_firmware.bin", 
                        "version": "AvP3bfJC9gyqnwoxPHuTqM5GWENt4iii" 
                    } 
                }, 
                "codeSigning": { 
                    "awsSignerJobId": "b7a55a54-fae5-4d3a-b589-97ed103737c2", 
                    "startSigningJobParameter": { 
                        "signingProfileParameter": {}, 
                        "signingProfileName": "my-profile-name", 
                        "destination": { 
                            "s3Destination": { 
                                "bucket": "some-ota-bucket", 
                                "prefix": "SignedImages/" 
                            } 
                        } 
                    }, 
                    "customCodeSigning": {} 
                } 
            } 
        ], 
        "otaUpdateStatus": "CREATE_COMPLETE", 
        "awsIotJobId": "AFR_OTA-ota-update-001", 
        "awsIotJobArn": "arn:aws:iot:region:123456789012:job/AFR_OTA-ota-update-001" 
    } 
}
```

`otaUpdateStatus`에 대해 반환되는 값은 다음과 같습니다.

**`CREATE_PENDING`**  
OTA 업데이트 생성이 보류 중입니다.

**`CREATE_IN_PROGRESS`**  
OTA 업데이트가 생성되고 있습니다.

**`CREATE_COMPLETE`**  
OTA 업데이트가 생성되었습니다.

**`CREATE_FAILED`**  
OTA 업데이트를 생성하지 못했습니다.

**`DELETE_IN_PROGRESS`**  
OTA 업데이트를 삭제하고 있습니다.

**`DELETE_FAILED`**  
OTA 업데이트를 삭제하지 못했습니다.

**참고**  
OTA 업데이트가 생성된 후 실행 상태를 가져오려면 **describe-job-execution** 명령을 사용해야 합니다. 자세한 내용은 [작업 실행 설명](https://docs.aws.amazon.com/iot/latest/developerguide/manage-job-cli.html#describe-job-execution)을 참조하세요.

## OTA 관련 데이터 삭제
<a name="delete-ota-data"></a>

현재는 AWS IoT 콘솔을 사용하여 스트림 또는 OTA 업데이트를 삭제할 수 없습니다. 를 AWS CLI 사용하여 스트림, OTA 업데이트 및 OTA 업데이트 중에 생성된 AWS IoT 작업을 삭제할 수 있습니다.

### OTA 스트림 삭제
<a name="delete-ota-stream"></a>

MQTT를 사용하는 OTA 업데이트를 생성할 때 명령줄 또는 AWS IoT 콘솔을 사용하여 펌웨어를 청크로 나누는 스트림을 생성하여 MQTT를 통해 전송할 수 있습니다. 다음 예제와 같이 **delete-stream** AWS CLI 명령을 사용하여이 스트림을 삭제할 수 있습니다.

```
aws iot delete-stream --stream-id your_stream_id
```

### OTA 업데이트 삭제
<a name="delete-ota-update"></a>

OTA 업데이트를 생성할 때 다음과 같은 항목이 생성됩니다.
+ OTA 업데이트 작업 데이터베이스 내 항목
+ 업데이트를 수행하는 AWS IoT 작업입니다.
+ 업데이트 중인 각 디바이스에 대한 AWS IoT 작업 실행입니다.

**delete-ota-update** 명령은 OTA 업데이트 작업 데이터베이스에서만 항목을 삭제합니다. **delete-job** 명령을 사용하여 AWS IoT 작업을 삭제해야 합니다.

**delete-ota-update** 명령을 사용하여 OTA 업데이트를 삭제합니다.

```
aws iot delete-ota-update --ota-update-id your_ota_update_id
```

**`ota-update-id`**  
삭제할 OTA 업데이트의 ID

**`delete-stream`**  
OTA 업데이트와 연결된 스트림을 삭제합니다.

**`force-delete-aws-job`**  
OTA 업데이트와 연결된 AWS IoT 작업을 삭제합니다. 이 플래그가 설정되어 있지 않고 작업이 `In_Progress` 상태인 경우에는 작업이 삭제되지 않습니다.

### OTA 업데이트용으로 생성된 IoT 작업 삭제
<a name="delete-ota-job"></a>

FreeRTOS는 OTA 업데이트를 생성할 때 AWS IoT 작업을 생성합니다. 또한 작업을 처리하는 각 디바이스에 대해 작업 실행이 생성됩니다. **delete-job** AWS CLI 명령을 사용하여 작업 및 관련 작업 실행을 삭제할 수 있습니다.

```
aws iot delete-job --job-id your-job-id --no-force
```

`no-force` 파라미터는 종료 상태(완료됨 또는 취소됨)인 작업만 삭제할 수 있도록 지정합니다. `force` 파라미터를 전달하여 종료 상태가 아닌 작업을 삭제할 수 있습니다. 자세한 내용은 [DeleteJob API](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteJob.html) 단원을 참조하십시오.

**참고**  
IN\$1PROGRESS 상태인 작업을 삭제하면 디바이스에서 IN\$1PROGRESS 상태인 작업 실행이 중단되고 디바이스가 비결정적 상태로 유지될 수 있습니다. 삭제된 작업을 실행하는 각 디바이스를 알려진 상태로 복구할 수 있는지 확인합니다.

작업에 대해 생성된 작업 실행의 수와 기타 요소에 따라 작업을 삭제하는 데 몇 분 정도 걸릴 수 있습니다. 작업이 삭제되는 동안 상태는 DELETION\$1IN\$1PROGRESS입니다. 상태가 이미 DELETION\$1IN\$1PROGRESS인 작업을 삭제하거나 취소하려고 하면 오류가 발생합니다.

**delete-job-execution**을 사용하여 작업 실행을 삭제할 수 있습니다. 일부 디바이스에서 작업을 처리할 수 없는 경우에 작업 실행을 삭제하려고 할 수 있습니다. 이렇게 하면 다음 예제와 같이 단일 디바이스에 대한 작업 실행이 삭제됩니다.

```
aws iot delete-job-execution --job-id your-job-id --thing-name
                    your-thing-name --execution-number your-job-execution-number --no-force
```

**delete-job** AWS CLI 명령과 마찬가지로 `--force` 파라미터를에 전달**delete-job-execution**하여 작업 실행을 강제로 삭제할 수 있습니다. 자세한 내용은 [DeleteJobExecution API](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteJobExecution.html) 단원을 참조하십시오.

**참고**  
IN\$1PROGRESS 상태인 작업 실행을 삭제하면 디바이스에서 IN\$1PROGRESS 상태인 작업 실행이 중단되고 디바이스가 비결정적 상태로 유지될 수 있습니다. 삭제된 작업을 실행하는 각 디바이스를 알려진 상태로 복구할 수 있는지 확인합니다.

OTA 업데이트 데모 애플리케이션을 사용하는 방법에 대한 자세한 내용은 [OTA(Over-the-Air) 업데이트 데모 애플리케이션](ota-demo.md) 단원을 참조하십시오.