

# Sidewalk エンドデバイスの送信先を追加する
<a name="iot-sidewalk-qsg-destination"></a>

AWS IoT ルールを使用してデータやデバイスメッセージを処理し、他のサービスにルーティングします。また、デバイスから受信したバイナリメッセージを処理するルールを定義して、メッセージを他の形式に変換し、他のサービスで使用しやすくすることもできます。送信先は、デバイスのメッセージデータを処理して他の AWS のサービス に送信するルールに Sidewalk エンドデバイスを関連付けます。

## 送信先を作成して使用する方法
<a name="iot-sidewalk-destination-how"></a>

1. AWS IoT ルールと送信先の IAM ロールを作成します。この AWS IoT ルールは、デバイスのデータを処理し、他の AWS のサービス やアプリケーションが使用できるようにルーティングするルールを指定します。IAM ロールは、ルールへのアクセス許可を付与します。

1. `CreateDestination` API オペレーションを使用して Sidewalk デバイスの送信先を作成します。送信先名、ルール名、ロール名、および任意のパラメータを指定します。API は送信先の一意の識別子を返します。この識別子は、エンドデバイスを AWS IoT Core for Amazon Sidewalk に追加するときに指定できます。

以下に、送信先を作成する方法と、送信先の 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>

AWS IoT Core for Amazon Sidewalk のアカウントに送信先を追加するには、[送信先ハブ](https://console.aws.amazon.com/iot/home#/wireless/destinations)を使用するか、`CreateDestination` を使用します。送信先を作成するときは、以下を指定してください。
+ 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/ja_jp/iot-wireless/latest/developerguide/images/iot-sidewalk-add-destination.PNG)


デバイスのデータを処理するには、送信先を作成するときに以下のフィールドを指定して、**[送信先を追加]** を選択します。
+ 

**送信先の詳細**  
[**Destination name**] (送信先名) と、必要に応じて送信先の説明を入力します。
+ 

**ルール名**  
デバイスが送信したメッセージを評価し、デバイスのデータを処理するために設定された AWS IoT ルールです。ルール名は送信先にマップされます。送信先には、受信したメッセージを処理するためのルールが必要です。メッセージは、AWS IoT ルールの呼び出し、または AWS IoT メッセージブローカーへのパブリッシュのいずれかによって処理されるように選択できます。
  + [**Enter a rule name**] (ルール名を入力) を選択する場合は、名前を入力し、次に [**Copy**] (コピー) をクリックして、AWS IoT ルールを作成するときに入力するルール名をコピーします。[**Create rule**] (ルールの作成) を選択して今すぐルールを作成するか、AWS IoT コンソールの [[Rules](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)」を参照してください。
  + **[Publish to AWS IoT message broker]** (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 で新しいロール名を作成することできます。その後、適切なアクセス許可を持つ IAM ロールが AWS IoT Core for LoRaWAN で自動的に作成されます。

## 送信先を作成する (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 エンドデバイスから受信したバイナリメッセージを処理して、他のサービスで使用しやすくすることもできます。AWS IoT Core for Amazon Sidewalk の送信先は、デバイスのメッセージデータを処理して他のサービスに送信するルールにワイヤレスデバイスを関連付けます。このルールは、AWS IoT Core for Amazon Sidewalk がデバイスのデータを受信するとすぐにそのデータに対してアクションを実行します。データを同じサービスに送信するすべてのデバイスについて、すべての送信先を作成して、すべての送信先を作成できます。ルールにデータを送信するためのアクセス許可を付与する IAM ロールも作成する必要があります。

## 送信先の IAM ロールを作成する
<a name="iot-sidewalk-destination-role"></a>

データを AWS IoT ルールに送信するための AWS IoT Core for Amazon Sidewalk アクセス許可を付与する 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
      ```

      次のような出力が表示されます。トピックルールを作成するときは、出力、`FunctionArn` の Amazon リソースネーム (ARN) の値を使用します。

      ```
      {
          "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` オプションを使用します。レスポンスには、LogResult フィールドが含まれます。このフィールドには、呼び出しから base64 コードされた最大 4 KB のログが含まれます。

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

      `StatusCode` が 200 のレスポンスが返ってくるはずです。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 トピックに再公開する 2 つ目のルールアクションを追加することもできます。このトピックルールに「`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"
                }
           }
       ],
   }
   ```