

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

# AWS IoT 디바이스 섀도우 서비스
<a name="iot-device-shadows"></a>

 AWS IoT 디바이스 섀도우 서비스는 AWS IoT 사물 객체에 섀도우를 추가합니다. 섀도우를 사용하면 디바이스가 연결되어 AWS IoT 있는지 여부에 관계없이 앱 및 기타 서비스에서 디바이스의 상태를 사용할 수 있습니다. AWS IoT 사물 객체에는 여러 개의 명명된 섀도우가 있을 수 있으므로 IoT 솔루션에서 디바이스를 다른 앱 및 서비스에 연결할 수 있는 더 많은 옵션이 제공됩니다.

AWS IoT 사물 객체는 명시적으로 생성될 때까지 섀도우가 없습니다. AWS IoT 콘솔을 사용하여 섀도우를 생성, 업데이트 및 삭제할 수 있습니다. 디바이스, 기타 웹 클라이언트 및 서비스는 MQTT 및 [예약된 MQTT 주제](reserved-topics.md#reserved-topics-shadow), [디바이스 섀도우 REST API](device-shadow-rest-api.md)를 사용한 HTTP 및 [AWS IoT의AWS CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot-data/index.html)를 사용하여 섀도우를 생성, 업데이트 및 삭제할 수 있습니다. 섀도우는에 의해 클라우드 AWS 에 저장되므로 디바이스 연결 여부에 관계없이 앱 및 기타 클라우드 서비스에서 디바이스 상태 데이터를 수집하고 보고할 수 있습니다.

## 섀도우 사용
<a name="device-shadow-using"></a>

섀도우는 디바이스, 앱 및 기타 클라우드 서비스가 데이터를 공유할 수 있는 신뢰할 수 있는 데이터 스토어를 제공합니다. 이를 통해 디바이스, 앱 및 기타 클라우드 서비스가 디바이스 상태를 유지하면서 연결하거나 연결을 끊을 수 있습니다.

디바이스, 앱 및 기타 클라우드 서비스가 연결되어 AWS IoT있는 동안 섀도우를 통해 디바이스의 현재 상태에 액세스하고 제어할 수 있습니다. 예를 들어 앱은 섀도우를 업데이트하여 디바이스 상태 변경을 요청할 수 있습니다.는 디바이스 변경을 나타내는 메시지를 AWS IoT 게시합니다. 디바이스는 이 메시지를 수신하고, 메시지와 일치하도록 상태를 업데이트하고, 업데이트된 상태로 메시지를 게시합니다. 디바이스 섀도우 서비스는 해당 섀도우에 이 업데이트된 상태를 반영합니다. 앱은 섀도우의 업데이트를 구독하거나 섀도우에 현재 상태를 쿼리할 수 있습니다.

디바이스가 오프라인 상태가 되더라도 앱은 여전히 AWS IoT 및 디바이스의 섀도우와 통신할 수 있습니다. 디바이스가 다시 연결되면 섀도우의 현재 상태를 수신하여 섀도우와 일치하도록 상태를 업데이트한 다음 업데이트된 상태로 메시지를 게시할 수 있습니다. 마찬가지로 앱이 오프라인으로 전환되고 오프라인 상태인 동안 디바이스 상태가 변경된 경우, 디바이스는 섀도우를 업데이트하여 앱이 다시 연결될 때 섀도우에 현재 상태를 쿼리하도록 할 수 있습니다.

디바이스가 자주 오프라인 상태이고 디바이스가 다시 연결된 후 델타 메시지를 수신하도록 디바이스를 구성하려는 경우 영구 세션 기능을 사용할 수 있습니다. 영구 세션 만료 기간에 대한 자세한 내용은 [영구 세션 만료 기간](https://docs.aws.amazon.com//general/latest/gr/iot-core.html#message-broker-limits)을 참조하세요.

### 명명된 섀도우 또는 명명되지 않은 섀도우 사용 선택
<a name="iot-device-shadow-named"></a>

디바이스 섀도우 서비스는 명명된 섀도우 및 명명되지 않은 섀도우, 즉 클래식 섀도우를 지원합니다. 사물 객체의 경우 명명된 섀도우는 여러 개 가질 수 있으며 명명되지 않은 섀도우는 하나만 가질 수 있습니다. 사물 객체는 명명된 예약 섀도우를 가질 수 있습니다. 이 섀도우는 이름을 업데이트할 수 없다는 점을 제외하면 명명된 섀도우와 비슷하게 작동합니다. 자세한 내용은 [명명된 예약 섀도우](https://docs.aws.amazon.com/iot/latest/developerguide/preparing-to-use-software-package-catalog.html#reserved-named-shadow)를 참조하세요.

사물 객체는 명명된 섀도우와 명명되지 않은 섀도우를 동시에 가질 수 있습니다. 그러나 각각에 액세스하는 데 사용되는 API는 약간 다르므로 솔루션에 가장 적합한 섀도우 유형을 결정하고 해당 유형만 사용하는 것이 더 효율적일 수 있습니다. 섀도우에 액세스하기 위한 API에 대한 자세한 내용은 [섀도우 주제](reserved-topics.md#reserved-topics-shadow) 단원을 참조하세요.

명명된 섀도우를 사용하여 사물 객체의 상태에 대한 다양한 보기를 생성할 수 있습니다. 예를 들어, 많은 속성을 가진 사물 객체를 각각 섀도우 이름으로 식별된 논리적 속성 그룹이 있는 섀도우로 분리할 수 있습니다. 속성을 섀도우별로 그룹화하고 정책을 사용하여 액세스를 제어함으로써 속성에 대한 액세스를 제한할 수도 있습니다. 디바이스 섀도우에 사용하는 정책에 대한 자세한 내용은 [AWS IoT에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awsiot.html)와 [AWS IoT Core 정책](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)을 참조하세요.

명명되지 않은 클래식 섀도우는 명명된 섀도우보다 더 간단하지만 다소 제한적입니다. 각 AWS IoT 사물 객체에는 이름이 지정되지 않은 섀도우가 하나만 있을 수 있습니다. IoT 솔루션의 섀도우 데이터 사용이 제한적일 것으로 예상되는 경우 이 방법을 사용하여 섀도우 사용을 시작할 수 있습니다. 그러나 나중에 섀도우를 추가하려는 경우 처음부터 명명된 섀도우를 사용하는 것이 좋습니다.

플릿 인덱싱은 명명되지 않은 섀도우와 명명된 섀도우를 다르게 지원합니다. 자세한 정보는 [플릿 인덱싱 관리](managing-fleet-index.md)를 참조하세요.

### 섀도우 액세스
<a name="device-shadow-using-access"></a>

모든 섀도우는 예약된 [MQTT 주제](reserved-topics.md#reserved-topics-shadow) 및 섀도우에서 `get`, `update` 및 `delete` 작업을 지원하는 [HTTP URL](device-shadow-rest-api.md)을 보유합니다.

섀도우는 [JSON 섀도우 문서](device-shadow-document.md)를 사용하여 데이터를 저장하고 검색합니다. 섀도우 문서에는 디바이스 상태의 다음 측면을 설명하는 상태 속성이 포함되어 있습니다.
+ `desired`

  앱은 `desired` 객체를 업데이트하여 디바이스 속성에 대해 원하는 상태를 지정합니다.
+ `reported`

  디바이스는 `reported` 객체에 현재 상태를 보고합니다.
+ `delta`

  AWS IoT 는 `delta` 객체에서 원하는 상태와 보고된 상태 간의 차이를 보고합니다.

섀도우에 저장된 데이터는 업데이트 작업 메시지 본문의 상태 속성에 의해 결정됩니다. 후속 업데이트 작업은 기존 데이터 객체의 값을 수정하고 섀도우의 상태 객체에서 키 및 기타 요소를 추가 및 삭제할 수 있습니다. 섀도우 액세스에 대한 자세한 내용은 [디바이스에서 섀도우 사용](device-shadow-comms-device.md) 및 [앱 및 서비스에서 섀도우 사용](device-shadow-comms-app.md) 단원을 참조하세요.

**중요**  
업데이트 요청 권한은 신뢰할 수 있는 앱 및 디바이스로 제한되어야 합니다. 이렇게 하면 섀도우의 상태 속성이 예기치 않게 변경되는 것을 방지할 수 있습니다. 그렇지 않으면 섀도우를 사용하는 디바이스 및 앱이 상태 속성의 키가 변경될 수 있도록 설계되어야 합니다.

### 디바이스, 앱 및 기타 클라우드 서비스에서 섀도우 사용
<a name="device-shadow-implementing"></a>

디바이스, 앱 및 기타 클라우드 서비스에서 섀도우를 사용하려면 이러한 모든 작업 간에 일관성과 조정이 필요합니다. AWS IoT 디바이스 섀도우 서비스는 섀도우 상태를 저장하고, 섀도우 상태가 변경될 때 메시지를 보내고, 상태를 변경하는 메시지에 응답합니다. IoT 솔루션의 디바이스, 앱 및 기타 클라우드 서비스는 해당 상태를 관리하고 디바이스 섀도우의 상태와 일관성을 유지해야 합니다.

섀도우 상태 데이터는 동적이며 섀도우 액세스 권한이 있는 디바이스, 앱 및 기타 클라우드 서비스에 의해 변경될 수 있습니다. 이러한 이유로 각 디바이스, 앱 및 기타 클라우드 서비스가 섀도우와 상호 작용하는 방식을 고려하는 것이 중요합니다. 다음 예를 참조하세요.
+ 섀도우와 상태 데이터를 통신할 때 *디바이스*는 섀도우 상태의 `reported` 속성에만 기록해야 합니다.
+ *앱 및 기타 클라우드 서비스*는 섀도우를 통해 디바이스에 상태 변경 요청을 전달할 때 `desired` 속성에만 기록해야 합니다.

**중요**  
섀도우 데이터 객체에 포함된 데이터는 다른 섀도우 및 사물의 속성 및 사물 객체의 디바이스가 게시할 수 있는 MQTT 메시지의 콘텐츠와 같은 기타 사물 객체 속성과는 독립적입니다. 그러나 필요한 경우 디바이스는 서로 다른 MQTT 주제 및 섀도우에서 동일한 데이터를 보고할 수 있습니다.  
여러 섀도우를 지원하는 디바이스는 서로 다른 섀도우에서 보고하는 데이터의 일관성을 유지해야 합니다.

### 메시지 순서
<a name="message-ordering"></a>

 AWS IoT 서비스의 메시지가 특정 순서로 디바이스에 도착한다는 보장은 없습니다. 다음 시나리오는 이 경우에 어떤 일이 발생하는지 보여줍니다.

초기 상태 문서:

```
{
  "state": {
    "reported": {
      "color": "blue"
    }
  },
  "version": 9,
  "timestamp": 123456776
}
```

업데이트 1:

```
{
  "state": {
    "desired": {
      "color": "RED"
    }
  },
  "version": 10,
  "timestamp": 123456777
}
```

업데이트 2:

```
{
  "state": {
    "desired": {
      "color": "GREEN"
    }
  },
  "version": 11,
  "timestamp": 123456778
}
```

최종 상태 문서:

```
{
  "state": {
    "reported": {
      "color": "GREEN"
    }
  },
  "version": 12,
  "timestamp": 123456779
}
```

이로 인해 델타 메시지 2개가 생성됩니다.

```
{
  "state": {
    "color": "RED"
  },
  "version": 11,
  "timestamp": 123456778
}
```

```
{
  "state": {
    "color": "GREEN"
  },
  "version": 12,
  "timestamp": 123456779
}
```

디바이스가 이들 메시지를 틀린 순서로 수신할 수도 있습니다. 이들 메시지에서의 상태는 누적적이므로 디바이스는 현재 추적 중인 것보다 빠른 버전 번호는 무시할 수 있습니다. 디바이스가 버전 11보다 먼저 버전 12의 델타를 수신할 경우 버전 11 메시지는 무시할 수 있습니다.

### 섀도우 메시지 트리밍
<a name="device-shadow-trim-messages"></a>

디바이스로 전송되는 섀도우 메시지의 크기를 줄이려면 디바이스에 필요한 필드만 선택하고 디바이스가 수신 대기하는 MQTT 주제에 메시지를 다시 게시하는 규칙을 정의합니다.

이 규칙은 JSON 형식으로 지정되며 다음과 같아야 합니다.

```
{
  "sql": "SELECT state, version FROM '$aws/things/+/shadow/update/delta'",
  "ruleDisabled": false,
  "actions": [
    {
      "republish": {
        "topic": "${topic(3)}/delta",
        "roleArn": "arn:aws:iam:123456789012:role/my-iot-role"
      }
    }
  ]
}
```

SELECT 문은 메시지 가운데 지정된 주제로 재게시할 필드를 결정합니다. "\$1" 와일드 카드는 모든 섀도우 이름과 일치시키는 데 사용됩니다. 이 규칙은 모든 일치하는 메시지를 지정된 주제로 재게시하도록 지정합니다. 메시지를 재게시할 주제를 지정하는 데는 `"topic()"` 함수가 사용됩니다. `topic(3)`은 원래 주제의 사물 이름으로 평가됩니다. 규칙 생성에 대한 자세한 내용은 [에 대한 규칙 AWS IoT](iot-rules.md) 단원을 참조하세요.