

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

# 프로비저닝 템플릿
<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)를 추가할 수 있습니다.