

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

# 디바이스 프로비저닝
<a name="iot-provision"></a>

AWS 는 디바이스를 프로비저닝하고 디바이스에 고유한 클라이언트 인증서를 설치하는 여러 가지 방법을 제공합니다. 이 섹션에서는 각각의 방법과 IoT 솔루션에 가장 적합한 방법을 선택하는 방법에 대해 설명합니다. 이러한 옵션은 [AWS IoT Core의 X.509 인증서를 사용한 디바이스 제조 및 프로비저닝](https://docs.aws.amazon.com/whitepapers/latest/device-manufacturing-provisioning/device-manufacturing-provisioning.html)이라는 백서에 자세히 설명되어 있습니다.

**상황에 가장 적합한 옵션을 선택하세요.**
+ 

**인증서를 전달하기 전에 IoT 디바이스에 설치할 수 있습니다.**  
최종 사용자가 사용할 수 있도록 전달되기 전에 고유한 클라이언트 인증서를 IoT 디바이스에 안전하게 설치할 수 있는 경우 [*JIT* 프로비저닝(JITP)](jit-provisioning.md) 또는 [*JIT* 등록(JITR)](auto-register-device-cert.md)을 사용하려고 합니다.

  JITP 및 JITR을 사용하면 디바이스 인증서에 서명하는 데 사용되는 인증 기관(CA)이에 등록 AWS IoT 되고 디바이스가 처음 연결될 AWS IoT 때에서 인식합니다. 디바이스는 프로비저닝 템플릿의 세부 정보를 사용하여 첫 번째 연결 AWS IoT 에서에 프로비저닝됩니다.

  단일 사물, JITP, JITR 및 고유 인증서가 있는 디바이스의 대량 프로비저닝에 대한 자세한 내용은 [디바이스 인증서가 있는 디바이스 프로비저닝](provision-w-cert.md) 단원을 참조하세요.
+ 

**최종 사용자 또는 설치 관리자는 앱을 사용하여 IoT 디바이스에 인증서를 설치할 수 있습니다.**  
최종 사용자에게 전달되기 전에 고유한 클라이언트 인증서를 IoT 디바이스에 안전하게 설치할 수 없지만 최종 사용자 또는 설치 관리자가 앱을 사용하여 디바이스를 등록하고 고유한 디바이스 인증서를 설치할 수 있는 경우 [신뢰할 수 있는 사용자에 의한 프로비저닝](provision-wo-cert.md#trusted-user) 프로세스를 사용하고자 합니다.

  알려진 계정이 있는 최종 사용자 또는 설치 관리자와 같은 신뢰할 수 있는 사용자를 사용하면 디바이스 제조 프로세스를 간소화할 수 있습니다. 디바이스에는 고유한 클라이언트 인증서 대신 5분 AWS IoT 동안만 디바이스를 연결할 수 있는 임시 인증서가 있습니다. 5분 동안 신뢰할 수 있는 사용자는 수명이 긴 고유한 클라이언트 인증서를 획득하여 디바이스에 설치합니다. 클레임 인증서의 수명이 제한되어 인증서의 손상 위험을 최소화합니다.

  자세한 내용은 [신뢰할 수 있는 사용자에 의한 프로비저닝](provision-wo-cert.md#trusted-user) 단원을 참조하세요.
+ 

**최종 사용자는 앱을 사용하여 IoT 디바이스에 인증서를 설치할 수 없습니다.**  
이전 옵션 중 어느 것도 IoT 솔루션에서 작동하지 않는 경우 [클레임에 의한 프로비저닝](provision-wo-cert.md#claim-based) 프로세스가 옵션입니다. 이 프로세스를 통해 IoT 디바이스에는 플릿의 다른 디바이스에서 공유하는 클레임 인증서가 있습니다. 디바이스가 클레임 인증서에 처음 연결되면는 프로비저닝 템플릿을 사용하여 디바이스를 AWS IoT 등록하고에 대한 후속 액세스를 위해 디바이스에 고유한 클라이언트 인증서를 발급합니다 AWS IoT.

   이 옵션을 사용하면 디바이스를 연결할 때 자동으로 프로비저닝할 수 AWS IoT있지만 클레임 인증서가 손상된 경우 더 큰 위험이 발생할 수 있습니다. 클레임 인증서가 손상되면 인증서를 비활성화할 수 있습니다. 클레임 인증서를 비활성화하면 해당 클레임 인증서가 있는 모든 디바이스가 나중에 등록되지 않습니다. 그러나 클레임 인증서를 비활성화해도 이미 프로비저닝된 디바이스는 차단되지 않습니다.

  자세한 내용은 [클레임에 의한 프로비저닝](provision-wo-cert.md#claim-based) 단원을 참조하십시오.

## 에서 디바이스 프로비저닝 AWS IoT
<a name="provisioning-in-iot"></a>

로 디바이스를 프로비저닝 AWS IoT할 때 디바이스와가 안전하게 통신할 AWS IoT 수 있도록 리소스를 생성해야 합니다. 디바이스 플릿을 관리하는 데 도움이 되는 다른 리소스를 생성할 수 있습니다. 프로비저닝 프로세스 중에 다음 리소스를 생성할 수 있습니다.
+ IoT 사물.

  IoT 사물은 AWS IoT 디바이스 레지스트리의 항목입니다. 각 사물에는 고유한 이름과 속성 집합이 있으며, 물리적 디바이스와 연결됩니다. 사물 유형을 사용하여 사물을 정의하거나 사물을 사물 그룹으로 그룹화할 수 있습니다. 자세한 내용은 [를 사용하여 디바이스 관리 AWS IoT](iot-thing-management.md) 단원을 참조하세요.

   반드시 생성해야 하는 것은 아니지만 사물을 생성하면 사물 유형, 사물 그룹 및 사물 속성별로 디바이스를 검색하여 디바이스 플릿을 보다 효율적으로 관리할 수 있습니다. 자세한 내용은 [플릿 인덱싱](iot-indexing.md) 단원을 참조하십시오.
**참고**  
사물의 연결 상태 데이터를 인덱싱하도록 하려면 사물 이름이 연결 요청에 사용된 클라이언트 ID와 일치하도록 사물을 프로비저닝하고 구성합니다.
+ X.509 인증서.

  디바이스는 X.509 인증서를 사용하여 상호 인증을 수행합니다 AWS IoT. 기존 인증서를 등록하거나 새 인증서를 AWS IoT 생성하여 등록할 수 있습니다. 디바이스를 나타내는 사물에 인증서를 연결하여 인증서와 디바이스를 연결합니다. 또한 인증서 및 연결된 프라이빗 키를 디바이스에 복사해야 합니다. 디바이스는에 연결할 때 인증서를 제공합니다 AWS IoT. 자세한 내용은 [Authentication](authentication.md) 단원을 참조하십시오.
+ IoT 정책.

  IoT 정책은 디바이스가 AWS IoT에서 수행할 수 있는 작업을 정의합니다. IoT 정책은 디바이스 인증서에 연결됩니다. 디바이스가 인증서를에 제시하면 정책에 지정된 권한이 부여 AWS IoT됩니다. 자세한 내용은 [권한 부여](iot-authorization.md) 단원을 참조하십시오. 각 디바이스에는 AWS IoT와 통신하기 위해 인증서가 필요합니다.

AWS IoT 는 프로비저닝 템플릿을 사용하여 자동 플릿 프로비저닝을 지원합니다. 프로비저닝 템플릿은 디바이스를 프로비저닝하는 데 AWS IoT 필요한 리소스를 설명합니다. 템플릿에는 하나의 템플릿을 사용하여 여러 디바이스를 프로비저닝할 수 있는 변수가 포함되어 있습니다. 디바이스를 프로비저닝할 때 사전 또는 *맵*을 사용하여 디바이스와 관련된 변수의 값을 지정합니다. 다른 디바이스를 프로비저닝하려면 사전에 새 값을 지정합니다.

디바이스에 고유한 인증서(및 연결된 프라이빗 키)가 있는지 여부에 관계없이 자동화된 프로비저닝을 사용할 수 있습니다.

## 플릿 프로비저닝 API
<a name="provisioning-apis"></a>

플릿 프로비저닝에 사용되는 API에는 다음과 같은 몇 가지 범주가 있습니다.
+ 이러한 컨트롤 플레인 기능은 플릿 프로비저닝 템플릿을 생성 및 관리하고 신뢰할 수 있는 사용자 정책을 구성합니다.
  + [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)
  + [CreateProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplateVersion.html)
  + [DeleteProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteProvisioningTemplate.html)
  + [DeleteProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteProvisioningTemplateVersion.html)
  + [DescribeProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeProvisioningTemplate.html)
  + [DescribeProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeProvisioningTemplateVersion.html)
  + [ListProvisioningTemplates](https://docs.aws.amazon.com/iot/latest/apireference/API_ListProvisioningTemplates.html)
  + [ListProvisioningTemplateVersions](https://docs.aws.amazon.com/iot/latest/apireference/API_ListProvisioningTemplateVersions.html)
  + [UpdateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateProvisioningTemplate.html)
+ 신뢰할 수 있는 사용자는 이 컨트롤 플레인 기능을 사용하여 임시 온보딩 클레임을 생성할 수 있습니다. 이 임시 클레임은 Wi-Fi 구성이나 유사한 방법을 수행하는 중에 디바이스로 전달됩니다.
  + [CreateProvisioningClaim](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningClaim.html)
+ 프로비저닝 클레임 인증서가 내장되어 있거나 신뢰할 수 있는 사용자가 인증서를 전달하는 디바이스에서 프로비저닝 프로세스 동안 사용되는 MQTT API입니다.
  + [CreateCertificateFromCsr](fleet-provision-api.md#create-cert-csr)
  + [CreateKeysAndCertificate](fleet-provision-api.md#create-keys-cert)
  + [RegisterThing](fleet-provision-api.md#register-thing)

# 플릿 프로비저닝을 사용하여 디바이스 인증서가 없는 디바이스 프로비저닝
<a name="provision-wo-cert"></a>

 AWS IoT 플릿 프로비저닝을 사용하면 AWS IoT 가 디바이스 인증서와 프라이빗 키를 생성하여 처음에 연결할 때 디바이스 AWS IoT 에 안전하게 전송할 수 있습니다.는 Amazon Root 인증 기관(CA)에서 서명한 클라이언트 인증서를 AWS IoT 제공합니다.

플릿 프로비저닝을 사용하는 방법에는 다음 두 가지가 있습니다.
+ [클레임에 의한 프로비저닝](#claim-based)
+ [신뢰할 수 있는 사용자에 의한 프로비저닝](#trusted-user)

## 클레임에 의한 프로비저닝
<a name="claim-based"></a>

디바이스는 프로비저닝 클레임 인증서 및 프라이빗 키(특수 용도의 자격 증명)가 내장된 상태로 제조될 수 있습니다. 이러한 인증서가에 등록된 경우 서비스는 이러한 인증서를 디바이스 AWS IoT가 일반 작업에 사용할 수 있는 고유한 디바이스 인증서로 교환할 수 있습니다. 이 프로세스는 다음 단계로 이루어집니다.

**디바이스를 전달하기 전에**

1. [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html)을 호출하여 프로비저닝 템플릿을 생성합니다. 이 API는 템플릿 ARN을 반환합니다. 자세한 내용은 [디바이스 프로비저닝 MQTT API](fleet-provision-api.md) 단원을 참조하십시오.

    AWS IoT 콘솔에서 플릿 프로비저닝 템플릿을 생성할 수도 있습니다.

   1. 탐색 창에서 **여러 디바이스 연결** 드롭다운을 선택합니다. 그런 다음 **여러 디바이스 연결**을 선택합니다.

   1. **프로비저닝 템플릿 생성**을 선택합니다.

   1. 설치 프로세스에 가장 적합한 **프로비저닝 시나리오**를 선택합니다. 그리고 **다음**을 선택합니다.

   1. 템플릿 워크플로를 완료합니다.

1. 프로비저닝 클레임 인증서로 사용할 인증서 및 연결된 프라이빗 키를 생성합니다.

1. 이러한 인증서를에 등록 AWS IoT 하고 인증서 사용을 제한하는 IoT 정책을 연결합니다. 다음 IoT 정책의 예는 이 정책과 연결된 인증서의 사용을 프로비저닝 디바이스로 제한합니다.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Connect"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Receive"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topic/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topic/$aws/provisioning-templates/templateName/provision/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/provisioning-templates/templateName/provision/*"
               ]
           }
       ]
   }
   ```

1. 디바이스를 프로비저닝할 때 계정의 사물 및 인증서와 같은 IoT 리소스를 생성하거나 업데이트할 수 있는 권한을 AWS IoT 서비스에 부여합니다. 이렇게 하려면 `AWSIoTThingsRegistration` 관리형 정책을 AWS IoT 서비스 보안 주체를 신뢰하는 IAM 역할(프로비저닝 역할이라고 함)에 연결합니다.

1. 프로비저닝 클레임 인증서가 안전하게 내장된 디바이스를 제조합니다.

이제 디바이스를 설치할 위치로 전달할 준비가 되었습니다.

**중요**  
프로비저닝 클레임 프라이빗 키는 디바이스에서는 물론 어디에서든 항상 보안 유지되어야 합니다. AWS IoT CloudWatch 지표 및 로그를 사용하여 오용 징후를 모니터링하는 것이 좋습니다. 오용이 감지되면 프로비저닝 클레임 인증서를 디바이스 프로비저닝에 사용할 수 없도록 비활성화합니다.

**사용할 디바이스를 초기화하려면**

1. 디바이스는 [AWS IoT 디바이스 SDK, 모바일 SDK 및 AWS IoT 디바이스 클라이언트](iot-sdks.md)를 사용하여 디바이스에 설치된 프로비저닝 클레임 인증서를 AWS IoT 사용하여에 연결하고 인증합니다.
**참고**  
보안을 위해 `CreateCertificateFromCsr` 및 `CreateKeysAndCertificate`에 의해 반환된 `certificateOwnershipToken`은 1시간 후에 만료됩니다. `RegisterThing`은 `certificateOwnershipToken`이 만료되기 전에 호출되어야 합니다. `CreateCertificateFromCsr` 또는 `CreateKeysAndCertificate`에서 생성된 인증서가 활성화되지 않았으며 토큰이 만료될 때까지 정책 또는 사물에 연결되지 않은 경우 인증서가 삭제됩니다. 토큰이 만료되면 디바이스는 `CreateCertificateFromCsr` 또는 `CreateKeysAndCertificate`를 다시 호출하여 새 인증서를 생성합니다.

1. 디바이스는 이러한 옵션 중 하나를 사용하여 영구 인증서와 프라이빗 키를 가져옵니다. 디바이스는 이후의 모든 인증에 인증서와 키를 사용합니다 AWS IoT.

   1. 를 호출[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)하여 인증 기관을 사용하여 새 AWS 인증서와 프라이빗 키를 생성합니다.

      또는

   1. [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr)을 호출하여 프라이빗 키를 안전하게 유지하는 인증서 서명 요청에서 인증서를 생성합니다.

1. 디바이스에서 [`RegisterThing`](fleet-provision-api.md#register-thing)을 호출하여 디바이스를 AWS IoT 에 등록하고 클라우드 리소스를 생성합니다.

   플릿 프로비저닝 서비스는 프로비저닝 템플릿을 사용하여 IoT 사물과 같은 클라우드 리소스를 정의하고 생성합니다. 템플릿에는 사물이 속한 그룹과 속성이 지정될 수 있습니다. 사물 그룹에 새 사물을 추가하려면 먼저 사물 그룹이 있어야 합니다.

1. 디바이스에 영구 인증서를 저장한 후 디바이스는 프로비저닝 클레임 인증서로 시작한 세션과의 연결을 끊고 영구 인증서를 사용하여 다시 연결해야 합니다.

이제 디바이스가와 정상적으로 통신할 준비가 되었습니다 AWS IoT.

## 신뢰할 수 있는 사용자에 의한 프로비저닝
<a name="trusted-user"></a>

대부분의 경우 최종 사용자 또는 설치 기술자와 같은 신뢰할 수 있는 사용자가 모바일 앱을 사용하여 배포된 위치에 디바이스를 구성할 때 디바이스가 AWS IoT 처음으로에 연결됩니다.

**중요**  
이 절차를 수행하려면 신뢰할 수 있는 사용자의 액세스 및 권한을 관리해야 합니다. 이를 수행하는 한 가지 방법은 신뢰할 수 있는 사용자를 인증하고 이 절차를 수행하는 데 필요한 AWS IoT 기능 및 API 작업에 대한 액세스 권한을 부여하는 신뢰할 수 있는 사용자에 대한 계정을 제공 및 유지 관리하는 것입니다.

**디바이스를 전달하기 전에**

1. [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html)을 호출하여 프로비저닝 템플릿을 생성하고 해당 *templateArn* 및 *templateName*을 반환합니다.

1. 신뢰할 수 있는 사용자가 프로비저닝 프로세스를 시작하는 데 사용하는 IAM 역할을 생성합니다. 프로비저닝 템플릿에서는 해당 사용자만 디바이스를 프로비저닝할 수 있습니다. 예제:

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "arn:aws:iot:aws-region:aws-account-id:provisioningtemplate/templateName"
       ]
   }
   ```

1. 디바이스를 프로비저닝할 때 계정의 사물 및 인증서와 같은 IoT 리소스를 생성하거나 업데이트할 수 있는 권한을 AWS IoT 서비스에 부여합니다. 이렇게 하려면 `AWSIoTThingsRegistration` 관리형 정책을 AWS IoT 서비스 보안 주체를 신뢰하는 IAM 역할(*프로비저닝 역할*이라고 함)에 연결합니다.

1. 인증할 수 있는 계정을 제공하고 디바이스를 등록하는 데 필요한 AWS API 작업과의 상호 작용을 승인하는 등 신뢰할 수 있는 사용자를 식별할 수 있는 수단을 제공합니다.

**사용할 디바이스를 초기화하려면**

1. 신뢰할 수 있는 사용자가 프로비저닝 모바일 앱 또는 웹 서비스에 로그인합니다.

1. 모바일 앱 또는 웹 애플리케이션은 IAM 역할을 사용하고 [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html)을 호출하여 AWS IoT에서 임시 프로비저닝 클레임 인증서를 가져옵니다.
**참고**  
보안을 위해 `CreateProvisioningClaim`에서 반환한 임시 프로비저닝 클레임 인증서는 5분 후에 만료됩니다. 다음 단계에서는 임시 프로비저닝 클레임 인증서가 만료되기 전에 유효한 인증서를 반환해야 합니다. 임시 프로비저닝 클레임 인증서는 계정의 인증서 목록에 나타나지 않습니다.

1. 모바일 앱 또는 웹 애플리케이션은 Wi-Fi 자격 증명과 같은 필수 구성 정보와 함께 임시 프로비저닝 클레임 인증서를 디바이스에 제공합니다.

1. 디바이스는 임시 프로비저닝 클레임 인증서를 사용하여 [AWS IoT 디바이스 SDK, 모바일 SDK 및 AWS IoT 디바이스 클라이언트](iot-sdks.md)를 통해 AWS IoT 에 연결합니다.

1. 디바이스는 AWS IoT 임시 프로비저닝 클레임 인증서로에 연결한 후 5분 이내에 이러한 옵션 중 하나를 사용하여 영구 인증서와 프라이빗 키를 가져옵니다. 디바이스는 인증서와 이러한 옵션이 향후 모든 인증을 위해 반환하는 키를 사용합니다 AWS IoT.

   1. 를 호출[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)하여 인증 기관을 사용하여 새 AWS 인증서와 프라이빗 키를 생성합니다.

      또는

   1. [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr)을 호출하여 프라이빗 키를 안전하게 유지하는 인증서 서명 요청에서 인증서를 생성합니다.
**참고**  
임시 프로비저닝 클레임 인증서 AWS IoT 로에 연결한 후 5분 이내에 유효한 인증서를 반환[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)해야 [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) 합니다.

1. 디바이스는를 호출[`RegisterThing`](fleet-provision-api.md#register-thing)하여에 디바이스를 등록 AWS IoT 하고 클라우드 리소스를 생성합니다.

   플릿 프로비저닝 서비스는 프로비저닝 템플릿을 사용하여 IoT 사물과 같은 클라우드 리소스를 정의하고 생성합니다. 템플릿에는 사물이 속한 그룹과 속성이 지정될 수 있습니다. 사물 그룹에 새 사물을 추가하려면 먼저 사물 그룹이 있어야 합니다.

1. 디바이스에 영구 인증서를 저장한 후 디바이스는 임시 프로비저닝 클레임 인증서로 시작한 세션과의 연결을 끊고 영구 인증서를 사용하여 다시 연결해야 합니다.

이제 디바이스가와 정상적으로 통신할 준비가 되었습니다 AWS IoT.

## AWS CLI에서 사전 프로비저닝 후크 사용
<a name="hooks-cli-instruc"></a>

다음 절차에서는 사전 프로비저닝 후크를 사용하여 프로비저닝 템플릿을 생성합니다. 여기에 사용된 Lambda 함수는 수정할 수 있는 예제입니다.

**사전 프로비저닝 후크를 생성하여 프로비저닝 템플릿에 적용하려면**

1. 정의된 입력 및 출력이 있는 Lambda 함수를 만듭니다. Lambda 함수는 고도로 사용자 정의 가능합니다. 사전 프로비저닝 후크를 생성하려면 `allowProvisioning` 및 `parameterOverrides`가 필요합니다. Lambda 함수 생성에 대한 자세한 내용은 [AWS 명령줄 인터페이스와 AWS Lambda 함께 사용을 참조하세요](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html).

   다음은 Lambda 함수 출력의 예제입니다.

   ```
   {
     "allowProvisioning": True,
     "parameterOverrides": {
       "incomingKey0": "incomingValue0",
       "incomingKey1": "incomingValue1"
     }
   }
   ```

1. AWS IoT 는 리소스 기반 정책을 사용하여 Lambda를 호출하므로 Lambda 함수를 호출할 수 있는 권한을 부여 AWS IoT 해야 합니다.
**중요**  
권한 조작을 방지하기 위해 Lambda 작업에 연결된 정책의 전역 조건 컨텍스트 키에 `source-arn` 또는 `source-account`가 포함되어야 합니다. 자세한 내용은 [교차 서비스 혼동된 대리인 방지](cross-service-confused-deputy-prevention.md) 단원을 참조하십시오.

   다음은 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html)을 사용하여 Lambda에 대한 권한을 IoT에 부여하는 예제입니다.

   ```
   aws lambda add-permission \
       --function-name myLambdaFunction \
       --statement-id iot-permission \
       --action lambda:InvokeFunction \
       --principal iot.amazonaws.com
   ```

1. [create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html) 또는 [update-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/update-provisioning-template.html) 명령을 사용하여 사전 프로비저닝 후크를 템플릿에 추가합니다.

   다음 CLI 예제에서는 [create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html)을 사용하여 사전 프로비저닝 후크가 있는 프로비저닝 템플릿을 생성합니다.

   ```
   aws iot create-provisioning-template \
       --template-name myTemplate \
       --provisioning-role-arn arn:aws:iam:us-east-1:1234564789012:role/myRole \
       --template-body file://template.json \
       --pre-provisioning-hook file://hooks.json
   ```

   이 명령의 출력은 다음과 같습니다.

   ```
   {
       "templateArn": "arn:aws:iot:us-east-1:1234564789012:provisioningtemplate/myTemplate",
       "defaultVersionId": 1,
       "templateName": myTemplate
   }
   ```

   또한 모든 파라미터를 명령줄 파라미터 값으로 입력하는 대신 파일에서 파라미터를 로드하여 시간을 절약할 수 있습니다. 자세한 내용은 [파일에서 AWS CLI 파라미터 로드](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html)를 참조하세요. 다음은 확장된 JSON 형식의 `template` 파라미터를 보여줍니다.

   ```
   {
       "Parameters" : {
           "DeviceLocation": {
               "Type": "String"
           }
       },
       "Mappings": {
           "LocationTable": {
               "Seattle": {
                   "LocationUrl": "https://example.aws"
               }
           }
       },
       "Resources" : {
           "thing" : {
               "Type" : "AWS::IoT::Thing",
               "Properties" : {
                   "AttributePayload" : {
                       "version" : "v1",
                       "serialNumber" : "serialNumber"
                   },
                   "ThingName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]},
                   "ThingTypeName" : {"Fn::Join":["",["ThingTypePrefix_",{"Ref":"SerialNumber"}]]},
                   "ThingGroups" : ["widgets", "WA"],
                   "BillingGroup": "BillingGroup"
               },
               "OverrideSettings" : {
                   "AttributePayload" : "MERGE",
                   "ThingTypeName" : "REPLACE",
                   "ThingGroups" : "DO_NOTHING"
               }
           },
           "certificate" : {
               "Type" : "AWS::IoT::Certificate",
               "Properties" : {
                   "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
                   "Status" : "Active",
                   "ThingPrincipalType" : "EXCLUSIVE_THING"
               }
           },
           "policy" : {
               "Type" : "AWS::IoT::Policy",
               "Properties" : {
                   "PolicyDocument" : {
                       "Version": "2012-10-17",		 	 	 
                       "Statement": [{
                           "Effect": "Allow",
                           "Action":["iot:Publish"],
                           "Resource": ["arn:aws:iot:us-east-1:504350838278:topic/foo/bar"]
                       }]
                   }
               }
           }
       },
       "DeviceConfiguration": {
           "FallbackUrl": "https://www.example.com/test-site",
           "LocationUrl": {
               "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
       }
   }
   ```

   다음은 확장된 JSON 형식의 `pre-provisioning-hook` 파라미터를 보여줍니다.

   ```
   {
        "targetArn" : "arn:aws:lambda:us-east-1:765219403047:function:pre_provisioning_test",
        "payloadVersion" : "2020-04-01"
   }
   ```

# 디바이스 인증서가 있는 디바이스 프로비저닝
<a name="provision-w-cert"></a>

AWS IoT 는 디바이스에 이미 디바이스 인증서(및 연결된 프라이빗 키)가 있는 경우 디바이스를 프로비저닝하는 세 가지 방법을 제공합니다.
+ 프로비저닝 템플릿을 사용한 단일 사물 프로비저닝. 이 방식은 디바이스를 한 번에 하나씩 프로비저닝해야 하는 경우에 유용한 옵션니다.
+ 디바이스가 처음 연결될 때 디바이스를 프로비저닝하는 템플릿을 사용한 Just-in-time 프로비저닝(JITP). AWS IoT이 방식은 다수의 디바이스를 등록해야 하지만 대량 프로비저닝 목록으로 어셈블할 수 있는 디바이스 정보가 없는 경우에 유용한 옵션입니다.
+ 대량 등록입니다. 이 옵션을 사용하면 S3 버킷의 파일에 저장된 단일 사물 프로비저닝 템플릿 값의 목록을 지정할 수 있습니다. 이 방식은 알려진 디바이스가 다수 있고 원하는 특성을 목록으로 어셈블할 수 있는 경우 유용합니다.

**Topics**
+ [단일 사물 프로비저닝](single-thing-provisioning.md)
+ [JIT 프로비저닝](jit-provisioning.md)
+ [대량 등록](bulk-provisioning.md)

# 단일 사물 프로비저닝
<a name="single-thing-provisioning"></a>

사물을 프로비저닝할 때는 [RegisterThing](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterThing.html) API 또는 `register-thing` CLI 명령을 사용합니다. `register-thing` CLI 명령에서는 다음 인수가 필요합니다.

--template-body  
프로비저닝 템플릿입니다.

--파라미터  
프로비저닝 템플릿에서 사용되는 파라미터의 이름-값 페어 목록으로, JSON 형식을 따릅니다(예: `{"ThingName" : "MyProvisionedThing", "CSR" : "csr-text"}`).

[프로비저닝 템플릿](provision-template.md)을(를) 참조하세요.

[RegisterThing](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterThing.html) 또는 `register-thing`은 리소스 ARN과 생성된 인증서의 텍스트를 반환합니다.

```
{
    "certificatePem": "certificate-text",
    "resourceArns": {
    "PolicyLogicalName": "arn:aws:iot:us-west-2:123456789012:policy/2A6577675B7CD1823E271C7AAD8184F44630FFD7",
    "certificate": "arn:aws:iot:us-west-2:123456789012:cert/cd82bb924d4c6ccbb14986dcb4f40f30d892cc6b3ce7ad5008ed6542eea2b049",
    "thing": "arn:aws:iot:us-west-2:123456789012:thing/MyProvisionedThing"
    }
}
```

파라미터가 딕셔너리에서 생략되면 기본값이 사용됩니다. 기본값이 지정되지 않은 경우에는 파라미터가 값으로 치환되지 않습니다.

# JIT 프로비저닝
<a name="jit-provisioning"></a>

디바이스가 JIT 프로비저닝(JITP)을 통해 디바이스가 AWS IoT연결을 처음 시도할 때 디바이스를 프로비저닝할 수 있습니다. 디바이스를 프로비저닝하려면 자동 등록을 활성화하고, 디바이스 인증서에 서명할 때 사용할 CA 인증서와 프로비저닝 템플릿을 연결해야 합니다. 프로비저닝 성공 및 오류는 Amazon CloudWatch에서 [디바이스 프로비저닝 지표](metrics_dimensions.md#provisioning-metrics)로 로그됩니다.

**Topics**
+ [JITP 개요](#jit-provisioning-overview)
+ [프로비저닝 템플릿을 사용하여 CA 등록](#jit-provisioning-registerCA-template)
+ [프로비저닝 템플릿 이름을 사용하여 CA 등록](#jit-provisioning-registerCA-templateName)

## JITP 개요
<a name="jit-provisioning-overview"></a>

디바이스가 등록된 CA 인증서 AWS IoT 로 서명된 인증서를 사용하여에 연결하려고 하면는 CA 인증서에서 템플릿을 AWS IoT 로드하고 이를 사용하여 [RegisterThing](fleet-provision-api.md#register-thing)을 호출합니다. JITP 워크플로는 상태 값이 `PENDING_ACTIVATION`인 인증서부터 먼저 등록합니다. 디바이스 프로비저닝 흐름이 완료되면 인증서 상태가 `ACTIVE`로 바뀝니다.

AWS IoT 는 프로비저닝 템플릿에서 선언하고 참조할 수 있는 다음 파라미터를 정의합니다.
+ `AWS::IoT::Certificate::Country`
+ `AWS::IoT::Certificate::Organization`
+ `AWS::IoT::Certificate::OrganizationalUnit`
+ `AWS::IoT::Certificate::DistinguishedNameQualifier`
+ `AWS::IoT::Certificate::StateName`
+ `AWS::IoT::Certificate::CommonName`
+ `AWS::IoT::Certificate::SerialNumber`
+ `AWS::IoT::Certificate::Id`

위와 같은 프로비저닝 템플릿 파라미터의 값들은 JITP가 프로비저닝할 디바이스의 인증서에서 제목 필드로부터 추출할 수 있는 값으로 제한됩니다. 인증서에는 템플릿 본문의 모든 파라미터에 대한 값이 포함되어야 합니다. `AWS::IoT::Certificate::Id` 파라미터는 인증서에 포함된 ID가 아니라 내부에서 생성된 ID를 참조합니다. AWS IoT 규칙 내의 `principal()` 함수를 사용하여이 ID의 값을 가져올 수 있습니다.

**참고**  
디바이스의 첫 번째 연결에서 전체 신뢰 체인을 전송할 필요 없이 JITP( AWS IoT Core just-in-time Provisioning) 기능을 사용하여 디바이스를 프로비저닝할 수 있습니다 AWS IoT Core. CA 인증서를 제시하는 것은 선택 사항이지만 디바이스가 AWS IoT Core에 연결할 때 [서버 이름 표시(SNI)](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) 확장을 전송해야 합니다.

### 템플릿 본문 예
<a name="jit-provisioning-example-templatebody"></a>

다음 JSON 파일은 완전한 JITP 템플릿의 템플릿 본문 예입니다.

```
{
   "Parameters":{
      "AWS::IoT::Certificate::CommonName":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::SerialNumber":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Country":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Id":{
         "Type":"String"
      }
   },
   "Resources":{
      "thing":{
         "Type":"AWS::IoT::Thing",
         "Properties":{
            "ThingName":{
               "Ref":"AWS::IoT::Certificate::CommonName"
            },
            "AttributePayload":{
               "version":"v1",
               "serialNumber":{
                  "Ref":"AWS::IoT::Certificate::SerialNumber"
               }
            },
            "ThingTypeName":"lightBulb-versionA",
            "ThingGroups":[
               "v1-lightbulbs",
               {
                  "Ref":"AWS::IoT::Certificate::Country"
               }
            ]
         },
         "OverrideSettings":{
            "AttributePayload":"MERGE",
            "ThingTypeName":"REPLACE",
            "ThingGroups":"DO_NOTHING"
         }
      },
      "certificate":{
         "Type":"AWS::IoT::Certificate",
         "Properties":{
            "CertificateId":{
               "Ref":"AWS::IoT::Certificate::Id"
            },
            "Status":"ACTIVE"
         }
      },
      "policy":{
         "Type":"AWS::IoT::Policy",
         "Properties":{
            "PolicyDocument":"{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
         }
      }
   }
}
```

이 예제 템플릿은 인증서에서 추출되고 `Resources` 섹션에서 사용되는 `AWS::IoT::Certificate::CommonName`, `AWS::IoT::Certificate::SerialNumber`, `AWS::IoT::Certificate::Country` 및 `AWS::IoT::Certificate::Id` 프로비저닝 파라미터의 값을 선언합니다. 그러면 JITP 워크플로우가 이 템플릿을 사용하여 다음 작업을 수행합니다.
+ 인증서를 등록하고 상태를 PENDING\$1ACTIVE로 설정
+ 사물 리소스 하나를 생성
+ 정책 리소스 하나를 생성
+ 정책을 인증서에 연결
+ 인증서를 사물에 연결합니다.
+ 인증서 상태를 ACTIVE로 업데이트

인증서에서 `templateBody`의 `Parameters` 섹션에 언급된 모든 속성이 없으면 디바이스 프로비저닝이 실패합니다. 예를 들어, `AWS::IoT::Certificate::Country`가 템플릿에 포함되어 있지만 인증서에는 `Country` 속성이 없으면 디바이스 프로비저닝이 실패합니다.

또한 CloudTrail을 사용하여 JITP 템플릿과 관련된 문제를 해결할 수도 있습니다. Amazon CloudWatch에 로그된 지표에 대한 자세한 내용은 [디바이스 프로비저닝 지표](metrics_dimensions.md#provisioning-metrics) 단원을 참조하세요. 프로비저닝 템플릿에 대한 자세한 내용은 [프로비저닝 템플릿](provision-template.md)을 참조하세요.

**참고**  
프로비저닝 프로세스 중에 just-in-time 프로비저닝(JITP)은 다른 AWS IoT 컨트롤 플레인 API 작업을 호출합니다. 이러한 호출이 계정에 설정된 [AWS IoT 조절 할당량](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#throttling-limits)을 초과하면 호출이 제한될 수 있습니다. 필요한 경우 제한 할당량을 높이려면 [AWS 고객 지원](https://console.aws.amazon.com/support/home)에 문의하세요.

## 프로비저닝 템플릿을 사용하여 CA 등록
<a name="jit-provisioning-registerCA-template"></a>

전체 프로비저닝 템플릿을 사용하여 CA를 등록하려면 다음 단계를 수행합니다.

1. 프로비저닝 템플릿과 역할 ARN 정보를 다음 예와 같이 JSON 파일로 저장합니다.

   ```
   { 
        "templateBody" : "{\r\n    \"Parameters\" : {\r\n        \"AWS::IoT::Certificate::CommonName\": {\r\n            \"Type\": \"String\"\r\n        },\r\n        \"AWS::IoT::Certificate::SerialNumber\": {\r\n            \"Type\": \"String\"\r\n        },\r\n        \"AWS::IoT::Certificate::Country\": {\r\n            \"Type\": \"String\"\r\n        },\r\n        \"AWS::IoT::Certificate::Id\": {\r\n            \"Type\": \"String\"\r\n        }\r\n    },\r\n    \"Resources\": {\r\n        \"thing\": {\r\n            \"Type\": \"AWS::IoT::Thing\",\r\n            \"Properties\": {\r\n                \"ThingName\": {\r\n                    \"Ref\": \"AWS::IoT::Certificate::CommonName\"\r\n                },\r\n                \"AttributePayload\": {\r\n                    \"version\": \"v1\",\r\n                    \"serialNumber\": {\r\n                        \"Ref\": \"AWS::IoT::Certificate::SerialNumber\"\r\n                    }\r\n                },\r\n                \"ThingTypeName\": \"lightBulb-versionA\",\r\n                \"ThingGroups\": [\r\n                    \"v1-lightbulbs\",\r\n                    {\r\n                        \"Ref\": \"AWS::IoT::Certificate::Country\"\r\n                    }\r\n                ]\r\n            },\r\n            \"OverrideSettings\": {\r\n                \"AttributePayload\": \"MERGE\",\r\n                \"ThingTypeName\": \"REPLACE\",\r\n                \"ThingGroups\": \"DO_NOTHING\"\r\n            }\r\n        },\r\n        \"certificate\": {\r\n            \"Type\": \"AWS::IoT::Certificate\",\r\n            \"Properties\": {\r\n                \"CertificateId\": {\r\n                    \"Ref\": \"AWS::IoT::Certificate::Id\"\r\n                },\r\n                \"Status\": \"ACTIVE\"\r\n            },\r\n            \"OverrideSettings\": {\r\n                \"Status\": \"DO_NOTHING\"\r\n            }\r\n        },\r\n        \"policy\": {\r\n            \"Type\": \"AWS::IoT::Policy\",\r\n            \"Properties\": {\r\n                \"PolicyDocument\": \"{ \\\"Version\\\": \\\"2012-10-17		 	 	 \\\", \\\"Statement\\\": [{ \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\":[\\\"iot:Publish\\\"], \\\"Resource\\\": [\\\"arn:aws:iot:us-east-1:123456789012:topic\/foo\/bar\\\"] }] }\"\r\n            }\r\n        }\r\n    }\r\n}",
        "roleArn" : "arn:aws:iam::123456789012:role/JITPRole"
   }
   ```

   이 예에서 `templateBody` 필드의 값은 이스케이프된 문자열로 지정된 JSON 객체여야 하며 [이전 목록](#jit-provisioning-overview)에 포함된 값만 사용할 수 있습니다. 다양한 도구를 사용하여 `json.dumps`(Python) 또는 `JSON.stringify`(노드)와 같은 필수 JSON 출력을 생성할 수 있습니다. `roleARN` 필드의 값은 `AWSIoTThingsRegistration`이 연결된 역할의 ARN이어야 합니다. 또한 템플릿이 예제의 인라인 `PolicyDocument` 대신 기존 `PolicyName`을 사용할 수 있습니다.

1. [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) API 작업 또는 [https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html) CLI 명령을 사용하여 CA 인증서를 등록합니다. 이전 단계에서 저장한 프로비저닝 템플릿 및 역할 ARN 정보의 디렉터리를 지정합니다.

   다음은 AWS CLI를 사용하여 `DEFAULT` 모드로 CA 인증서를 등록하는 방법의 예제입니다.

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --verification-cert file://your-verification-cert 
                   --set-as-active --allow-auto-registration --registration-config file://your-template
   ```

   다음은 AWS CLI를 사용하여 `SNI_ONLY` 모드로 CA 인증서를 등록하는 방법의 예제입니다.

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --certificate-mode SNI_ONLY
                    --set-as-active --allow-auto-registration --registration-config file://your-template
   ```

   자세한 정보는 [CA 인증서 등록](https://docs.aws.amazon.com//iot/latest/developerguide/register-CA-cert.html)을 참조하세요.

1.  (선택 사항) [UpdateCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html) API 작업 또는 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-ca-certificate.html) CLI 명령을 사용하여 CA 인증서 설정을 업데이트합니다.

   다음은 AWS CLI를 사용하여 CA 인증서를 업데이트하는 방법의 예입니다.

   ```
   aws iot update-ca-certificate --certificate-id caCertificateId
                   --new-auto-registration-status ENABLE --registration-config file://your-template
   ```

## 프로비저닝 템플릿 이름을 사용하여 CA 등록
<a name="jit-provisioning-registerCA-templateName"></a>

프로비저닝 템플릿 이름을 사용하여 CA를 등록하려면 다음 단계를 수행합니다.

1. 프로비저닝 템플릿 본문을 JSON 파일로 저장합니다. [템플릿 본문 예](#jit-provisioning-example-templatebody)에서 템플릿 본문 예를 찾을 수 있습니다.

1. 프로비저닝 템플릿을 생성하려면 [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html) API 또는 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-provisioning-template.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-provisioning-template.html) CLI 명령을 사용합니다.

   ```
   aws iot create-provisioning-template --template-name your-template-name \
           --template-body file://your-template-body.json --type JITP \
           --provisioning-role-arn arn:aws:iam::123456789012:role/test
   ```
**참고**  
JIT 프로비저닝(JITP)의 경우 프로비저닝 템플릿을 생성할 때 템플릿 유형을 `JITP`로 지정해야 합니다. 템플릿 유형에 대한 자세한 내용은 *AWS API 참조*의 [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)을 참조하세요.

1. 템플릿 이름으로 CA를 등록하려면 [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) API 또는 [https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html) CLI 명령을 사용합니다.

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --verification-cert file://your-verification-cert \
           --set-as-active --allow-auto-registration --registration-config templateName=your-template-name
   ```

# 대량 등록
<a name="bulk-provisioning"></a>

[https://docs.aws.amazon.com/iot/latest/apireference/API_StartThingRegistrationTask.html](https://docs.aws.amazon.com/iot/latest/apireference/API_StartThingRegistrationTask.html) 명령을 사용하여 대량으로 사물을 등록할 수 있습니다. 이 명령에서는 프로비저닝 템플릿, S3 버킷 이름, 키 이름, 그리고 S3 버킷의 파일에 대한 액세스를 허용하는 역할 ARN이 필요합니다. S3 버킷의 파일은 템플릿의 파라미터를 대체하는 데 사용되는 값을 포함합니다. 파일은 줄 바꿈으로 구분된(newline-delimited) JSON 파일이어야 합니다. 각 줄은 단일 디바이스를 등록하기 위한 모든 파라미터 값을 포함합니다. 예:

```
{"ThingName": "foo", "SerialNumber": "123", "CSR": "csr1"}
{"ThingName": "bar", "SerialNumber": "456", "CSR": "csr2"}
```

다음과 같은 대량 등록 관련 API 작업이 유용할 수 있습니다.
+ [ListThingRegistrationTasks](https://docs.aws.amazon.com/iot/latest/apireference/API_ListThingRegistrationTasks.html): 현재 대량 사물 프로비저닝 작업을 나열합니다.
+ [DescribeThingRegistrationTask](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeThingRegistrationTask.html): 특정 대량 사물 등록 작업에 대한 정보를 제공합니다.
+ [StopThingRegistrationTask](https://docs.aws.amazon.com/iot/latest/apireference/API_StopThingRegistrationTask.html): 대량 사물 등록 작업을 중지합니다.
+ [ListThingRegistrationTaskReports](https://docs.aws.amazon.com/iot/latest/apireference/API_ListThingRegistrationTaskReports.html): 대량 사물 등록 작업에 대한 결과 및 실패를 확인하는 데 사용됩니다.

**참고**  
대량 등록 작업은 계정당 한 번에 하나씩만 실행할 수 있습니다.
대량 등록 작업은 다른 AWS IoT 컨트롤 플레인 API 작업을 호출합니다. 이러한 호출이 계정의 [AWS IoT 조절 할당량](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#throttling-limits)을 초과해서 조절 오류가 발생할 수 있습니다. 필요한 경우 [AWS 고객 지원](https://console.aws.amazon.com/support/home) 센터에 문의하여 AWS IoT 제한 할당량을 늘리세요.

# 프로비저닝 템플릿
<a name="provision-template"></a>

프로비저닝 템플릿은 파라미터를 사용하여 디바이스가 상호 작용에 사용해야 하는 리소스를 설명하는 JSON 문서입니다 AWS IoT. 프로비저닝 템플릿에는 `Parameters`와 `Resources`, 2가지 섹션이 포함됩니다. 에는 두 가지 유형의 프로비저닝 템플릿이 있습니다 AWS IoT. 하나는 JIT 프로비저닝(JITP) 및 대량 등록에 사용되는 템플릿이고, 다른 하나는 플릿 프로비저닝에 사용되는 템플릿입니다.

**Topics**
+ [파라미터 섹션](#parameters-section)
+ [리소스 섹션](#resources-section)
+ [대량 등록에 대한 템플릿 예](#bulk-template-example)
+ [JIT 프로비저닝(JITP)의 템플릿 예](#JITP-template-example)
+ [플릿 프로비저닝](#fleet-provision-template)

## 파라미터 섹션
<a name="parameters-section"></a>

`Parameters` 섹션은 `Resources` 섹션에서 사용할 파라미터를 선언합니다. 각 파라미터는 이름과 형식, 그리고 옵션으로 기본값을 선언합니다. 기본값은 템플릿과 함께 전달되는 딕셔너리에 파라미터 값이 포함되어 있지 않을 때 사용합니다. 템플릿 문서의 `Parameters` 섹션은 다음과 같습니다.

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CSR" : {
            "Type" : "String"    
        }
    }
}
```

위의 템플릿 본문 코드 조각에서는 `ThingName`, `SerialNumber`, `Location`, `CSR`의 4가지 파라미터를 선언하고 있습니다. 이 파라미터들은 모두 `String` 형식을 갖습니다. `Location` 파라미터는 기본값으로 `"WA"`를 선언하고 있습니다.

## 리소스 섹션
<a name="resources-section"></a>

템플릿 본문의 `Resources` 섹션에서는 디바이스가 AWS IoT사물, 인증서 및 하나 이상의 IoT 정책과 통신하는 데 필요한 리소스를 선언합니다. 각 리소스는 논리적 이름과 유형, 그리고 여러 가지 속성을 지정합니다.

논리적 이름은 템플릿의 다른 곳에서 리소스를 참조하는 데 사용됩니다.

유형은 선언하는 리소스 종류를 지정합니다. 유효한 유형은 다음과 같습니다.
+ `AWS::IoT::Thing`
+ `AWS::IoT::Certificate`
+ `AWS::IoT::Policy`

지정하는 속성은 선언하는 리소스 유형에 따라 달라집니다.

### 사물 리소스
<a name="thing-resources"></a>

사물 리소스는 다음 속성을 사용하여 선언합니다.
+ `ThingName`: 문자열.
+ `AttributePayload`: 선택 사항입니다. 이름-값 페어 목록입니다.
+ `ThingTypeName`: 선택 사항. 사물에 연결되어 있는 사물 유형을 나타내는 문자열
+ `ThingGroups`: 선택 사항. 사물이 속하는 그룹의 목록
+ `BillingGroup`: 선택 사항입니다. 연결된 결제 그룹 이름의 문자열
+ `PackageVersions`: 선택 사항입니다. 연결된 패키지 및 버전 이름의 문자열

### 인증서 리소스
<a name="certificate-resources"></a>

다음 방법 중 하나로 인증서를 지정할 수 있습니다.
+ 인증서 서명 요청(CSR)
+ 기존 디바이스 인증서의 ID (플릿 프로비저닝 템플릿에는 인증서 ID만 사용할 수 있습니다.)
+  AWS IoT에 등록한 CA 인증서로 생성된 디바이스 인증서. 동일한 제목 필드로 등록한 CA 인증서가 2개 이상인 경우에는 디바이스 인증서 서명에 사용한 CA 인증서도 전달해야 합니다.

**참고**  
템플릿에서 인증서를 선언할 때는 이들 방법 중에서 한 가지만 사용하세요. 예를 들어 CSR을 사용하는 경우 인증서 ID 또는 디바이스 인증서는 지정할 수 없습니다. 자세한 내용은 [X.509 클라이언트 인증서](x509-client-certs.md) 단원을 참조하세요.

자세한 내용은 [X.509 인증서 개요](authentication.md#x509-certificate-overview) 단원을 참조하세요.

인증서 리소스는 다음 속성을 사용하여 선언합니다.
+ `CertificateSigningRequest`: 문자열.
+ `CertificateId`: 문자열.
+ `CertificatePem`: 문자열.
+ `CACertificatePem`: 문자열.
+ `Status`: 선택 사항. `ACTIVE` 또는 `INACTIVE`일 수 있는 문자열입니다. 기본값은 ACTIVE입니다.
+ `ThingPrincipalType`: 선택 사항입니다. 사물과 위탁자(인증서) 간의 관계 유형을 지정하는 문자열입니다.
  + `EXCLUSIVE_THING`: 독점적 관계를 설정합니다. 위탁자는 이 특정 사물에만 연결할 수 있으며 다른 사물에는 연결할 수 없습니다.
  + `NON_EXCLUSIVE_THING`: 지정한 위탁자를 여러 사물에 연결합니다. 여러 사물을 위탁자에 연결할 수 있습니다. 지정하지 않은 경우의 기본값입니다.
**참고**  
디바이스 인증서 없이 디바이스를 프로비저닝할 수도 있습니다. 자세한 내용은 [플릿 프로비저닝을 사용하여 디바이스 인증서가 없는 디바이스 프로비저닝](provision-wo-cert.md) 단원을 참조하십시오.

예시:
+ CSR을 사용하여 지정된 인증서:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CertificateSigningRequest": {"Ref" : "CSR"},
              "Status" : "ACTIVE"      
          }
      }
  }
  ```
+ 기존 인증서 ID를 사용하여 지정된 인증서:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CertificateId": {"Ref" : "CertificateId"}
          }
      }
  }
  ```
+ 기존 인증서 .pem 및 CA 인증서 .pem을 사용하여 지정된 인증서:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CACertificatePem": {"Ref" : "CACertificatePem"},
              "CertificatePem": {"Ref" : "CertificatePem"}
          }
      }
  }
  ```
+ 하나의 위탁자에 하나의 사물만 독점적으로 연결합니다.

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "ThingPrincipalType" : "EXCLUSIVE_THING"
          }
      }
  }
  ```

### 정책 리소스
<a name="policy-resources"></a>

정책 리소스는 다음 속성 중 한 가지를 사용하여 선언합니다.
+ `PolicyName`: 선택 사항. 문자열. 기본 값은 정책 문서의 해시입니다. `PolicyName`은 AWS IoT 정책만 참조할 수 있고 IAM 정책은 참조할 수 없습니다. `PolicyName` 속성에 기존 AWS IoT 정책을 사용하는 경우 정책의 이름을 입력합니다. `PolicyDocument` 속성은 포함하지 마세요.
+ `PolicyDocument`: 선택 사항. 이스케이프된 문자열로 지정된 JSON 객체. `PolicyDocument`를 입력하지 않는 경우에는 정책이 이미 생성되어 있어야 합니다.

**참고**  
`Policy` 섹션이 존재하는 경우에는 `PolicyName` 또는 `PolicyDocument`를 지정해야 합니다(두 속성을 모두 지정할 수는 없습니다).

### 설정 재정의
<a name="override-settings"></a>

템플릿이 기존 리소스를 지정하는 경우에는 `OverrideSettings` 섹션에서 실행할 작업을 지정할 수 있습니다.

`DO_NOTHING`  
리소스를 그대로 유지합니다.

`REPLACE`  
리소스를 템플릿에서 지정하는 리소스로 변경합니다.

`FAIL`  
`ResourceConflictsException`을 사용해 리소스를 중단합니다.

`MERGE`  
`thing`의 `ThingGroups` 및 `AttributePayload` 속성에만 유효합니다. 사물의 그룹 멤버십이나 기존 속성과 템플릿에 지정된 속성을 병합합니다.

특정 사물을 리소스로 선언할 때 다음 속성에 `OverrideSettings`를 지정할 수 있습니다.
+ `ATTRIBUTE_PAYLOAD`
+ `THING_TYPE_NAME`
+ `THING_GROUPS`

인증서 리소스를 선언할 경우 `Status` 속성에 `OverrideSettings`를 지정할 수 있습니다.

정책 리소스에는 `OverrideSettings`를 사용할 수 없습니다.

### 리소스 예제
<a name="resource-example"></a>

다음은 사물, 인증서 및 정책을 선언하는 템플릿 조각입니다.

```
{ 
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}, 
                "ThingTypeName" :  "lightBulb-versionA",
                "ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
            },
            "OverrideSettings" : {
                "AttributePayload" : "MERGE",
                "ThingTypeName" : "REPLACE",
                "ThingGroups" : "DO_NOTHING"
            }
        },  
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateSigningRequest": {"Ref" : "CSR"},
                "Status" : "ACTIVE"      
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }
}
```

위 예제에서 사물은 다음과 같이 선언되어 있습니다.
+ 논리적 이름: `"thing"`
+ 유형: `AWS::IoT::Thing`
+  여러 가지 사물 속성

  사물 속성 중에는 사물 이름, 속성 집합, 사물 유형 이름(선택적), 사물이 속하는 사물 그룹 목록(선택적)이 있습니다.

파라미터는 `{"Ref":"parameter-name"}`에서 참조할 수 있습니다. 템플릿을 평가할 때는 파라미터가 템플릿과 함께 전달되는 딕셔터리의 파라미터 값으로 치환됩니다.

위 예제에서 인증서는 다음과 같이 선언되어 있습니다.
+ 논리적 이름: `"certificate"`
+ 유형: `AWS::IoT::Certificate`
+ 속성 집합

  속성 중에는 인증서 CSR과 `ACTIVE` 상태 설정이 있습니다. CSR 텍스트는 템플릿과 함께 전달되는 딕셔너리에서 파라미터로 전달됩니다.

위 예제에서 정책은 다음과 같이 선언되어 있습니다.
+ 논리적 이름: `"policy"`
+ 유형: `AWS::IoT::Policy`
+ 기존 정책의 이름 또는 정책 문서

## 대량 등록에 대한 템플릿 예
<a name="bulk-template-example"></a>

다음 JSON 파일은 CSR을 사용하여 인증서를 지정하는 완전한 프로비저닝 템플릿의 예제입니다.

(`PolicyDocument` 필드 값은 이스케이프된 문자열로 지정된 JSON 객체여야 합니다.)

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CSR" : {
            "Type" : "String"    
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}, 
                "ThingTypeName" :  "lightBulb-versionA",
                "ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateSigningRequest": {"Ref" : "CSR"},
                "Status" : "ACTIVE",
                "ThingPrincipalType" : "EXCLUSIVE_THING"
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }
}
```

## JIT 프로비저닝(JITP)의 템플릿 예
<a name="JITP-template-example"></a>

다음 JSON 파일은 인증서 ID를 사용하여 기존 인증서를 지정하는 완전한 프로비저닝 템플릿의 예제입니다.

```
{
   "Parameters":{
      "AWS::IoT::Certificate::CommonName":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::SerialNumber":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Country":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Id":{
         "Type":"String"
      }
   },
   "Resources":{
      "thing":{
         "Type":"AWS::IoT::Thing",
         "Properties":{
            "ThingName":{
               "Ref":"AWS::IoT::Certificate::CommonName"
            },
            "AttributePayload":{
               "version":"v1",
               "serialNumber":{
                  "Ref":"AWS::IoT::Certificate::SerialNumber"
               }
            },
            "ThingTypeName":"lightBulb-versionA",
            "ThingGroups":[
               "v1-lightbulbs",
               {
                  "Ref":"AWS::IoT::Certificate::Country"
               }
            ]
         },
         "OverrideSettings":{
            "AttributePayload":"MERGE",
            "ThingTypeName":"REPLACE",
            "ThingGroups":"DO_NOTHING"
         }
      },
      "certificate":{
         "Type":"AWS::IoT::Certificate",
         "Properties":{
            "CertificateId":{
               "Ref":"AWS::IoT::Certificate::Id"
            },
            "Status":"ACTIVE",
            "ThingPrincipalType" : "EXCLUSIVE_THING"
         }
      },
      "policy":{
         "Type":"AWS::IoT::Policy",
         "Properties":{
            "PolicyDocument":"{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
         }
      }
   }
}
```

**중요**  
JIT 프로비저닝에 사용되는 템플릿에서 `CertificateId`를 사용해야 합니다.

프로비저닝 템플릿 유형에 대한 자세한 내용은 AWS API 참조의 섹션을 참조[https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html#iot-CreateProvisioningTemplate-request-type](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html#iot-CreateProvisioningTemplate-request-type)하세요.

이 템플릿을 사용하여 JIT 프로비저닝을 수행하는 방법에 대한 자세한 내용은 [JIT 프로비저닝](https://docs.aws.amazon.com/iot/latest/developerguide/jit-provisioning.html)을 참조하세요.

## 플릿 프로비저닝
<a name="fleet-provision-template"></a>

플릿 프로비저닝 템플릿은에서 클라우드 및 디바이스 구성을 설정하는 AWS IoT 데 사용됩니다. 이러한 템플릿은 JITP 및 대량 등록 템플릿과 동일한 파라미터 및 리소스를 사용합니다. 자세한 내용은 [프로비저닝 템플릿](#provision-template) 단원을 참조하세요. 플릿 프로비저닝 템플릿은 `Mapping` 섹션 및 `DeviceConfiguration` 섹션을 포함할 수 있습니다. 플릿 프로비저닝 템플릿 내에서 내장 함수를 사용하여 디바이스별 구성을 생성할 수 있습니다. 플릿 프로비저닝 템플릿은 이름이 지정된 리소스이며 ARN으로 식별됩니다(예: `arn:aws:iot:us-west-2:1234568788:provisioningtemplate/templateName`).

### 매핑
<a name="mappings"></a>

`Mappings` 섹션(선택 사항)은 키를 해당하는 명명된 값 세트와 맞춥니다. 예를 들어 리전을 기반으로 AWS 값을 설정하려면 AWS 리전 이름을 키로 사용하고 각 특정 리전에 지정하려는 값을 포함하는 매핑을 생성할 수 있습니다. `Fn::FindInMap` 내장 함수를 사용하여 맵에서 값을 불러올 수 있습니다.

`Mappings` 섹션에는 파라미터, 가상 파라미터 또는 호출 내장 함수를 포함할 수 없습니다.

### 디바이스 구성
<a name="device-config"></a>

디바이스 구성 섹션은 프로비저닝할 때 디바이스에 전송할 임의의 데이터를 포함합니다. 예제: 

```
{
    "DeviceConfiguration": {
        "Foo":"Bar"
    }
}
```

JavaScript Object Notation(JSON) 페이로드 형식을 사용하여 디바이스에 메시지를 보내는 경우는이 데이터를 JSON으로 AWS IoT Core 포맷합니다. CBOR(간결한 이진 객체 표현) 페이로드 형식을 사용하는 경우 AWS IoT Core 는 이 데이터를 CBOR로 포맷합니다. `DeviceConfiguration` 섹션은 중첩 JSON 객체를 지원하지 않습니다.

### 내장 함수
<a name="intrinsic-functions"></a>

내장 함수는 `Mappings` 섹션을 제외한 프로비저닝 템플릿의 모든 섹션에서 사용됩니다.

`Fn::Join`  
지정된 구분 기호로 구분된 값 집합을 단일 값에 추가합니다. 구분 기호가 빈 문자열이면 값은 구분 기호 없이 연결됩니다.  
[정책 리소스](#policy-resources)에는 `Fn::Join`이 지원되지 않습니다.

`Fn::Select`  
인덱스별로 객체 목록에서 단일 객체를 반환합니다.  
인덱스가 어레이 범위를 벗어나는 경우 `Fn::Select`는 `null` 값을 확인하지 않습니다. 두 조건 모두 프로비저닝 오류가 발생하므로 유효한 인덱스 값을 선택하고 목록에 null이 아닌 값이 포함되어 있는지 확인해야 합니다.

`Fn::FindInMap`  
`Mappings` 섹션에서 선언된 2수준 맵의 키에 해당하는 값을 반환합니다.

`Fn::Split`  
문자열 목록에서 요소를 선택할 수 있도록 문자열을 문자열 값 목록으로 분할합니다. 문자열이 분할되는 위치를 결정하는 구분 기호(예: 쉼표)를 지정합니다. 문자열을 분할한 후 `Fn::Select`를 사용하여 요소를 선택합니다.  
예를 들어, 쉼표로 구분된 서브넷 ID 문자열을 스택 템플릿으로 가져올 경우 각 쉼표로 문자열을 분할할 수 있습니다. 서브넷 ID 목록에서 `Fn::Select`를 사용하여 리소스의 서브넷 ID를 지정합니다.

`Fn::Sub`  
입력 문자열의 변수를 사용자가 지정한 값으로 바꿉니다. 이 함수를 사용하여 스택을 생성하거나 업데이트해야만 사용할 수 있는 값이 포함된 명령 또는 출력을 작성할 수 있습니다.

### 플릿 프로비저닝 템플릿 예
<a name="fleet-provisioning-example"></a>

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber": {
            "Type": "String"
        },
        "DeviceLocation": {
            "Type": "String"
        }
    },
    "Mappings": {
        "LocationTable": {
            "Seattle": {
                "LocationUrl": "https://example.aws"
            }
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "AttributePayload" : { 
                    "version" : "v1",
                    "serialNumber" : "serialNumber"
                },
                "ThingName" : {"Ref" : "ThingName"},
                "ThingTypeName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]},
                "ThingGroups" : ["v1-lightbulbs", "WA"],
                "BillingGroup": "LightBulbBillingGroup"
            },
            "OverrideSettings" : {
                "AttributePayload" : "MERGE",
                "ThingTypeName" : "REPLACE",
                "ThingGroups" : "DO_NOTHING"
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
                "Status" : "Active",
                "ThingPrincipalType" : "EXCLUSIVE_THING"
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [{
                        "Effect": "Allow",
                        "Action":["iot:Publish"],
                        "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/foo/bar"]
                    }]
                }
            }
        }
    },
    "DeviceConfiguration": {
        "FallbackUrl": "https://www.example.com/test-site",
        "LocationUrl": {
            "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
        }
}
```

**참고**  
기존 프로비저닝 템플릿을 업데이트하여 [사전 프로비저닝 후크](pre-provisioning-hook.md)를 추가할 수 있습니다.

# 사전 프로비저닝 후크
<a name="pre-provisioning-hook"></a>

AWS 에서는 프로비저닝 템플릿을 생성할 때 사전 프로비저닝 후크 함수를 사용하여 계정 온보딩 대상 및 디바이스 수를 더 잘 제어할 것을 권장합니다. 사전 프로비저닝 후크는 디바이스 프로비저닝을 허용하기 전에 디바이스에서 전달된 파라미터의 유효성을 검사하는 Lambda 함수입니다. 이 Lambda 함수는 디바이스가 [RegisterThing](fleet-provision-api.md#register-thing)을 통해 요청을 전송할 때마다 호출되므로 디바이스를 프로비저닝하기 전에 계정에 있어야 합니다.

**중요**  
권한 조작을 방지하기 위해 Lambda 작업에 연결된 정책의 전역 조건 컨텍스트 키에 `source-arn` 또는 `source-account`가 포함되어야 합니다. 자세한 내용은 [교차 서비스 혼동된 대리인 방지](cross-service-confused-deputy-prevention.md) 단원을 참조하십시오.

디바이스를 프로비저닝하려면 Lambda 함수가 입력 객체를 수락하고 이 섹션에 설명된 출력 객체를 반환해야 합니다. Lambda 함수가 `"allowProvisioning": True`의 객체를 반환하는 경우에만 프로비저닝이 진행됩니다.

## 사전 프로비저닝 후크 입력
<a name="pre-provisioning-hook-input"></a>

AWS IoT 는 디바이스가에 등록할 때이 객체를 Lambda 함수로 전송합니다 AWS IoT.

```
{
    "claimCertificateId" : "string",
    "certificateId" : "string",
    "certificatePem" : "string",
    "templateArn" : "arn:aws:iot:us-east-1:1234567890:provisioningtemplate/MyTemplate",
    "clientId" : "221a6d10-9c7f-42f1-9153-e52e6fc869c1",
    "parameters" : {
        "string" : "string",
        ...
    }
}
```

Lambda 함수에 전달된 `parameters` 객체는 [RegisterThing](fleet-provision-api.md#register-thing) 요청 페이로드에서 전달된 `parameters` 인수의 속성을 포함합니다.

## 사전 프로비저닝 후크 반환 값
<a name="pre-provisioning-hook-output"></a>

Lambda 함수는 프로비저닝 요청을 승인했는지 여부를 나타내는 응답과, 재정의할 속성의 값을 반환해야 합니다.

다음은 사전 프로비저닝 함수에서 성공한 응답의 예입니다.

```
{
    "allowProvisioning": true,
    "parameterOverrides" : {
        "Key": "newCustomValue",
        ...
    }
}
```

`"parameterOverrides"` 값이 [RegisterThing](fleet-provision-api.md#register-thing) 요청 페이로드의 `"parameters"` 파라미터에 추가됩니다.

**참고**  
Lambda 함수가 실패하면 프로비저닝 요청은 `ACCESS_DENIED`와 함께 실패하며 CloudWatch Logs에 오류가 기록됩니다.
Lambda 함수가 응답에서 `"allowProvisioning": "true"`를 반환하지 않는 경우 프로비저닝 요청은 `ACCESS_DENIED`와 함께 실패합니다.
Lambda 함수는 실행을 완료하고 5초 이내에 반환해야 합니다. 그렇지 않으면 프로비저닝 요청이 실패합니다.

## 사전 프로비저닝 후크 Lambda 예제
<a name="pre-provisioning-example"></a>

------
#### [ Python ]

Python에서 사전 프로비저닝 후크 Lambda 예제.

```
import json

def pre_provisioning_hook(event, context):
    print(event)

    return {
        'allowProvisioning': True,
        'parameterOverrides': {
            'DeviceLocation': 'Seattle'
        }
    }
```

------
#### [ Java ]

Java에서 사전 프로비저닝 후크 Lambda 예제.

핸들러 클래스:

```
package example;

import java.util.Map;
import java.util.HashMap;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class PreProvisioningHook implements RequestHandler<PreProvisioningHookRequest, PreProvisioningHookResponse> {

    public PreProvisioningHookResponse handleRequest(PreProvisioningHookRequest object, Context context) {
        Map<String, String> parameterOverrides = new HashMap<String, String>();
        parameterOverrides.put("DeviceLocation", "Seattle");

        PreProvisioningHookResponse response = PreProvisioningHookResponse.builder()
                .allowProvisioning(true)
                .parameterOverrides(parameterOverrides)
                .build();

        return response;
    }

}
```

요청 클래스:

```
package example;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PreProvisioningHookRequest {
    private String claimCertificateId;
    private String certificateId;
    private String certificatePem;
    private String templateArn;
    private String clientId;
    private Map<String, String> parameters;
}
```

응답 클래스:

```
package example;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PreProvisioningHookResponse {
    private boolean allowProvisioning;
    private Map<String, String> parameterOverrides;
}
```

------
#### [ JavaScript ]

JavaScript에서 사전 프로비저닝 후크 Lambda 예시.

```
exports.handler = function(event, context, callback) {
    console.log(JSON.stringify(event, null, 2));
    var reply = { 
        allowProvisioning: true,
        parameterOverrides: {
            DeviceLocation: 'Seattle'
        }
     };
     callback(null, reply);
}
```

------

# 인증서 공급자를 사용한 자체 관리형 AWS IoT Core 인증서 서명
<a name="provisioning-cert-provider"></a>

 AWS IoT Core 인증서 공급자를 생성하여 AWS IoT 플릿 프로비저닝에서 인증서 서명 요청(CSRs)에 서명할 수 있습니다. 인증서 공급자는 Lambda 함수와 [플릿 프로비저닝을 위한 `CreateCertificateFromCsr` MQTT API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)를 참조합니다. Lambda 함수는 CSR을 수락하고 서명된 클라이언트 인증서를 반환합니다.

에 인증서 공급자가 없는 경우 AWS 계정[CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)가 플릿 프로비저닝에서 호출되어 CSR에서 인증서를 생성합니다. 인증서 공급자를 생성하면 [CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)의 동작이 변경되고 이 MQTT API에 대한 모든 직접 호출이 인증서 공급자를 간접적으로 호출하여 인증서를 발급합니다.

 AWS IoT Core 인증서 공급자를 사용하면 , [AWS Private CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)기타 공개적으로 신뢰할 수 있는 CAs 또는 자체 퍼블릭 키 인프라(PKI)와 같은 프라이빗 인증 기관(CAs 활용하여 CSR에 서명하는 솔루션을 구현할 수 있습니다. 또한 인증서 공급자를 사용하여 유효 기간, 서명 알고리즘, 발급자 및 확장과 같은 클라이언트 인증서의 필드를 사용자 지정할 수 있습니다.

**중요**  
 AWS 계정마다 하나의 인증서 공급자만 생성할 수 있습니다. 서명 동작 변경은 AWS 계정에서 인증서 공급자를 삭제할 때까지 [CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)를 직접적으로 호출하는 전체 플릿에 적용됩니다.

**Topics**
+ [플릿 프로비저닝에서 자체 관리형 인증서 서명의 작동 방식](#provisioning-cert-provider-how-it-works)
+ [인증서 공급자 Lambda 함수 입력](#provisioning-cert-provider-lambda-input)
+ [인증서 공급자 Lambda 함수 반환 값](#provisioning-cert-provider-lambda-return)
+ [Lambda 함수 예제](#provisioning-cert-provider-lambda)
+ [플릿 프로비저닝을 위한 자체 관리형 인증서 서명](#provisioning-self-certificate-signing)
+ [AWS CLI 인증서 공급자에 대한 명령](#provisioning-cert-provider-cli)

## 플릿 프로비저닝에서 자체 관리형 인증서 서명의 작동 방식
<a name="provisioning-cert-provider-how-it-works"></a>

### 주요 개념
<a name="provisioning-cert-provider-concepts"></a>

다음 개념은 AWS IoT 플릿 프로비저닝에서 자체 관리형 인증서 서명이 작동하는 방식을 이해하는 데 도움이 되는 세부 정보를 제공합니다. 자세한 내용은 [플릿 프로비저닝을 사용하여 디바이스 인증서가 없는 디바이스 프로비저닝](https://docs.aws.amazon.com//iot/latest/developerguide/provision-wo-cert.html)을 참조하세요.

**AWS IoT 플릿 프로비저닝**  
 AWS IoT 플릿 프로비저닝(플릿 프로비저닝의 약자)을 사용하면는 디바이스 인증서를 AWS IoT Core 생성하고 디바이스가 처음에 연결할 때 디바이스 AWS IoT Core 에 안전하게 전송합니다. 플릿 프로비저닝을 사용하여 디바이스 인증서가 없는 디바이스를 AWS IoT Core에 연결할 수 있습니다.

**인증서 서명 요청(CSR)**  
플릿 프로비저닝 프로세스에서 디바이스는 [플릿 프로비저닝 MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html)를 통해 AWS IoT Core 에 요청합니다. 이 요청에는 클라이언트 인증서를 생성하기 위해 서명할 인증서 서명 요청(CSR)이 포함됩니다.

**AWS 플릿 프로비저닝에서 관리형 인증서 서명**  
AWS 관리형는 플릿 프로비저닝에서 인증서 서명을 위한 기본 설정입니다. AWS 관리형 인증서 서명을 통해 AWS IoT Core 는 자체 CACSRs에 서명합니다. CAs

**플릿 프로비저닝에서 서명하는 자체 관리형 인증서**  
자체 관리형은 플릿 프로비저닝에서 인증서 서명을 위한 또 다른 옵션입니다. 자체 관리형 인증서 서명을 사용하면 CSR에 서명할 AWS IoT Core 인증서 공급자를 생성합니다. 자체 관리형 인증서 서명을 사용하여 AWS 프라이빗 CA, 기타 공개적으로 신뢰할 수 있는 CA 또는 자체 퍼블릭 키 인프라(PKI)에서 생성된 CA를 사용하여 CSR에 서명할 수 있습니다.

**AWS IoT Core 인증서 공급자**  
AWS IoT Core 인증서 공급자(인증서 공급자의 약자)는 플릿 프로비저닝에서 자체 관리형 인증서 서명에 사용되는 고객 관리형 리소스입니다.

### 다이어그램
<a name="provisioning-cert-provider-diagram"></a>

다음 다이어그램은 AWS IoT 플릿 프로비저닝에서 자체 인증서 서명이 작동하는 방식을 간략히 보여줍니다.

![\[AWS IoT Core 플릿 프로비저닝을 위한 인증서 공급자\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/images/provisioning-cert-provider.png)

+ 새 IoT 디바이스가 제조되거나 플릿에 도입되면 자체 인증을 위해 클라이언트 인증서가 필요합니다 AWS IoT Core.
+ 플릿 프로비저닝 프로세스의 일환으로 디바이스는 플[릿 프로비저닝 MQTT APIs](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html)를 통해에 AWS IoT Core 클라이언트 인증서를 요청합니다. 이 요청에는 인증서 서명 요청(CSR)이 포함됩니다.
+ AWS IoT Core 는 인증서 공급자를 호출하고 CSR을 공급자에게 입력으로 전달합니다.
+ 인증서 공급자는 CSR을 입력으로 받아 클라이언트 인증서를 발급합니다.

   AWS 관리형 인증서 서명의 경우는 자체 CA를 사용하여 CSR에 AWS IoT Core 서명하고 클라이언트 인증서를 발급합니다.
+ 발급된 클라이언트 인증서를 사용하면 디바이스가 플릿 프로비저닝을 계속하고 AWS IoT Core와 보안 연결을 설정합니다.

## 인증서 공급자 Lambda 함수 입력
<a name="provisioning-cert-provider-lambda-input"></a>

AWS IoT Core 는 디바이스가 Lambda 함수에 등록할 때 다음 객체를 Lambda 함수로 전송합니다. `certificateSigningRequest`의 값은 `CreateCertificateFromCsr` 요청에 제공된 [프라이버시 강화 메일(PEM) 형식](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-format.html)의 CSR입니다. `principalId`는 `CreateCertificateFromCsr` 요청 AWS IoT Core 시에 연결하는 데 사용되는 보안 주체의 ID입니다. `clientId`는 MQTT 연결에 설정된 클라이언트 ID입니다.

```
{
	"certificateSigningRequest": "string",
	"principalId": "string",
	"clientId": "string"
}
```

## 인증서 공급자 Lambda 함수 반환 값
<a name="provisioning-cert-provider-lambda-return"></a>

Lambda 함수는 `certificatePem` 값이 포함된 응답을 반환해야 합니다. 다음은 성공적인 응답의 예입니다. AWS IoT Core 는 반환 값(`certificatePem`)을 사용하여 인증서를 생성합니다.

```
{
	"certificatePem": "string"
}
```

등록에 성공하면 `CreateCertificateFromCsr`는 `CreateCertificateFromCsr` 응답에 동일한 `certificatePem`을 반환합니다. 자세한 내용은 [CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 페이로드 예제를 참조하세요.

## Lambda 함수 예제
<a name="provisioning-cert-provider-lambda"></a>

인증서 공급자를 생성하기 전에 Lambda 함수를 생성하여 CSR에 서명해야 합니다. 다음은 Python의 Lambda 함수에 대한 예제입니다. 이 함수는 프라이빗 CA와 `SHA256WITHRSA` 서명 알고리즘을 사용하여 입력 CSR에 서명하도록 AWS Private CA 를 직접 호출합니다. 반환된 클라이언트 인증서는 1년 동안 유효합니다. AWS Private CA 및 프라이빗 CA 생성 방법에 대한 자세한 내용은 [AWS 프라이빗 CA란 무엇입니까?](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) 및 [프라이빗 CA 생성을 참조하세요](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html).

```
import os
import time
import uuid
import boto3

def lambda_handler(event, context):
    ca_arn = os.environ['CA_ARN']
    csr = (event['certificateSigningRequest']).encode('utf-8')

    acmpca = boto3.client('acm-pca')
    cert_arn = acmpca.issue_certificate(
        CertificateAuthorityArn=ca_arn, 
        Csr=csr,
        Validity={"Type": "DAYS", "Value": 365}, 
        SigningAlgorithm='SHA256WITHRSA',
        IdempotencyToken=str(uuid.uuid4())
    )['CertificateArn']
    
    # Wait for certificate to be issued
    time.sleep(1)    
    cert_pem = acmpca.get_certificate(
        CertificateAuthorityArn=ca_arn,
        CertificateArn=cert_arn
    )['Certificate']
    
    return {
        'certificatePem': cert_pem
    }
```

**중요**  
Lambda 함수에서 반환하는 인증서는 인증서 서명 요청(CSR)과 동일한 주제 이름과 퍼블릭 키를 가져야 합니다.
Lambda 함수는 5초 후에 실행을 완료해야 합니다.
Lambda 함수는 인증서 공급자 리소스와 동일한 AWS 계정 및 리전에 있어야 합니다.
 AWS IoT 서비스 보안 주체에게 Lambda 함수에 대한 호출 권한을 부여해야 합니다. [혼동된 대리자 문제](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html)를 방지하려면 호출 권한에 대해 `sourceArn` 및 `sourceAccount`를 설정하는 것이 좋습니다. 자세한 설명은 [교차 서비스 혼동된 대리자 예방](https://docs.aws.amazon.com//iot/latest/developerguide/cross-service-confused-deputy-prevention.html)을 참조하세요.

[Lambda](https://docs.aws.amazon.com//lambda/latest/dg/access-control-resource-based.html)에 대한 다음 리소스 기반 정책 예제는 AWS IoT 에 Lambda 함수를 간접 호출할 수 있는 권한을 부여합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Id": "InvokePermission",
	"Statement": [
		{
			"Sid": "LambdaAllowIotProvider",
			"Effect": "Allow",
			"Principal": {
				"Service": "iot.amazonaws.com"
			},
			"Action": "lambda:InvokeFunction",
			"Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
			"Condition": {
				"StringEquals": {
					"AWS:SourceAccount": "123456789012"
				},
				"ArnLike": {
				"AWS:SourceArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider/my-certificate-provider"
				}
			}
		}
	]
}
```

## 플릿 프로비저닝을 위한 자체 관리형 인증서 서명
<a name="provisioning-self-certificate-signing"></a>

 AWS CLI 또는 AWS Management Console을 사용하여 플릿 프로비저닝에 자체 관리형 인증서 서명을 선택할 수 있습니다.

### AWS CLI
<a name="provisioning-self-certificate-signing-cli"></a>

자체 관리형 인증서 서명을 선택하려면 인증서 공급자를 AWS IoT Core 생성하여 플릿 프로비저닝에서 CSRs에 서명해야 합니다. AWS IoT Core 는 인증서 공급자를 호출하여 CSR을 입력으로 받아 클라이언트 인증서를 반환합니다. 인증서 공급자를 생성하려면 `CreateCertificateProvider` API 작업 또는 `create-certificate-provider` CLI 명령을 사용합니다.

**참고**  
인증서 공급자를 생성하면 [플릿 프로비저닝을 위한 `CreateCertificateFromCsr` API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 동작이 변경되어 `CreateCertificateFromCsr`에 대한 모든 직접 호출이 인증서 공급자를 간접 호출하여 인증서를 생성합니다. 인증서 공급자가 생성된 후 이 동작이 변경되는 데 몇 분 정도 걸릴 수 있습니다.

```
aws iot create-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-1 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

다음은 이 명령의 예시 출력을 보여줍니다.

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

자세한 내용은 *AWS IoT* *API Reference*의 `[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)` 섹션을 참조하세요.

### AWS Management Console
<a name="provisioning-self-certificate-signing-console"></a>

를 사용하여 자체 관리형 인증서 서명을 선택하려면 다음 단계를 AWS Management Console따릅니다.

1. [AWS IoT 콘솔](https://console.aws.amazon.com//iot/home)로 이동합니다.

1. 왼쪽 탐색의 **보안** 아래에서 **인증서 서명**을 선택합니다.

1. **인증서 서명** 페이지의 **인증서 서명 세부 정보**에서 **인증서 서명 방법 편집**을 선택합니다.

1. **인증서 서명 방법 편집** 페이지의 **인증서 서명 방법**에서 **자체 관리형**을 선택합니다.

1. **자체 관리형 설정** 섹션에서 인증서 공급자의 이름을 입력한 다음 Lambda 함수를 생성하거나 선택합니다.

1. **인증서 서명 업데이트**를 선택합니다.

## AWS CLI 인증서 공급자에 대한 명령
<a name="provisioning-cert-provider-cli"></a>

### 인증서 공급자 생성
<a name="provisioning-create-cert-provider"></a>

인증서 공급자를 생성하려면 `CreateCertificateProvider` API 작업 또는 `create-certificate-provider` CLI 명령을 사용합니다.

**참고**  
인증서 공급자를 생성하면 [플릿 프로비저닝을 위한 `CreateCertificateFromCsr` API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 동작이 변경되어 `CreateCertificateFromCsr`에 대한 모든 직접 호출이 인증서 공급자를 간접 호출하여 인증서를 생성합니다. 인증서 공급자가 생성된 후 이 동작이 변경되는 데 몇 분 정도 걸릴 수 있습니다.

```
aws iot create-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-1 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

다음은 이 명령의 예시 출력을 보여줍니다.

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

자세한 내용은 *AWS IoT* *API Reference*의 `[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)` 섹션을 참조하세요.

### 인증서 공급자 업데이트
<a name="provisioning-update-cert-provider"></a>

인증서 공급자를 업데이트하려면 `UpdateCertificateProvider` API 작업 또는 `update-certificate-provider` CLI 명령을 사용합니다.

```
aws iot update-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-2 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

다음은 이 명령의 예시 출력을 보여줍니다.

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

자세한 내용을 알아보려면 *AWS IoT** API Reference*의 `[UpdateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateCertificateProvider.html)` 섹션을 참조하세요.

### 인증서 공급자 설명
<a name="provisioning-describe-cert-provider"></a>

인증서 공급자를 설명하려면 `DescribeCertificateProvider` API 작업 또는 `describe-certificate-provider` CLI 명령을 사용합니다.

```
aws iot describe-certificate-provider --certificateProviderName my-certificate-provider
```

다음은 이 명령의 예시 출력을 보여줍니다.

```
{
	"certificateProviderName": "my-certificate-provider",
	"lambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
	"accountDefaultForOperations": [
		"CreateCertificateFromCsr"
	],
	"creationDate": "2022-11-03T00:15",
	"lastModifiedDate": "2022-11-18T00:15"
}
```

자세한 내용은 *AWS IoT* *API Reference*의 `[DescribeCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DescribeCertificateProvider.html)` 섹션을 참조하세요.

### 인증서 공급자 삭제
<a name="provisioning-delete-cert-provider"></a>

인증서 공급자를 삭제하려면 `DeleteCertificateProvider` API 작업 또는 `delete-certificate-provider` CLI 명령을 사용합니다. 인증서 공급자 리소스를 삭제하면의 동작`CreateCertificateFromCsr`이 재개 AWS IoT 되고 CSR AWS IoT 에서가 서명한 인증서가 생성됩니다.

```
aws iot delete-certificate-provider --certificateProviderName my-certificate-provider
```

이 명령은 출력을 생성하지 않습니다.

자세한 내용은 *AWS IoT* *API Reference*의 `[DeleteCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DeleteCertificateProvider.html)` 섹션을 참조하세요.

### 인증서 공급자 나열
<a name="provisioning-list-cert-provider"></a>

내의 인증서 공급자를 나열하려면 `ListCertificateProviders` API 작업 또는 `list-certificate-providers` CLI 명령을 AWS 계정사용합니다.

```
aws iot list-certificate-providers
```

다음은 이 명령의 예시 출력을 보여줍니다.

```
{
	"certificateProviders": [
		{
			"certificateProviderName": "my-certificate-provider",
			"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
		}
	]
}
```

자세한 내용은 *AWS IoT* *API Reference*의 [https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html](https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html) 섹션을 참조하세요.

# 디바이스를 설치하는 사용자를 위한 IAM 정책 및 역할 생성
<a name="provision-create-role"></a>

**참고**  
이 절차는 AWS IoT 콘솔에서 지시한 경우에만 사용해야 합니다.  
콘솔에서 이 페이지로 이동하려면 [새 프로비저닝 템플릿 생성(create a new provisioning template)](https://console.aws.amazon.com//iot/home#/provisioningtemplate/create/provisioningmethods/trustedUser)을 엽니다.

## AWS IoT 콘솔에서이 작업을 수행할 수 없는 이유는 무엇입니까?
<a name="provision-create-role-why"></a>

가장 안전한 환경을 위해 IAM 작업은 IAM 콘솔에서 수행됩니다. 이 섹션의 절차는 프로비저닝 템플릿 사용에 필요한 IAM 역할과 정책을 생성하는 단계를 안내합니다.

## 디바이스를 설치할 사용자에 대한 IAM 정책 생성
<a name="provision-create-role-policy"></a>

이 절차에서는 사용자가 프로비저닝 템플릿을 사용하여 디바이스를 설치할 수 있도록 권한을 부여하는 IAM 정책을 생성하는 방법을 설명합니다.

이 절차를 수행하는 동안 IAM 콘솔과 AWS IoT 콘솔 간에 전환하게 됩니다. 이 절차를 수행하는 동안 두 콘솔을 동시에 여는 것이 좋습니다.

**디바이스를 설치할 사용자에 대한 IAM 정책을 생성하려면**

1. [IAM 콘솔의 정책 허브](https://console.aws.amazon.com//iamv2/home#/policies)를 엽니다.

1. **정책 생성**을 선택하세요.

1. **정책 생성** 페이지에서 **JSON** 탭을 선택합니다.

1.  AWS IoT 콘솔에서 **사용자 정책 및 역할 구성을** 선택한 페이지로 전환합니다.

1. **샘플 프로비저닝 정책(Sample provisioning policy)**에서 **복사(Copy)**를 선택합니다.

1. IAM 콘솔로 다시 전환합니다.

1. **JSON** 편집기에서 AWS IoT 콘솔에서 복사한 정책을 붙여 넣습니다. 이 정책은 AWS IoT 콘솔에서 생성하는 템플릿에만 적용됩니다.

1. 계속하려면 **다음: 태그**를 선택합니다.

1. **태그 추가(선택 사항)(Add tags(Optional))** 페이지에서 이 정책에 추가하려는 각 태그에 대해 **태그 추가(Add tag)**를 선택합니다. 추가할 태그가 없는 경우 이 단계를 건너뛸 수 있습니다.

1. 계속하려면 **다음: 검토**를 선택합니다.

1. **정책 검토** 페이지에서 다음을 수행합니다.

   1. **이름(Name)\$1**에 정책 용도를 기억하는 데 도움이 되는 정책 이름을 입력합니다.

      다음 절차에서 사용할 것이므로 이 정책에 지정한 이름을 기록해 둡니다.

   1. 생성 중인 정책에 대한 선택적인 설명을 입력할 수 있습니다.

   1. 이 정책의 나머지 부분과 태그를 검토합니다.

1. **정책 생성(Create policy)**을 선택하여 새 정책의 생성을 마칩니다.

새 정책을 생성한 후 [디바이스를 설치할 사용자에 대한 IAM 역할 생성](#provision-create-role-role)로 계속 진행하여 이 정책을 연결할 사용자의 역할 항목을 만듭니다.

## 디바이스를 설치할 사용자에 대한 IAM 역할 생성
<a name="provision-create-role-role"></a>

이 단계에서는 프로비저닝 템플릿을 사용하여 디바이스를 설치할 사용자를 인증하는 IAM 역할을 생성하는 방법을 설명합니다.

**디바이스를 설치할 사용자에 대한 IAM 정책을 생성하려면**

1. [IAM 콘솔에서 역할 허브](https://console.aws.amazon.com//iamv2/home#/roles)를 엽니다.

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

1. **신뢰할 수 있는 엔터티 선택(Select trusted entity)**에서 생성 중인 템플릿에 대한 액세스 권한을 부여할 신뢰할 수 있는 엔터티 유형을 선택합니다.

1. 액세스 권한을 부여하려는 신뢰할 수 있는 엔터티 ID를 선택하거나 입력한 후 **다음(Next)**을 선택합니다.

1. **권한 추가(Add permissions)** 페이지에서 **권한 정책(Permission policies)**의 검색 상자에 [이전 절차](#provision-create-role-policy)에서 만든 정책의 이름을 입력합니다.

1. 정책 목록에서, 이전 절차에서 생성한 정책을 선택한 후 **다음(Next)**을 선택합니다.

1. **이름, 검토 및 생성(Name, review, and create)** 섹션에서 다음을 수행합니다.

   1. **역할 이름(Role name)**에 이 역할의 목적을 기억하는 데 도움이 되는 역할 이름을 입력합니다.

   1. **설명(Description)**에 역할의 선택적인 설명을 입력할 수 있습니다. 이 항목을 입력하지 않아도 계속 진행할 수 있습니다.

   1. **1단계**와 **2단계**의 값을 검토합니다.

   1. **태그 추가(선택 사항)(Add tags (Optional))**에서 이 역할에 태그를 추가할 수 있습니다. 이 항목을 입력하지 않아도 계속 진행할 수 있습니다.

   1. 이 페이지의 정보가 완전하고 정확한지 확인한 다음 **역할 생성(Create role)**을 선택합니다.

새 역할을 생성한 후 AWS IoT 콘솔로 돌아가서 템플릿을 계속 생성합니다.

## 기존 정책을 업데이트하여 새 템플릿 승인
<a name="provision-create-role-update"></a>

다음 단계에서는 프로비저닝 템플릿을 사용하여 디바이스를 설치할 수 있도록 사용자에게 권한을 부여하는 IAM 정책에 새 템플릿을 추가하는 방법을 설명합니다.

**기존 IAM 정책에 새 템플릿을 추가하려면**

1. [IAM 콘솔의 정책 허브](https://console.aws.amazon.com//iamv2/home#/policies)를 엽니다.

1. 검색 상자에 업데이트할 정책의 이름을 입력합니다.

1. 검색 상자 아래 목록에서 업데이트하려는 정책을 찾아 정책 이름을 선택합니다.

1. **정책 요약(Policy summary)**에서 **JSON** 탭(이 패널이 아직 표시되지 않은 경우)을 선택합니다.

1. 정책 문서를 수정하려면 **정책 편집(Edit policy)**을 선택합니다.

1. 편집기에서 **JSON** 탭(이 패널이 아직 표시되지 않은 경우)을 선택합니다.

1. 정책 문서에서 `iot:CreateProvisioningClaim` 작업이 포함된 정책 문을 찾습니다.

   정책 문서에 `iot:CreateProvisioningClaim` 작업이 포함된 정책 문이 없는 경우 다음 명령문 코드 조각을 복사하여 정책 문서의 `Statement` 배열에 추가 항목으로 붙여 넣습니다.
**참고**  
이 코드 조각은 `Statement` 배열에서 닫는 `]` 문자 앞에 위치해야 합니다. 구문 오류를 해결하기 위해 이 코드 조각 앞이나 뒤에 쉼표를 추가해야 할 수 있습니다.

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "--PUT YOUR NEW TEMPLATE ARN HERE--"
       ]
   }
   ```

1.  AWS IoT 콘솔에서 **사용자 역할 권한 수정**을 선택한 페이지로 전환합니다.

1. 템플릿의 **리소스 ARN(Resource ARN)**을 찾고 **복사(Copy)**를 선택합니다.

1. IAM 콘솔로 다시 전환합니다.

1. 복사한 Amazon 리소스 이름(ARN)을 `Statement` 배열의 템플릿 ARN 목록 맨 위에 붙여 넣어 첫 번째 항목으로 만듭니다.

   이 ARN이 배열에서 유일한 ARN인 경우 방금 붙여넣은 값 끝에 있는 쉼표를 제거합니다.

1. 업데이트된 정책 문을 검토하고 편집기에서 나타낸 오류를 해결합니다.

1. 업데이트된 정책 문서를 저장하려면 **정책 검토(Review policy)**를 선택합니다.

1. 정책을 검토하고 **변경 사항 저장(Save changes)**을 선택합니다.

1.  AWS IoT 콘솔로 돌아갑니다.

# 디바이스 프로비저닝 MQTT API
<a name="fleet-provision-api"></a><a name="provision-mqtt-api"></a>

플릿 프로비저닝 서비스는 다음과 같은 MQTT API 작업을 지원합니다.
+ `CreateCertificateFromCsr`
+ `CreateKeysAndCertificate`
+ `RegisterThing`

이 API는 주제의 *payload-format*에 따라 Concise Binary Object Representation(CBOR) 형식 및 JavaScript Object Notation(JSON) 형식의 응답 버퍼를 지원합니다. 명확성을 위해 이 섹션의 응답 및 요청 예제는 JSON 형식으로 표시됩니다.


| *payload-format* | 응답 형식 데이터 유형 | 
| --- | --- | 
| cbor | Concise Binary Object Representation(CBOR) | 
| json | JavaScript Object Notation(JSON) | 

**중요**  
요청 메시지 주제를 게시하기 전에 응답 주제를 구독하여 응답을 수신합니다. 이 API에서 사용되는 메시지는 MQTT의 게시/구독 프로토콜을 사용하여 요청 및 응답 상호 작용을 제공합니다.  
요청을 게시하기 *전에* 응답 주제를 구독하지 않으면 해당 요청의 결과가 수신되지 않을 수 있습니다.  
IoT Core 플릿 프로비저닝은 API 요청을 게시하는 데 사용된 것과 동일한 MQTT 연결을 통해 디바이스 프로비저닝 MQTT API 결과를 반환합니다.

## CreateCertificateFromCsr
<a name="create-cert-csr"></a>

인증서 서명 요청(CSR)에서 인증서를 생성합니다.는 Amazon Root 인증 기관(CA)에서 서명한 클라이언트 인증서를 AWS IoT 제공합니다. 새 인증서의 상태는 `PENDING_ACTIVATION`입니다. 이 인증서로 사물을 프로비저닝하도록 `RegisterThing`를 호출하면 템플릿에 설명된 대로 인증서 상태가 `ACTIVE` 또는 `INACTIVE`로 변경됩니다.

인증 기관 인증서 및 인증서 서명 요청을 사용하여 클라이언트 인증서를 생성하는 방법에 대한 자세한 내용은 [CA 인증서를 사용하여 클라이언트 인증서 생성](create-device-cert.md) 섹션을 참조하세요.

**참고**  
보안을 위해 `CreateCertificateFromCsr`에 의해 반환된 `certificateOwnershipToken`은 1시간 후에 만료됩니다. `RegisterThing`은 `certificateOwnershipToken`이 만료되기 전에 호출되어야 합니다. `CreateCertificateFromCsr`에서 생성된 인증서가 활성화되지 않았으며 토큰이 만료될 때까지 정책 또는 사물에 연결되지 않은 경우 인증서가 삭제됩니다. 토큰이 만료되면 디바이스는 `CreateCertificateFromCsr`을 호출하여 새 인증서를 생성할 수 있습니다.

### CreateCertificateFromCsr 요청
<a name="create-cert-csr-request"></a>

`$aws/certificates/create-from-csr/payload-format` 주제와 함께 메시지를 게시합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

#### CreateCertificateFromCsr 요청 페이로드
<a name="create-cert-csr-request-payload"></a>

```
{
    "certificateSigningRequest": "string"
}
```

`certificateSigningRequest`  
PEM 형식의 CSR입니다.

### CreateCertificateFromCsr 응답
<a name="create-cert-csr-response"></a>

`$aws/certificates/create-from-csr/payload-format/accepted`을 구독합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

#### CreateCertificateFromCsr 응답 페이로드
<a name="create-cert-csr-response-payload"></a>

```
{
    "certificateOwnershipToken": "string",
    "certificateId": "string",
    "certificatePem": "string"
}
```

`certificateOwnershipToken`  
프로비저닝하는 동안 인증서의 소유권을 증명하는 토큰입니다.

`certificateId`  
인증서 ID입니다. 인증서 관리 작업에서는 certificateId만 필요합니다.

`certificatePem`  
PEM 형식의 인증서 데이터입니다.

### CreateCertificateFromCsr 오류
<a name="create-cert-csr-error"></a>

오류 응답을 수신하려면 `$aws/certificates/create-from-csr/payload-format/rejected`를 구독합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

#### CreateCertificateFromCsr 오류 페이로드
<a name="create-cert-csr-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
상태 코드

`errorCode`  
오류 코드입니다.

`errorMessage`  
오류 메시지입니다.

## CreateKeysAndCertificate
<a name="create-keys-cert"></a>

새 키와 certificate를 생성합니다.는 Amazon Root 인증 기관(CA)에서 서명한 클라이언트 인증서를 AWS IoT 제공합니다. 새 인증서의 상태는 `PENDING_ACTIVATION`입니다. 이 인증서로 사물을 프로비저닝하도록 `RegisterThing`를 호출하면 템플릿에 설명된 대로 인증서 상태가 `ACTIVE` 또는 `INACTIVE`로 변경됩니다.

**참고**  
보안을 위해 `CreateKeysAndCertificate`에 의해 반환된 `certificateOwnershipToken`은 1시간 후에 만료됩니다. `RegisterThing`은 `certificateOwnershipToken`이 만료되기 전에 호출되어야 합니다. `CreateKeysAndCertificate`에서 생성된 인증서가 활성화되지 않았으며 토큰이 만료될 때까지 정책 또는 사물에 연결되지 않은 경우 인증서가 삭제됩니다. 토큰이 만료되면 디바이스는 `CreateKeysAndCertificate`을 호출하여 새 인증서를 생성할 수 있습니다.

### CreateKeysAndCertificate 요청
<a name="create-keys-cert-request"></a>

빈 메시지 페이로드와 함께 `$aws/certificates/create/payload-format`에 메시지를 게시합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

### CreateKeysAndCertificate 응답
<a name="create-keys-cert-response"></a>

`$aws/certificates/create/payload-format/accepted`을 구독합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

#### CreateKeysAndCertificate 응답
<a name="create-keys-cert-response-payload"></a>

```
{
    "certificateId": "string",
    "certificatePem": "string",
    "privateKey": "string",
    "certificateOwnershipToken": "string"
}
```

`certificateId`  
인증서 ID입니다.

`certificatePem`  
PEM 형식의 인증서 데이터입니다.

`privateKey`  
프라이빗 키입니다.

`certificateOwnershipToken`  
프로비저닝하는 동안 인증서의 소유권을 증명하는 토큰입니다.

### CreateKeysAndCertificate 오류
<a name="create-keys-cert-error"></a>

오류 응답을 수신하려면 `$aws/certificates/create/payload-format/rejected`를 구독합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

#### CreateKeysAndCertificate 오류 페이로드
<a name="create-keys-cert-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
상태 코드

`errorCode`  
오류 코드입니다.

`errorMessage`  
오류 메시지입니다.

## RegisterThing
<a name="register-thing"></a>

미리 정의된 템플릿을 사용하여 사물을 프로비저닝합니다.

### RegisterThing 요청
<a name="register-thing-request"></a>

`$aws/provisioning-templates/templateName/provision/payload-format`에 메시지를 게시합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

`templateName`  
프로비저닝 템플릿 이름입니다.

#### RegisterThing request 페이로드
<a name="register-thing-request-payload"></a>

```
{
    "certificateOwnershipToken": "string",
    "parameters": {
        "string": "string",
        ...
    }
}
```

`certificateOwnershipToken`  
인증서 소유권을 증명하는 토큰입니다. AWS IoT 는 MQTT를 통해 인증서를 생성할 때 토큰을 생성합니다.

`parameters`  
선택 사항. 등록 요청을 평가하기 위해 [사전 프로비저닝 후크](pre-provisioning-hook.md)에서 사용되는 디바이스의 키-값 페어입니다.

### RegisterThing 응답
<a name="register-thing-response"></a>

`$aws/provisioning-templates/templateName/provision/payload-format/accepted`을 구독합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

`templateName`  
프로비저닝 템플릿 이름입니다.

#### RegisterThing 응답 페이로드
<a name="register-thing-response-payload"></a>

```
{
    "deviceConfiguration": {
        "string": "string",
        ...
    },
    "thingName": "string"
}
```

`deviceConfiguration`  
템플릿에 정의된 디바이스 구성입니다.

`thingName`  
프로비저닝 중에 생성된 IoT 사물의 이름입니다.

### RegisterThing 오류 응답
<a name="register-thing-error"></a>

오류 응답을 수신하려면 `$aws/provisioning-templates/templateName/provision/payload-format/rejected`를 구독합니다.

`payload-format`  
`cbor` 또는 `json`와 같은 메시지 페이로드 형식입니다.

`templateName`  
프로비저닝 템플릿 이름입니다.

#### RegisterThing 오류 응답 페이로드
<a name="register-thing-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
상태 코드

`errorCode`  
오류 코드입니다.

`errorMessage`  
오류 메시지입니다.