

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

# 를 사용하여 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) 단원을 참조하십시오.