

# Sidewalk 엔드 디바이스의 대상 추가
<a name="iot-sidewalk-qsg-destination"></a>

AWS IoT 규칙을 사용하여 데이터 및 디바이스 메시지를 처리하고 이를 다른 서비스로 라우팅하세요. 다른 서비스에서 메시지를 쉽게 사용할 수 있도록 디바이스에서 받은 바이너리 메시지를 처리하여 메시지를 다른 형식으로 변환하는 규칙도 정의할 수 있습니다. 대상은 Sidewalk 엔드 디바이스를 디바이스의 데이터를 처리하여 다른 AWS 서비스로 보내는 규칙과 연결합니다.

## 대상을 만들고 사용하는 방법
<a name="iot-sidewalk-destination-how"></a>

1. 대상에 대한 AWS IoT 규칙과 IAM 역할을 생성합니다. AWS IoT 규칙은 디바이스의 데이터를 처리하고 다른 AWS 서비스 및 애플리케이션에서 사용할 수 있도록 라우팅하는 규칙을 지정합니다. IAM 역할은 이 규칙에 액세스하는 권한을 부여합니다.

1. `CreateDestination` API 작업을 사용하여 Sidewalk 디바이스의 대상을 생성합니다. 대상 이름, 규칙 이름, 역할 이름 및 기타 선택적 파라미터를 지정합니다. API는 대상의 고유 식별자를 반환하며, 이 식별자는 엔드 디바이스를 Amazon Sidewalk용 AWS IoT Core에 추가할 때 지정할 수 있습니다.

다음은 대상, 대상에 대한 AWS IoT 규칙 및 IAM 역할을 생성하는 방법을 보여줍니다.

**Topics**
+ [대상을 만들고 사용하는 방법](#iot-sidewalk-destination-how)
+ [Sidewalk 디바이스의 대상 생성](iot-sidewalk-destination-create.md)
+ [대상에 대한 IAM 역할 및 IoT 규칙 생성](sidewalk-destination-rule-role.md)

# Sidewalk 디바이스의 대상 생성
<a name="iot-sidewalk-destination-create"></a>

[대상 허브](https://console.aws.amazon.com/iot/home#/wireless/destinations)를 사용하거나 `CreateDestination`을 사용하여 Amazon Sidewalk용 AWS IoT Core 계정에 대상을 추가할 수 있습니다. 대상을 만들 때 다음을 지정하세요.
+ Sidewalk 엔드 디바이스에 사용할 대상의 고유한 이름.
**참고**  
대상 이름을 사용하여 디바이스를 이미 추가한 경우 대상을 만들 때 해당 이름을 사용해야 합니다. 자세한 내용은 [2단계: Sidewalk 디바이스 추가](iot-sidewalk-add-device.md#iot-sidewalk-device-create) 단원을 참조하십시오.
+ 디바이스 데이터를 처리하는 AWS IoT 규칙의 이름 및 메시지가 게시되는 주제.
+ 규칙에 액세스하도록 디바이스의 데이터에 권한을 부여하는 IAM 역할.

다음 섹션에서는 대상에 대한 AWS IoT 규칙 및 IAM 역할을 생성하는 방법을 설명줍니다.

## 대상 생성 (콘솔)
<a name="iot-sidewalk-destination-create-console"></a>

AWS IoT 콘솔을 사용하여 대상을 만들려면 [대상 허브](https://console.aws.amazon.com/iot/home#/wireless/destinations)로 이동하여 **대상 추가**를 선택합니다.

![\[alt text not found\]](http://docs.aws.amazon.com/ko_kr/iot-wireless/latest/developerguide/images/iot-sidewalk-add-destination.PNG)


디바이스의 데이터를 처리하려면, 대상을 생성할 때 다음 필드를 지정하고 **대상 추가**를 선택합니다.
+ 

**대상 세부 사항**  
**대상 이름**을 입력하고 대상의 설명(선택 사항)을 입력합니다.
+ 

**규칙 이름**  
디바이스에서 보낸 메시지를 평가하고 디바이스의 데이터를 처리하도록 구성된 AWS IoT 규칙입니다. 규칙 이름이 대상에 매핑됩니다. 대상은 수신하는 메시지를 처리하기 위한 규칙이 필요합니다. AWS IoT 규칙을 호출하거나 AWS IoT 메시지 브로커에 게시하여 메시지를 처리하도록 선택할 수 있습니다.
  + **규칙 이름 입력(Enter a rule name)**을 선택하는 경우 이름을 입력한 다음 **복사(Copy)**를 선택하여 규칙 이름(AWS IoT 규칙을 생성할 때 입력)을 복사합니다. **규칙 생성**을 선택하여 지금 규칙을 생성하거나, AWS IoT 콘솔의 [규칙](https://console.aws.amazon.com/iot/home#/create/rule) 허브로 이동하여 해당 이름으로 규칙을 생성할 수 있습니다.

    규칙을 입력하고 **고급(Advanced)** 설정을 사용하여 주제 이름을 지정할 수도 있습니다. 주제 이름은 규칙 호출 중에 제공되며 규칙 내에서 `topic` 표현식을 사용하여 액세스됩니다. AWS IoT 규칙에 대한 자세한 내용은 [AWS IoT 규칙](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html)을 참조하세요.
  + **AWS IoT 메시지 브로커에 게시**를 선택하는 경우 주제 이름을 입력합니다. 그런 다음 MQTT 주제 이름을 복사하면 여러 구독자가 이 주제를 구독하여 해당 주제에 게시된 메시지를 받을 수 있습니다. 자세한 내용은 [MQTT 주제](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html)를 참조하세요.

  대상에 대한 AWS IoT 규칙을 자세히 알아보려면 [LoRaWAN 디바이스 메시지를 처리하는 규칙 생성](https://docs.aws.amazon.com/iot/latest/developerguide/connect-iot-lorawan-destination-rules.html)을 참조하세요.
+ 

**역할 이름**  
**규칙 이름(Rule name)**에서 명명된 규칙에 액세스할 수 있는 디바이스의 데이터 권한을 부여하는 IAM 역할입니다. 콘솔에서 새 서비스 역할을 생성하거나 기존 서비스 역할을 선택합니다. 새 서비스 역할을 생성하는 경우 역할 이름(예: **SidewalkDestinationRole**)을 입력하거나 AWS IoT Core for LoRaWAN이 새 역할 이름을 생성할 수 있도록 비워 둘 수 있습니다. 그러면 AWS IoT Core for LoRaWAN이 사용자를 대신하여 적절한 권한이 있는 IAM 역할을 자동으로 생성합니다.

## 대상 생성 (CLI)
<a name="iot-sidewalk-destination-create-cli"></a>

디바이스 프로필을 생성하려면 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateDestination.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateDestination.html) API 작업 또는 [https://docs.aws.amazon.com/cli/latest/reference/create-destination.html](https://docs.aws.amazon.com/cli/latest/reference/create-destination.html) CLI 명령을 사용합니다. 예를 들어 다음 명령을 실행하면 Sidewalk 엔드 디바이스에 대한 대상이 생성됩니다.

```
aws iotwireless create-destination --name SidewalkDestination \
    --expression-type RuleName --expression SidewalkRule \
    --role-arn arn:aws:iam::123456789012:role/SidewalkRole
```

이 명령을 실행하면 Amazon 리소스 이름(ARN)과 대상 이름 등 대상 세부 정보가 반환됩니다.

```
{
    "Arn": "arn:aws:iotwireless:us-east-1:123456789012:Destination/SidewalkDestination",
    "Name": "SidewalkDestination"
}
```

대상 생성에 대한 자세한 내용은 [LoRaWAN 디바이스 메시지를 처리하는 규칙 생성](https://docs.aws.amazon.com/iot/latest/developerguide/connect-iot-lorawan-destination-rules.html)을 참조하세요.

# 대상에 대한 IAM 역할 및 IoT 규칙 생성
<a name="sidewalk-destination-rule-role"></a>

AWS IoT 규칙은 디바이스 메시지를 다른 서비스로 전송합니다. 또한 AWS IoT 규칙은 Sidewalk 엔드 디바이스에서 수신한 바이너리 메시지를 처리하여 다른 서비스가 사용할 수 있도록 합니다. Amazon Sidewalk용 AWS IoT Core 대상은 무선 디바이스를 디바이스 메시지 데이터를 처리하여 다른 서비스로 전송하는 규칙과 연결합니다. 규칙은 Amazon Sidewalk용 AWS IoT Core에서 수신하는 즉시 디바이스의 데이터에 적용됩니다. 동일한 서비스에 데이터를 보내는 모든 디바이스가 공유하는 대상을 만들 수 있습니다. 또한 규칙에 데이터를 전송할 권한을 부여하는 IAM 역할을 생성해야 합니다.

## 대상에 대한 IAM 역할 생성
<a name="iot-sidewalk-destination-role"></a>

AWS IoT 규칙에 데이터를 전송할 권한을 Amazon Sidewalk용 AWS IoT Core에 부여하는 IAM 역할을 생성합니다. 역할을 생성하려면 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) API 작업 또는 [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role) CLI 명령을 사용합니다. 역할 이름을 *`SidewalkRole`*로 지정할 수 있습니다.

```
aws iam create-role --role-name SidewalkRole \ 
    --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
```

JSON 파일을 사용하여 역할에 대한 신뢰 정책을 정의할 수도 있습니다.

```
aws iam create-role --role-name SidewalkRole \ 
    --assume-role-policy-document file://trust-policy.json
```

다음은 JSON 파일의 내용을 보여줍니다.

**trust-policy.json의 내용**

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

## 대상에 대한 규칙 생성
<a name="iot-sidewalk-destination-rule"></a>

AWS IoT Core API 작업 [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html) 또는 AWS CLI 명령 [https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html](https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html)을 사용하여 규칙을 생성합니다. 대상은 주제 규칙을 사용하여 Sidewalk 엔드 디바이스에서 수신한 데이터를 다른 AWS 서비스로 라우팅합니다. 예를 들어, Lambda 함수에 메시지를 보내는 규칙 작업을 생성할 수 있습니다. 디바이스로부터 애플리케이션 데이터를 수신하고 다른 애플리케이션에서 사용할 수 있도록 base64를 사용하여 페이로드 데이터를 디코딩하도록 Lambda 함수를 정의할 수 있습니다.

다음 단계는 Lambda 함수를 생성한 다음 이 함수에 메시지를 보내는 주제 규칙을 생성하는 방법을 보여줍니다.

1. 

**실행 역할 및 정책 생성**

   함수에 AWS 리소스에 액세스할 수 있는 권한을 제공하는 IAM 역할을 만듭니다. JSON 파일을 사용하여 역할에 대한 신뢰 정책을 정의할 수도 있습니다.

   ```
   aws iam create-role --role-name lambda-ex \ 
       --assume-role-policy-document file://lambda-trust-policy.json
   ```

   다음은 JSON 파일의 내용을 보여줍니다.

   **lambda-trust-policy.json의 내용**

   ```
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. 

**Lambda 함수 생성 및 테스트**

   base64가 페이로드 데이터를 디코딩하는 AWS Lambda 함수를 생성하려면 다음 단계를 수행하세요.

   1. 페이로드 데이터를 디코딩하기 위한 코드를 작성합니다. 예를 들어, 다음 샘플 Python 코드를 사용할 수 있습니다. 스크립트 이름을 지정합니다(예: *`base64_decode.py`*).

      **base64\$1decode.py의 내용**

      ```
      // -----------------------------------------------------------
      // ----- Python script to decode incoming binary payload -----
      // -----------------------------------------------------------
      import json
      import base64
      
      def lambda_handler(event, context):
      
          message = json.dumps(event)
          print (message)
      
          payload_data = base64.b64decode(event["PayloadData"])
          print(payload_data)
          print(int(payload_data,16))
      ```

   1. Python 파일이 포함된 zip 파일로 배포 패키지를 만들고 이름을 `base64_decode.zip`으로 지정합니다. `CreateFunction` API 또는 `create-function` CLI 명령을 사용하여 샘플 코드 *`base64_decode.py`*용 Lambda 함수를 생성합니다.

   1. 

      ```
      aws lambda create-function --function-name my-function \
      --zip-file fileb://base64_decode.zip --handler index.handler \ 
      --runtime python3.9 --role arn:aws:iam::123456789012:role/lambda-ex
      ```

      다음과 같이 출력되어야 합니다. 주제 규칙을 생성할 때 출력의 Amazon 리소스 이름(ARN)인 `FunctionArn` 값을 사용합니다.

      ```
      {
          "FunctionName": "my-function",
          "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
          "Runtime": "python3.9",
          "Role": "arn:aws:iam::123456789012:role/lambda-ex",
          "Handler": "index.handler",
          "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=",
          "Version": "$LATEST",
          "TracingConfig": {
              "Mode": "PassThrough"
          },
          "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff",
          ...
      }
      ```

   1. 명령줄에서 호출에 대한 로그를 가져오려면 `invoke` 명령과 함께 `--log-type` 옵션을 사용하세요. 호출에서 base64로 인코딩된 로그를 최대 4KB까지 포함하는 LogResult 필드가 응답에 포함됩니다.

      ```
      aws lambda invoke --function-name my-function out --log-type Tail
      ```

      `StatusCode`가 200인 응답을 받게 됩니다. AWS CLI를 통한 Lambda 함숨 생성 및 사용에 대한 자세한 내용은 [AWS CLI에서 Lambda 사용](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)을 참조하세요.

1. 주제 규칙 생성

   `CreateTopicRule` API 또는 `create-topic-rule` CLI 명령을 사용하여 이 Lambda 함수에 메시지를 보내는 주제 규칙을 생성합니다. AWS IoT 주제에 다시 게시하는 두 번째 규칙 작업을 추가할 수도 있습니다. 이 주제 규칙의 이름을 `Sidewalkrule`로 지정합니다.

   ```
   aws iot create-topic-rule --rule-name Sidewalkrule \ 
       --topic-rule-payload file://myrule.json
   ```

   `myrule.json` 파일을 사용하여 규칙에 대한 자세한 내용을 지정할 수 있습니다. 예를 들어, 다음 JSON 파일은 AWS IoT 주제에 다시 게시하고 Lambda 함수에 메시지를 보내는 방법을 보여줍니다.

   ```
   {
       "sql": "SELECT * ",
       "actions": [
          {
               // You obtained this functionArn when creating the Lambda function using the 
               // create-function command.
               "lambda": {
                   "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function"
                }
           },
           {
               // This topic can be used to observe messages exchanged between the device and 
               // AWS IoT Core for Amazon Sidewalk after the device is connected.
                "republish": {
                    "roleArn": "arn:aws:iam::123456789012:role/service-role/SidewalkRepublishRole",
                    "topic": "project/sensor/observed"
                }
           }
       ],
   }
   ```