

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS IoT チュートリアル
<a name="iot-tutorials"></a>

 AWS IoT チュートリアルは、2 つの異なる目標をサポートするために 2 つの学習パスに分かれています。目標に最適なラーニングパスを選択してください。
+ 

**AWS IoT ソリューションのアイデアをテストまたは実証するためのproof-of-conceptを構築したい**  
デバイスで AWS IoT Device Client を使用して一般的な IoT タスクとアプリケーションを実証するには、 [AWS IoT Device Client を使用したデモの構築](iot-tutorials-dc-intro.md)ラーニングパスに従います。 AWS IoT Device Client は、独自のクラウドリソースを適用して、最小限の開発でend-to-endのソリューションをデモンストレーションできるデバイスソフトウェアを提供します。

   AWS IoT Device Client の詳細については、[AWS IoT 「 Device Client](https://github.com/awslabs/aws-iot-device-client#readme)」を参照してください。
+ 

**ソリューションをデプロイするための本番ソフトウェアを構築する方法を学びたい場合**  
 AWS IoT Device SDK を使用して特定の要件を満たす独自のソリューションソフトウェアを作成するには、 [AWS IoT Device SDKs を使用したソリューションの構築](iot-tutorials-sdk-intro.md)ラーニングパスに従います。

  使用可能な AWS IoT Device SDKs「」を参照してください[AWS IoTDevice SDKs](iot-sdks.md#iot-device-sdks)。 AWS SDKs」を参照してください。 [AWS](https://aws.amazon.com/tools/)

**Topics**
+ [AWS IoT Device Client を使用したデモの構築](iot-tutorials-dc-intro.md)
+ [AWS IoT Device SDKs を使用したソリューションの構築](iot-tutorials-sdk-intro.md)

# AWS IoT Device Client を使用したデモの構築
<a name="iot-tutorials-dc-intro"></a>

このラーニングパスのチュートリアルでは、 AWS IoT Device Client を使用してデモンストレーションソフトウェアを開発する手順について説明します。 AWS IoT Device Client は、 IoT デバイスで実行されるソフトウェアを提供し、 が構築されている IoT ソリューションの側面をテストしてデモンストレーションします AWS IoT。

これらのチュートリアルの目的は、デバイスソフトウェアを開発する前に がソリューション AWS IoT をサポートしていることを確信できるように、探索と実験を容易にすることです。

**これらのチュートリアルでは、次の内容を学習します。**
+ で IoT デバイスとして使用する Raspberry Pi を準備する方法 AWS IoT
+ デバイスで AWS IoT Device Client を使用して AWS IoT 機能を示す方法

このラーニングパスでは、独自の Raspberry Pi に AWS IoT Device Client をインストールし、クラウドに AWS IoT リソースを作成して IoT ソリューションのアイデアを示します。このラーニングパスのチュートリアルでは、Raspberry Pi を使用して機能を実証しますが、他のデバイスへの適応に役立つ目標と手順について説明します。

## AWS IoT Device Client でデモを構築するための前提条件
<a name="iot-dc-tutorial-overview"></a>

このセクションでは、このラーニングパスのチュートリアルを開始する前に、必要な内容について説明します。

**このラーニングパスのチュートリアルを完了するには、以下が必要です。**
+ 

**AWS アカウント**  
これらのチュートリアルで使用する機能を使用するには AWS アカウント AWS IoT 、既存の を使用できますが、追加のロールまたはアクセス許可を追加する必要がある場合があります。

  新しい を作成する必要がある場合は AWS アカウント、「」を参照してください[セットアップ AWS アカウント](setting-up.md)。
+ 

**Raspberry Pi または互換性のある IoT デバイス**  
チュートリアルでは、[Raspberry Pi](https://www.raspberrypi.org/) を使用します。さまざまなフォームファクタで入手でき、どこにでもあり、比較的安価なデモンストレーションデバイスだからです。チュートリアルは、[Raspberry Pi 3 Model B\$1](https://www.raspberrypi.com/products/raspberry-pi-3-model-b-plus/)、[Raspberry Pi 4 Model B](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/)、および Ubuntu Server 20.04 LTS (HVM) で実行されている Amazon EC2 インスタンスでテストされています。を使用してコマンド AWS CLI を実行するには、最新バージョンの Raspberry Pi OS ([Raspberry Pi OS (64 ビット)](https://www.raspberrypi.com/software/operating-systems/) または OS Lite) を使用することをお勧めします。以前のバージョンの OS でも動作する可能性がありますが、テストはしていません。
**注記**  
チュートリアルでは、各ステップの目標を説明して、これまで当社で試していない IoT ハードウェアへの適応に役立つようにしていますが、他のデバイスに適応させる方法を具体的に説明しているわけではありません。
+ 

**IoT デバイスのオペレーティングシステムに慣れていること**  
これらのチュートリアルの手順では、Raspberry Pi でサポートされているコマンドラインインターフェイスからの基本的な Linux コマンドとオペレーションの使用に慣れていることを前提としています。これらのオペレーションに慣れていない場合は、チュートリアルを完了するのに時間がかかるかもしれません。

  これらのチュートリアルを完了するために望ましいのは、以下の操作方法を事前に理解しておくことです。
  + コンポーネントの組み立てと接続、必要な電源へのデバイスの接続、メモリカードの取り付けと取り外しなど、基本的なデバイス操作を安全に実行する。
  + システムソフトウェアとファイルをデバイスにアップロードおよびダウンロードする。お使いのデバイスが microSD カードなどのリムーバブルストレージデバイスを使用していない場合は、デバイスに接続し、システムソフトウェアとファイルをデバイスにアップロードおよびダウンロードする方法を知っておく必要があります。
  + デバイスを使用する予定のネットワークにデバイスを接続する。
  + SSH ターミナルまたは同様のプログラムを使用して、別のコンピュータからデバイスに接続する。
  + コマンドラインインターフェイスを使用して、デバイス上のファイルとディレクトリの作成、コピー、移動、名前の変更、およびアクセス許可の設定を行う。
  + デバイスに新しいプログラムをインストールする。
  + FTP や SCP などのツールを使用して、デバイスとの間でファイルを転送する。
+ 

**IoT ソリューションの開発およびテスト環境**  
チュートリアルでは、必要なソフトウェアとハードウェアについて説明します。ただし、チュートリアルでは、オペレーションが明示的に説明されていない場合がありますが、実行できると想定しています。このようなハードウェアとオペレーションの例は次のとおりです。
  + 

**ファイルをダウンロードして保存するローカルホストコンピュータ**  
Raspberry Pi の場合、これは通常、microSD メモリカードへの読み書きが可能なパーソナルコンピュータまたはラップトップです。ローカルホストコンピュータでは、次のことが必要です。
    + インターネットに接続されている。
    + [AWS CLI](https://aws.amazon.com//cli/) がインストールされ、設定されている。
    +  AWS コンソールをサポートするウェブブラウザを用意します。
  + 

**ローカルホストコンピュータをデバイスに接続して通信し、コマンドを入力し、ファイルを転送する手段**  
Raspberry Pi では、これはローカルホストコンピュータからの SSH と SCP を使用して行われることがよくあります。
  + 

**IoT デバイスに接続するモニターとキーボード**  
これらは役立ちますが、チュートリアルを完了するために必須ではありません。
  + 

**ローカルホストコンピュータと IoT デバイスがインターネットに接続する手段**  
これは、インターネットに接続されているルーターまたはゲートウェイへのケーブル接続またはワイヤレスネットワーク接続です。ローカルホストは Raspberry Pi にも接続できる必要があります。これには、同じローカルエリアネットワーク上に存在することが必要になる場合があります。チュートリアルでは、特定のデバイスまたはデバイス構成に対してこれを設定する方法を説明することはできませんが、この接続をテストする方法を説明します。
  + 

**ローカルエリアネットワークのルーターにアクセスして、接続されたデバイスを表示する**  
このラーニングパスのチュートリアルを完了するには、IoT デバイスの IP アドレスを見つける必要があります。

    ローカルエリアネットワークでは、デバイスが接続しているネットワークルーターの admin インターフェイスにアクセスすることでこれを行うことができます。ルーター内のデバイスに固定 IP アドレスを割り当てることができれば、デバイスが再起動するたびに行う再接続が簡単になります。

    キーボードとモニターがデバイスに接続されている場合、**ifconfig** でデバイスの IP アドレスを表示できます。

    これらの方法が使えない場合は、再起動するたびにデバイスの IP アドレスを特定する方法を見つける必要があります。

必要な要素をすべて用意したら、[チュートリアル: Device Client 用の AWS IoT デバイスの準備](iot-dc-prepare-device.md) に進みます。

**Topics**
+ [AWS IoT Device Client でデモを構築するための前提条件](#iot-dc-tutorial-overview)
+ [チュートリアル: Device Client 用の AWS IoT デバイスの準備](iot-dc-prepare-device.md)
+ [チュートリアル: AWS IoT Device Client のインストールと設定](iot-dc-install-dc.md)
+ [チュートリアル: AWS IoT Device Client との MQTT メッセージ通信のデモンストレーション](iot-dc-testconn.md)
+ [チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション](iot-dc-runjobs.md)
+ [チュートリアル: AWS IoT Device Client チュートリアルの実行後のクリーンアップ](iot-dc-cleanup.md)

# チュートリアル: Device Client 用の AWS IoT デバイスの準備
<a name="iot-dc-prepare-device"></a>

このチュートリアルでは、このラーニングパスの後続のチュートリアルに備えるための Raspberry Pi の初期化を順を追って説明します。

このチュートリアルの目標は、デバイスのオペレーティングシステムの現在のバージョンをインストールし、開発環境のコンテキストでデバイスと通信できるようにすることです。

**前提条件**  
このチュートリアルを開始する前に、「[AWS IoT Device Client でデモを構築するための前提条件](iot-tutorials-dc-intro.md#iot-dc-tutorial-overview)」にリストされている項目が使用可能で、使用する準備が整っていることを確認してください。

このチュートリアルの完了には 90 分ほどかかります。

**このチュートリアルでは、次の作業を行います。**
+ デバイスのオペレーティングシステムをインストールおよび更新します。
+ チュートリアルの実行に必要な追加のソフトウェアをインストールして検証します。
+ デバイスの接続をテストし、必要な証明書をインストールします。

このチュートリアルを完了すると、次のチュートリアルでは Device Client を使用するデモ用に AWS IoT デバイスを準備します。

**Topics**
+ [デバイスのオペレーティングシステムをインストールおよび更新する](iot-dc-prepare-device-sys.md)
+ [デバイスに必要なソフトウェアをインストールして確認する](iot-dc-prepare-device-sw.md)
+ [デバイスをテストして Amazon CA 証明書を保存する](iot-dc-prepare-device-test.md)

# デバイスのオペレーティングシステムをインストールおよび更新する
<a name="iot-dc-prepare-device-sys"></a>

このセクションの手順では、Raspberry Pi がシステムドライブに使用する microSD カードを初期化する方法について説明します。Raspberry Pi の microSD カードには、オペレーティングシステム (OS) ソフトウェアとそのアプリケーションファイルストレージ用のスペースが含まれています。Raspberry Pi を使用していない場合は、デバイスの指示に従ってデバイスのオペレーティングシステムソフトウェアのインストールおよび更新をします。

このセクションを完了すると、IoT デバイスを起動し、ローカルホストコンピュータのターミナルプログラムからそれに接続できるようになります。

**必要な機器:**
+ ローカルでの開発およびテスト環境
+ インターネットに接続できる Raspberry Pi またはお使いの IoT デバイス
+ 少なくとも 8 GB の容量または OS および必要なソフトウェアに十分なストレージを備えた microSD メモリカード。
**注記**  
これらの演習での microSD カードの選択では、必要な大きさでできるだけ小さいものを選択してください。  
小さな SD カードの方が、バックアップと更新が高速になります。Raspberry Pi では、これらのチュートリアルに 8 GB を超える microSD カードは必要ありません。特定のアプリケーションにより多くのスペースが必要な場合は、このチュートリアルで保存するイメージファイルのサイズが小さくなると、選択したカードのサポートされているすべての領域を使用するように、大きなカードのファイルシステムのサイズを変更できます。

**オプションの機器:**
+ Raspberry Pi に接続された USB キーボード
+ モニターを Raspberry Pi に接続するための HDMI モニターとケーブル

**Topics**
+ [デバイスのオペレーティングシステムを microSD カードにロードする](#iot-dc-prepare-device-sys-step1)
+ [新しいオペレーティングシステムで IoT デバイスを起動する](#iot-dc-prepare-device-sys-step2)
+ [ローカルホストコンピュータをデバイスに接続する](#iot-dc-prepare-device-sys-step3)

## デバイスのオペレーティングシステムを microSD カードにロードする
<a name="iot-dc-prepare-device-sys-step1"></a>

この手順では、ローカルホストコンピュータを使用して、デバイスのオペレーティングシステムを microSD カードにロードします。

**注記**  
デバイスがオペレーティングシステムにリムーバブルストレージメディアを使用していない場合は、そのデバイスの手順に従ってオペレーティングシステムをインストールし、[新しいオペレーティングシステムで IoT デバイスを起動する](#iot-dc-prepare-device-sys-step2) に進みます。

**オペレーティングシステムを Raspberry Pi にインストールするには**

1. ローカルホストコンピュータで、使用する Raspberry Pi オペレーティングシステムイメージをダウンロードして解凍します。最新バージョンは以下から入手できます。[https://www.raspberrypi.com/software/operating-systems/](https://www.raspberrypi.com/software/operating-systems/) 

**Raspberry Pi OS のバージョンを選択する**  
このチュートリアルでは **Raspberry Pi OS Lite** バージョンを使用します。これは、このラーニングパスのこれらのチュートリアルをサポートする最小のバージョンだからです。このバージョンの Raspberry Pi OS はコマンドラインインターフェイスのみを備えており、グラフィカルユーザーインターフェイスはありません。グラフィカルユーザーインターフェイスを備えた最新の Raspberry Pi OS のバージョンも、これらのチュートリアルで動作します。ただし、このラーニングパスで説明されている手順では、コマンドラインインターフェイスのみを使用して Raspberry Pi 上でオペレーションを実行します。

1. microSD カードをローカルホストコンピュータに挿入します。

1. SD カードイメージングツールを使用して、解凍した OS イメージファイルを microSD カードに書き込みます。

1. Raspberry Pi OS イメージを microSD に書き込んだら、以下を行います。

   1. コマンドラインウィンドウまたはファイルエクスプローラーウィンドウで microSD カードの BOOT パーティションを開きます。

   1. microSD カードの BOOT パーティションのルートディレクトリに、ファイル拡張子もコンテンツもない `ssh` という名前の空のファイルを作成します。これにより、初めて起動したときに SSH 通信を有効にするように Raspberry Pi に指示します。

1. microSD カードを取り出して、ローカルホストコンピュータから安全に取り外します。

microSD カードは [新しいオペレーティングシステムで IoT デバイスを起動する](#iot-dc-prepare-device-sys-step2) の準備ができました。

## 新しいオペレーティングシステムで IoT デバイスを起動する
<a name="iot-dc-prepare-device-sys-step2"></a>

この手順では、microSD カードをインストールし、ダウンロードしたオペレーティングシステムを使用して初めて Raspberry Pi を起動します。

**新しいオペレーティングシステムで IoT デバイスを起動するには**

1. デバイスの電源を切った状態で、前のステップ [デバイスのオペレーティングシステムを microSD カードにロードする](#iot-dc-prepare-device-sys-step1) の microSD カードを Raspberry Pi に挿入します。

1. デバイスを有線ネットワークに接続します。

1. これらのチュートリアルでは、SSH ターミナルを使用して、ローカルホストコンピュータから Raspberry Pi とやり取りします。

   デバイスと直接やり取りする場合は、次の方法も使用できます。

   1. ローカルホストコンピュータのターミナルウィンドウを Raspberry Pi に接続する前に、HDMI モニターを接続して Raspberry Pi のコンソールメッセージを確認します。

   1. Raspberry Pi と直接やりとりする場合は、USB キーボード接続します。

1. 電源を Raspberry Pi に接続し、初期化されるまで約 1 分待ちます。

   Raspberry Pi にモニターが接続されている場合は、そのモニターで起動プロセスを確認できます。

1. 

   デバイスの IP アドレスを調べます。
   + HDMI モニターを Raspberry Pi に接続した場合、モニターに表示されるメッセージに IP アドレスが表示されます。
   + Raspberry Pi が接続されているルーターにアクセスできる場合は、ルーターの admin インターフェイスでそのアドレスを確認できます。

Raspberry Pi の IP アドレスを取得したら、[ローカルホストコンピュータをデバイスに接続する](#iot-dc-prepare-device-sys-step3) の準備が整います。

## ローカルホストコンピュータをデバイスに接続する
<a name="iot-dc-prepare-device-sys-step3"></a>

この手順では、ローカルホストコンピュータ上のターミナルプログラムを使用して Raspberry Pi に接続し、デフォルトのパスワードを変更します。

**ローカルホストコンピュータをデバイスに接続するには**

1. 

   ローカルホストコンピュータで、次の SSH ターミナルプログラムを開きます。
   + Windows: `PuTTY`
   + Linux/macOS: `Terminal`
**注記**  
PuTTY は Windows に自動的にインストールされません。コンピュータにない場合は、ダウンロードおよびインストールが必要になる場合があります。

1. ターミナルプログラムを Raspberry Pi の IP アドレスに接続し、デフォルトの認証情報を使用してログインします。

   ```
   username: pi
   password: raspberry
   ```

1. Raspberry Pi にログインしたら、`pi` ユーザーのパスワードを変更します。

   ```
   passwd
   ```

   プロンプトに従って、パスワードを変更します。

   ```
   Changing password for pi.
   Current password: raspberry
   New password: YourNewPassword
   Retype new password: YourNewPassword
   passwd: password updated successfully
   ```

ターミナルウィンドウで Raspberry Pi のコマンドラインプロンプトが表示され、パスワードを変更したら、[デバイスに必要なソフトウェアをインストールして確認する](iot-dc-prepare-device-sw.md) に進む準備が整います。

# デバイスに必要なソフトウェアをインストールして確認する
<a name="iot-dc-prepare-device-sw"></a>

このセクションの手順は[、前のセクション](iot-dc-prepare-device-sys.md)から続き、Raspberry Pi のオペレーティングシステムを最新の状態にし、次のセクションで AWS IoT Device Client の構築とインストールに使用するソフトウェアを Raspberry Pi にインストールします。

このセクションを完了すると、Raspberry Pi には、このラーニングパスのチュートリアルで必要なソフトウェアである最新のオペレーティングシステムが搭載され、お客様の場所に合わせて設定されます。

**必要な機器:**
+ [前のセクション](iot-dc-prepare-device-sys.md)で準備したローカルでの開発およびテスト環境
+ [前のセクション](iot-dc-prepare-device-sys.md)で使用した Raspberry Pi
+ [前のセクション](iot-dc-prepare-device-sys.md)で準備した microSD メモリカード

**注記**  
Raspberry Pi Model 3\$1 および Raspberry Pi Model 4 は、このラーニングパスで説明されているすべてのコマンドを実行できます。IoT デバイスがソフトウェアをコンパイルしたり、 を実行できない場合は AWS Command Line Interface、必要なコンパイラをローカルホストコンピュータにインストールしてソフトウェアを構築し、IoT デバイスに転送する必要があります。デバイスにソフトウェアをインストールおよびビルドする方法の詳細については、デバイスのソフトウェアのドキュメントを参照してください。

**Topics**
+ [オペレーティングシステムソフトウェアを更新する](#iot-dc-prepare-device-sw-step1)
+ [必要なアプリケーションおよびライブラリをインストールする](#iot-dc-prepare-device-sw-step2)
+ [(オプション) microSD カードイメージを保存する](#iot-dc-prepare-device-sw-step3)

## オペレーティングシステムソフトウェアを更新する
<a name="iot-dc-prepare-device-sw-step1"></a>

この手順では、オペレーティングシステムソフトウェアを更新します。

**Raspberry Pi でオペレーティングシステムソフトウェアをアップデートするには**

ローカルホストコンピュータのターミナルウィンドウでこれらの手順を実行します。

1. Raspberry Pi のシステムソフトウェアを更新するには、次のコマンドを入力します。

   ```
   sudo apt-get -y update
   sudo apt-get -y upgrade
   sudo apt-get -y autoremove
   ```

1. Raspberry Pi のロケールとタイムゾーンの設定を更新します (オプション)。

   次のコマンドを入力して、デバイスのロケールとタイムゾーンの設定を更新します。

   ```
   sudo raspi-config
   ```

   1. デバイスのロケールを設定するには、次の手順を実行します。

      1. **[Raspberry Pi Software Configuration Tool (raspi-config)]** (Raspberry Pi ソフトウェア設定ツール (raspi-config)) 画面で、オプション **[5]** を選択します。

         **`5 Localisation Options Configure language and regional settings`**

         Tab キーを使用して **[<Select>]** (<選択>) に移動してから、space bar を押します。

      1. ローカリゼーションオプションメニューで、オプション **[L1]** を選択します。

         **`L1 Locale Configure language and regional settings`**

         Tab キーを使用して **[<Select>]** (<選択>) に移動してから、space bar を押します。

      1. ロケールのオプションの一覧で、矢印キーを使用してスクロールし、space bar を使用してインストールするものをマークすることで、Raspberry Pi にインストールするロケールを選択します。

         米国では、**`en_US.UTF-8`** を選択するのが適切です。

      1. デバイスのロケールを選択したら、Tab キーを使用して **[<OK>]** を選択してから space bar を押して、**[Configuring locales]** (ロケールの設定) 確認ページを表示します。

   1. デバイスのタイムゾーンを設定するには、次の手順を実行します。

      1. **[raspi-config]** (raspi-config) 画面で、オプション **[5]** を選択します。

         **`5 Localisation Options Configure language and regional settings`**

         Tab キーを使用して **[<Select>]** (<選択>) に移動してから、space bar を押します。

      1. ローカリゼーションオプションメニューで、矢印キーを使用してオプション **[L2]** を次のように選択します。

         **`L2 time zone Configure time zone`**

         Tab キーを使用して **[<Select>]** (<選択>) に移動してから、space bar を押します。

      1. **[Configuring tzdata]** (tzdata の設定) メニューで、リストから自身の地域を選択します。

         Tab キーを使用して **[<OK>]** に移動し、space bar を押します。

      1. 都市のリストで、矢印キーを使用して、自身のタイムゾーン内の都市を選択します。

         タイムゾーンを設定するには、Tab キー を使用して **[<OK>]** に移動してから、space bar を押します。

   1. 設定の更新が完了したら、Tab キーを使用して **[<Finish>]** (<完了>) に移動してから、space bar を押して **[raspi-config]** アプリケーションを閉じます。

1. Raspberry Pi を再起動するには、次のコマンドを入力します。

   ```
   sudo shutdown -r 0
   ```

1. Raspberry Pi が再起動するのを待ちます。

1. Raspberry Pi が再起動したら、ローカルホストコンピュータのターミナルウィンドウを Raspberry Pi に再接続します。

Raspberry Pi システムソフトウェアが設定され、[必要なアプリケーションおよびライブラリをインストールする](#iot-dc-prepare-device-sw-step2) に進む準備が整いました。

## 必要なアプリケーションおよびライブラリをインストールする
<a name="iot-dc-prepare-device-sw-step2"></a>

この手順では、以降のチュートリアルで使用するアプリケーションソフトウェアとライブラリをインストールします。

Raspberry Pi を使用している場合、または IoT デバイスで必要なソフトウェアをコンパイルできる場合は、ローカルホストコンピュータのターミナルウィンドウで次の手順を実行します。ローカルホストコンピュータ上で IoT デバイス用のソフトウェアをコンパイルする必要がある場合は、デバイス上でこれらの手順を実行する方法について、IoT デバイスのソフトウェアドキュメントを確認してください。

**アプリケーションソフトウェアとライブラリを Raspberry Pi にインストールするには**

1. 次のコマンドを入力して、アプリケーションソフトウェアとライブラリをインストールします。

   ```
   sudo apt-get -y install build-essential libssl-dev cmake unzip git python3-pip
   ```

1. 次のコマンドを入力して、正しいバージョンのソフトウェアがインストールされていることを確認します。

   ```
   gcc --version
   cmake --version
   openssl version
   git --version
   ```

1. 

   次のバージョンのアプリケーションソフトウェアがインストールされていることを確認します。
   + `gcc` 9.3.0 以降
   + `cmake` 3.10.x 以降
   + `OpenSSL` 1.1.1 以降
   + `git` 2.20.1 以降

Raspberry Pi に必要なアプリケーションソフトウェアの許容バージョンがある場合、[(オプション) microSD カードイメージを保存する](#iot-dc-prepare-device-sw-step3) に進む準備が整っています。

## (オプション) microSD カードイメージを保存する
<a name="iot-dc-prepare-device-sw-step3"></a>

このラーニングパスのチュートリアルの各所で、Raspberry Pi の microSD カードイメージのコピーをローカルホストコンピュータ上のファイルに保存する手順が言及されています。この手順は奨励されていますが、必須タスクではありません。提案されているところで microSD カードのイメージを保存することで、このラーニングパスのセーブポイントの前にある手順をスキップできます。これにより、何かを再試行する必要がある場合に時間を節約できます。microSD カードのイメージを定期的に保存しないと、その結果として、microSD カードが破損した場合、またはアプリケーションやその設定を誤って構成した場合は、ラーニングパスのチュートリアルを最初からやり直す必要がある可能性があります。

この時点で、Raspberry Pi の microSD カードに更新された OS と基本的なアプリケーションソフトウェアがロードされています。この時点で、microSD カードの内容をファイルに保存することで、これまでの手順を完了するのにかかる時間を節約できます。デバイスの microSD イメージの現在のイメージがあれば、最初からソフトウェアをインストールして更新することなく、この時点からチュートリアルや手順を続行または再試行できます。

**microSD カードのイメージをファイルに保存するには**

1. 次のコマンドを入力して Raspberry Pi をシャットダウンします。

   ```
   sudo shutdown -h 0
   ```

1. Raspberry Pi が完全にシャットダウンしたら、電源を切ります。

1. Raspberry Pi から microSD カードを取り外します。

1. ローカルホストコンピュータで、次の操作を行います。

   1. microSD カードを挿入します。

   1. SD カードイメージングツールを使用して、microSD カードのイメージをファイルに保存します。

   1. microSD カードのイメージを保存したら、ローカルホストコンピュータからカードを取り出します。

1. Raspberry Pi の電源を切断した状態で、microSD カードを Raspberry Pi に挿入します。

1. Raspberry Pi の電源を入れます。

1. 約 1 分待ってからローカルホストコンピュータで、Raspberry Pi に接続されていたローカルホストコンピュータのターミナルウィンドウを再接続し、Raspberry Pi にログインします。

# デバイスをテストして Amazon CA 証明書を保存する
<a name="iot-dc-prepare-device-test"></a>

このセクションの手順は[、前のセクション](iot-dc-prepare-device-sw.md)から続き、 AWS Command Line Interface と接続の認証に使用される認証機関証明書をインストールします AWS IoT Core。

このセクションを完了すると、Raspberry Pi に AWS IoT Device Client をインストールするために必要なシステムソフトウェアがあり、インターネットへの接続が機能していることがわかります。

**必要な機器:**
+ [前のセクション](iot-dc-prepare-device-sw.md)で準備したローカルでの開発およびテスト環境
+ [前のセクション](iot-dc-prepare-device-sw.md)で使用した Raspberry Pi
+ [前のセクション](iot-dc-prepare-device-sw.md)で準備した microSD メモリカード

**Topics**
+ [のインストール AWS Command Line Interface](#iot-dc-prepare-device-test-step1)
+ [AWS アカウント 認証情報を設定する](#iot-dc-prepare-device-test-step2)
+ [Amazon ルート CA 証明書をダウンロードする](#iot-dc-prepare-device-test-step3)
+ [(オプション) microSD カードイメージを保存する](#iot-dc-prepare-device-test-step4)

## のインストール AWS Command Line Interface
<a name="iot-dc-prepare-device-test-step1"></a>

この手順では、 を Raspberry Pi AWS CLI にインストールします。

Raspberry Pi を使用している場合、または IoT デバイスでソフトウェアをコンパイルできる場合は、ローカルホストコンピュータのターミナルウィンドウで次の手順を実行します。ローカルホストコンピュータで IoT デバイス用のソフトウェアをコンパイルする必要がある場合は、IoT デバイスのソフトウェアドキュメントで、必要なライブラリに関する情報を確認してください。

**Raspberry Pi AWS CLI に をインストールするには**

1.  AWS CLIをダウンロードしてインストールするには、次のコマンドを実行します。

   ```
   export PATH=$PATH:~/.local/bin # configures the path to include the directory with the AWS CLI
   git clone https://github.com/aws/aws-cli.git # download the AWS CLI code from GitHub
   cd aws-cli && git checkout v2 # go to the directory with the repo and checkout version 2
   pip3 install -r requirements.txt # install the prerequisite software
   ```

1. このコマンドを実行して をインストールします AWS CLI。このコマンドは完了までに、最大で 15 分かかります。

   ```
   pip3 install . # install the AWS CLI 
   ```

1. このコマンドを実行して、 の正しいバージョン AWS CLI がインストールされていることを確認します。

   ```
   aws --version
   ```

   のバージョンは 2.2 以降 AWS CLI である必要があります。

が現在のバージョン AWS CLI を表示した場合、 に進む準備が整います[AWS アカウント 認証情報を設定する](#iot-dc-prepare-device-test-step2)。

## AWS アカウント 認証情報を設定する
<a name="iot-dc-prepare-device-test-step2"></a>

この手順では、 AWS アカウント 認証情報を取得し、Raspberry Pi で使用するための認証情報を追加します。

**デバイスに AWS アカウント 認証情報を追加するには**

1. から**アクセスキー ID** と**シークレットアクセスキー**を取得 AWS アカウント して、デバイスで AWS CLI を認証します。

    AWS IAM を初めて使用する場合、[https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/ ](https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/)では、 AWS コンソールで を実行し、デバイスで使用する IAM 認証情報を作成する AWS プロセスについて説明します。

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、デバイスの **[Access Key ID]** (アクセスキー ID) と **[Secret Access Key]** (シークレットアクセスキー) 認証情報を使用して、次の操作を行います。

   1. 次のコマンドを使用して、 AWS アプリの設定を実行します。

      ```
      aws configure
      ```

   1. プロンプトが表示されたら、認証情報と設定情報を入力します。

      ```
      AWS Access Key ID: your Access Key ID
      AWS Secret Access Key: your Secret Access Key
      Default region name: your AWS リージョン code
      Default output format: json
      ```

1. このコマンドを実行して、 AWS アカウント および AWS IoT Core エンドポイントへのデバイスのアクセスをテストします。

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

   この例のように、 AWS アカウント特定の AWS IoT データエンドポイントを返す必要があります。

   ```
   {
       "endpointAddress": "a3EXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

 AWS アカウント特定の AWS IoT データエンドポイントが表示された場合、Raspberry Pi には に進むための接続とアクセス許可があります[Amazon ルート CA 証明書をダウンロードする](#iot-dc-prepare-device-test-step3)。

**重要**  
これで AWS アカウント 、認証情報が Raspberry Pi の microSD カードに保存されます。これにより、 との今後のやり取りや、これらのチュートリアルで作成するソフトウェア AWS が容易になりますが、デフォルトでこのステップ後に作成した microSD カードイメージにも保存され、複製されます。  
 AWS アカウント 認証情報のセキュリティを保護するために、microSD カードイメージを保存する前に、`aws configure`再度 を実行し、**アクセスキー ID** と**シークレットアクセスキー**にランダムな文字を入力して認証情報を消去して、 AWS アカウント 認証情報が侵害されないようにすることを検討してください。  
 AWS アカウント 誤って認証情報を保存した場合は、IAM AWS コンソールで非アクティブ化できます。

## Amazon ルート CA 証明書をダウンロードする
<a name="iot-dc-prepare-device-test-step3"></a>

この手順では、Amazon ルート認証局 (CA) の証明書のコピーをダウンロードして保存します。この証明書をダウンロードすると、以降のチュートリアルで使用するために保存され、デバイスと AWS のサービスとの接続もテストされます。

**Amazon ルート CA 証明書をダウンロードして保存するには**

1. 次のコマンドを実行して、証明書用のディレクトリを作成します。

   ```
   mkdir ~/certs
   ```

1. 次のコマンドを実行して、Amazon ルート CA 証明書をダウンロードします。

   ```
   curl -o ~/certs/AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

1. 次のコマンドを実行して、証明書ディレクトリとそのファイルへのアクセス権を設定します。

   ```
   chmod 745 ~
   chmod 700 ~/certs
   chmod 644 ~/certs/AmazonRootCA1.pem
   ```

1. 次のコマンドを実行して、新しいディレクトリ内の CA 証明書ファイルを確認します。

   ```
   ls -l ~/certs
   ```

   次のようなエントリが表示されます。日付と時刻は異なりますが、ファイルサイズおよびその他の情報はここに示すものと同じである必要があります。

   ```
   -rw-r--r-- 1 pi pi 1188 Oct 28 13:02 AmazonRootCA1.pem
   ```

   ファイルサイズが `1188` でない場合、**curl** コマンドパラメータを確認します。間違ったファイルをダウンロードした可能性があります。

## (オプション) microSD カードイメージを保存する
<a name="iot-dc-prepare-device-test-step4"></a>

この時点で、Raspberry Pi の microSD カードに更新された OS と基本的なアプリケーションソフトウェアがロードされています。

**microSD カードのイメージをファイルに保存するには**

1. ローカルホストコンピュータのターミナルウィンドウで、 AWS 認証情報をクリアします。

   1. 次のコマンドを使用して、 AWS アプリの設定を実行します。

      ```
      aws configure
      ```

   1. プロンプトが表示されたら、認証情報を置き換えます。**Enter** を押すことによって、**[Default region name]** (デフォルトリージョン名) と **[Default output format]** (デフォルト出力形式) をそのままにしておくことができます。

      ```
      AWS Access Key ID [****************YT2H]: XYXYXYXYX
      AWS Secret Access Key [****************9plH]: XYXYXYXYX
      Default region name [us-west-2]: 
      Default output format [json]:
      ```

1. 次のコマンドを入力して Raspberry Pi をシャットダウンします。

   ```
   sudo shutdown -h 0
   ```

1. Raspberry Pi が完全にシャットダウンしたら、電源コネクタを取り外します。

1. デバイスから microSD カードを取り外します。

1. ローカルホストコンピュータで、次の操作を行います。

   1. microSD カードを挿入します。

   1. SD カードイメージングツールを使用して、microSD カードのイメージをファイルに保存します。

   1. microSD カードのイメージを保存したら、ローカルホストコンピュータからカードを取り出します。

1. Raspberry Pi の電源を切断した状態で、microSD カードを Raspberry Pi に挿入します。

1. デバイスに電源を入れます。

1. 約 1 分後、ローカルホストコンピュータで、ターミナルウィンドウセッションを再起動し、デバイスにログインします。

   **まだ AWS アカウント 認証情報を再入力しないでください。**

Raspberry Pi を再起動してログインしたら、[チュートリアル: AWS IoT Device Client のインストールと設定](iot-dc-install-dc.md) に進む準備が整います。

# チュートリアル: AWS IoT Device Client のインストールと設定
<a name="iot-dc-install-dc"></a>

このチュートリアルでは、 AWS IoT Device Client のインストールと設定、およびこのデモやその他のデモで使用する AWS IoT リソースの作成について説明します。

**このチュートリアルを開始するには、以下を行います。**
+ [前のチュートリアル](iot-dc-prepare-device.md)でローカルホストコンピュータと Raspberry Pi が使用できるようにしておく。

このチュートリアルの完了には最大 90 分かかる場合があります。

**このトピックが終了したら、次の状態になります。**
+ IoT デバイスは、他の AWS IoT Device Client デモで使用できるようになります。
+ IoT デバイスをプロビジョニングします AWS IoT Core。
+ デバイスに AWS IoT Device Client をダウンロードしてインストールします。
+ デバイスの microSD カードのイメージが保存され、以降のチュートリアルで使用できるようになっています。

**必要な機器:**
+ [前のセクション](iot-dc-prepare-device-test.md)で準備したローカルでの開発およびテスト環境
+ [前のセクション](iot-dc-prepare-device-test.md)で使用した Raspberry Pi
+ [前のセクション](iot-dc-prepare-device-test.md)で使用した Raspberry Pi の microSD メモリカード

**Topics**
+ [AWS IoT Device Client をダウンロードして保存する](iot-dc-install-download.md)
+ [で Raspberry Pi をプロビジョニングする AWS IoT](iot-dc-install-provision.md)
+ [接続をテストするように AWS IoT Device Client を設定する](iot-dc-install-configure.md)

# AWS IoT Device Client をダウンロードして保存する
<a name="iot-dc-install-download"></a>

このセクションの手順では、 AWS IoT Device Client をダウンロードしてコンパイルし、Raspberry Pi にインストールします。インストールをテストした後、Raspberry Pi の microSD カードのイメージを保存して、後でチュートリアルをもう一度試すときに使用できます。

**Topics**
+ [AWS IoT Device Client をダウンロードして構築する](#iot-dc-install-dc-download)
+ [チュートリアルで使用するディレクトリを作成する](#iot-dc-install-dc-files)
+ [(オプション) microSD カードイメージを保存する](#iot-dc-install-dc-save)

## AWS IoT Device Client をダウンロードして構築する
<a name="iot-dc-install-dc-download"></a>

この手順では、 AWS IoT デバイスクライアントを Raspberry Pi にインストールします。

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次のコマンドを実行します。

**Raspberry Pi に AWS IoT Device Client をインストールするには**

1. これらのコマンドを入力して、Raspberry Pi で AWS IoT Device Client をダウンロードして構築します。

   ```
   cd ~
   git clone https://github.com/awslabs/aws-iot-device-client aws-iot-device-client
   mkdir ~/aws-iot-device-client/build && cd ~/aws-iot-device-client/build
   cmake ../
   ```

1.  AWS IoT Device Client を構築するには、このコマンドを実行します。このコマンドは完了までに、最大で 15 分かかります。

   ```
   cmake --build . --target aws-iot-device-client
   ```

    AWS IoT Device Client のコンパイルとして表示される警告メッセージは無視できます。

   これらのチュートリアルは**gcc**、2021 年 10 月 30 日バージョンの Raspberry Pi OS (ブルズアイ) の 、バージョン (Raspbian 10.2.1-6\$1rpi1) 10.2.1 20210110、2021 年 5 月 7 日バージョンの Raspberry Pi OS (バスター) の **gcc**、バージョン (Raspbian 8.3.0-6\$1rpi1) 8.3.0 上に構築された AWS IoT Device Client でテストされています。

1.  AWS IoT Device Client の構築が完了したら、このコマンドを実行してテストします。

   ```
   ./aws-iot-device-client --help
   ```

 AWS IoT Device Client のコマンドラインヘルプが表示された場合は、 AWS IoT Device Client が正常に構築され、使用できるようになります。

## チュートリアルで使用するディレクトリを作成する
<a name="iot-dc-install-dc-files"></a>

この手順では、このラーニングパスのチュートリアルで使用されるファイルを保存するために使用されるディレクトリを Raspberry Pi 上に作成します。

**このラーニングパスのチュートリアルで使用されるディレクトリを作成するには、次の手順を実行します。**

1. 次のコマンドを実行して、必要なディレクトリを作成します。

   ```
   mkdir ~/dc-configs
   mkdir ~/policies
   mkdir ~/messages
   mkdir ~/certs/testconn
   mkdir ~/certs/pubsub
   mkdir ~/certs/jobs
   ```

1. 次のコマンドを実行して、新しいディレクトリに対するアクセス許可を設定します。

   ```
   chmod 745 ~
   chmod 700 ~/certs/testconn
   chmod 700 ~/certs/pubsub
   chmod 700 ~/certs/jobs
   ```

これらのディレクトリを作成してアクセス許可を設定したら、[(オプション) microSD カードイメージを保存する](#iot-dc-install-dc-save) に進みます。

## (オプション) microSD カードイメージを保存する
<a name="iot-dc-install-dc-save"></a>

この時点で、Raspberry Pi の microSD カードには、更新された OS、基本的なアプリケーションソフトウェア、および AWS IoT Device Client があります。

これらの演習とチュートリアルをもう一度試してみたい場合は、この手順で保存した microSD カードのイメージを新しい microSD カードに書き込み、前の手順をスキップして、[で Raspberry Pi をプロビジョニングする AWS IoT](iot-dc-install-provision.md) からチュートリアルを続けることができます。

**microSD カードのイメージをファイルに保存するには、次の手順を実行します。**

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

1.  AWS アカウント 認証情報が保存されていないことを確認します。

   1. 次のコマンドを使用して、 AWS アプリの設定を実行します。

      ```
      aws configure
      ```

   1. 認証情報が保存されている場合 (プロンプトに表示されている場合)、以下に示すようにプロンプトが表示されたら、文字列 **XYXYXYXYX** を入力します。**[Default region name]** (デフォルトリージョン名) と **[Default output format]** (デフォルト出力形式) はブランクのままにしておきます。

      ```
      AWS Access Key ID [****************YXYX]: XYXYXYXYX
      AWS Secret Access Key [****************YXYX]: XYXYXYXYX
      Default region name: 
      Default output format:
      ```

1. 次のコマンドを入力して、Raspberry Pi をシャットダウンします。

   ```
   sudo shutdown -h 0
   ```

1. Raspberry Pi が完全にシャットダウンしたら、電源コネクタを取り外します。

1. デバイスから microSD カードを取り外します。

1. ローカルホストコンピュータで、次の操作を行います。

   1. microSD カードを挿入します。

   1. SD カードイメージングツールを使用して、microSD カードのイメージをファイルに保存します。

   1. microSD カードのイメージを保存したら、ローカルホストコンピュータからカードを取り出します。

この microSD は [で Raspberry Pi をプロビジョニングする AWS IoT](iot-dc-install-provision.md) で引き続き使用できます。

# で Raspberry Pi をプロビジョニングする AWS IoT
<a name="iot-dc-install-provision"></a>

このセクションの手順は、 と AWS IoT Device Client AWS CLI がインストールされている保存された microSD イメージから開始し、Raspberry Pi をプロビジョニングする AWS IoT リソースとデバイス証明書を作成します AWS IoT。

## Raspberry Pi に microSD カードをインストールします。
<a name="iot-dc-install-dc-restore"></a>

この手順では、必要なソフトウェアを Raspberry Pi にロードして設定した microSD カードをインストールし、このラーニングパスのチュートリアルを続行 AWS アカウント できるように を設定します。

このラーニングパスの演習とチュートリアルに必要なソフトウェアが格納されている [(オプション) microSD カードイメージを保存する](iot-dc-install-download.md#iot-dc-install-dc-save) で作成した microSD カードを使用します。

**Raspberry Pi に microSD カードをインストールするには**

1. Raspberry Pi の電源を切断した状態で、microSD カードを Raspberry Pi に挿入します。

1. Raspberry Pi の電源を入れます。

1. 約 1 分後、ローカルホストコンピュータで、ターミナルウィンドウセッションを再起動し、Raspberry Pi にログインします。

1. ローカルホストコンピュータのターミナルウィンドウで、**[Access Key ID]** (アクセスキー ID) と **[Secret Access Key]** (シークレットアクセスキー) を使用して、Raspberry Pi の認証情報に次の操作を行います。

   1. 次のコマンドを使用して、 AWS アプリの設定を実行します。

      ```
      aws configure
      ```

   1. プロンプトが表示されたら、 AWS アカウント 認証情報と設定情報を入力します。

      ```
      AWS Access Key ID [****************YXYX]: your Access Key ID
      AWS Secret Access Key [****************YXYX]: your Secret Access Key
      Default region name [us-west-2]: your AWS リージョン code
      Default output format [json]: json
      ```

 AWS アカウント 認証情報を復元したら、 に進む準備が整います[でデバイスをプロビジョニングする AWS IoT Core](#iot-dc-install-dc-provision)。

## でデバイスをプロビジョニングする AWS IoT Core
<a name="iot-dc-install-dc-provision"></a>

このセクションの手順では、Raspberry Pi をプロビジョニングする AWS IoT リソースを作成します AWS IoT。これらのリソースを作成する際には、さまざまな情報を記録するように求められます。この情報は、次の手順の AWS IoT Device Client 設定で使用されます。

Raspberry Pi を操作するには AWS IoT、プロビジョニングする必要があります。プロビジョニングは、Raspberry Pi を IoT デバイスとしてサポートするために必要な AWS IoT リソースを作成および設定するプロセスです。

Raspberry Pi の電源を入れて再起動したら、ローカルホストコンピュータのターミナルウィンドウを Raspberry Pi に接続し、以下の手順を完了します。

**Topics**
+ [デバイス証明書ファイルを作成およびダウンロードする](#iot-dc-install-dc-provision-certs)
+ [AWS IoT リソースの作成](#iot-dc-install-dc-provision-resources)

### デバイス証明書ファイルを作成およびダウンロードする
<a name="iot-dc-install-dc-provision-certs"></a>

この手順では、このデモのデバイス証明書ファイルが作成されます。

**Raspberry Pi のデバイス証明書ファイルを作成してダウンロードするには**

1. ローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力して、デバイスのデバイス証明書ファイルを作成します。

   ```
   mkdir ~/certs/testconn
   aws iot create-keys-and-certificate \
   --set-as-active \
   --certificate-pem-outfile "~/certs/testconn/device.pem.crt" \
   --public-key-outfile "~/certs/testconn/public.pem.key" \
   --private-key-outfile "~/certs/testconn/private.pem.key"
   ```

   このコマンドでは次のようなレスポンスが返されます。後で使用できるように、`certificateArn` の値を記録しておきます。

   ```
   {
       "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
       "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
       "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
       "keyPair": {
           "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
           "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
       }
   }
   ```

1. 次のコマンドを入力して、証明書ディレクトリとそのファイルに対するアクセス許可を設定します。

   ```
   chmod 745 ~
   chmod 700 ~/certs/testconn
   chmod 644 ~/certs/testconn/*
   chmod 600 ~/certs/testconn/private.pem.key
   ```

1. 次のコマンドを実行して、証明書のディレクトリおよびファイルに対するアクセス許可を確認します。

   ```
   ls -l ~/certs/testconn
   ```

   コマンドの出力は、ファイルの日付と時刻が異なることを除いて、ここで表示されるものと同じである必要があります。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

この時点で、デバイス証明書ファイルが Raspberry Pi にインストールされており、[AWS IoT リソースの作成](#iot-dc-install-dc-provision-resources) に進むことができます。

### AWS IoT リソースの作成
<a name="iot-dc-install-dc-provision-resources"></a>

この手順では、デバイスが AWS IoT の機能やサービスにアクセスするために必要なリソース AWS IoT を作成して、 でデバイスをプロビジョニングします。

**でデバイスをプロビジョニングするには AWS IoT**

1. ローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力して、 AWS アカウントのデバイスデータエンドポイントのアドレスを取得します。

   ```
   aws iot describe-endpoint --endpoint-type IoT:Data-ATS
   ```

   これまでの手順で入力したコマンドでは次のようなレスポンスが返されます。後で使用できるように、`endpointAddress` の値を記録しておきます。

   ```
   {
       "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. このコマンドを入力して、Raspberry Pi の AWS IoT モノのリソースを作成します。

   ```
   aws iot create-thing --thing-name "DevCliTestThing"
   ```

    AWS IoT モノのリソースが作成された場合、コマンドはこのようなレスポンスを返します。

   ```
   {
       "thingName": "DevCliTestThing",
       "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/DevCliTestThing",
       "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. ターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ポリシードキュメントをコピーして、開いているテキストエディタに貼り付けます。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish",
                      "iot:Subscribe",
                      "iot:Receive",
                      "iot:Connect"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```
**注記**  
このポリシードキュメントでは、すべてのリソースに対する接続、受信、発行、およびサブスクリプションを許可するという広範なアクセス許可が付与されます。通常、ポリシーは、特定のアクションを実行するアクセス許可を特定のリソースのみに付与します。ただし、最初のデバイス接続テストでは、このテスト中のアクセス問題の可能性を最小限に抑えるために、この過度に一般的で広範なアクセス許可を付与するポリシーが使用されます。以降のチュートリアルでは、より狭い範囲のポリシードキュメントを使用して、ポリシー設計のより良いプラクティスを示します。

   1. テキストエディタのファイルを **\$1/policies/dev\$1cli\$1test\$1thing\$1policy.json** として保存します。

1. 前のステップのポリシードキュメントを使用して AWS IoT ポリシーを作成するには、このコマンドを実行します。

   ```
   aws iot create-policy \
   --policy-name "DevCliTestThingPolicy" \
   --policy-document "file://~/policies/dev_cli_test_thing_policy.json"
   ```

   ポリシーが作成されると、コマンドは次のようなレスポンスを返します。

   ```
   {
       "policyName": "DevCliTestThingPolicy",
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/DevCliTestThingPolicy",
       "policyDocument": "{\n    \"Version\": \"2012-10-17\",		 	 	 \n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"iot:Publish\",\n                \"iot:Subscribe\",\n                \"iot:Receive\",\n                \"iot:Connect\"\n            ],\n            \"Resource\": [\n                \"*\"\n            ]\n        }\n    ]\n}\n",
       "policyVersionId": "1"
   }
   ```

1. 次のコマンドを実行して、ポリシーをデバイス証明書にアタッチします。`certificateArn` を以前に保存した `certificateArn` の値に置き換えます。

   ```
   aws iot attach-policy \
   --policy-name "DevCliTestThingPolicy" \
   --target "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

1. このコマンドを実行して、デバイス証明書を AWS IoT モノのリソースにアタッチします。`certificateArn` を以前に保存した `certificateArn` の値に置き換えます。

   ```
   aws iot attach-thing-principal \
   --thing-name "DevCliTestThing" \
   --principal "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

でデバイスを正常にプロビジョニングしたら AWS IoT、 に進む準備が整います[接続をテストするように AWS IoT Device Client を設定する](iot-dc-install-configure.md)。

# 接続をテストするように AWS IoT Device Client を設定する
<a name="iot-dc-install-configure"></a>

このセクションの手順では、Raspberry Pi から MQTT メッセージを発行するように AWS IoT Device Client を設定します。

**Topics**
+ [設定ファイルを作成する](#iot-dc-install-dc-configure-step1)
+ [MQTT テストクライアントを開く](#iot-dc-install-dc-configure-step2)
+ [AWS IoT Device Client を実行する](#iot-dc-install-dc-configure-step3)

## 設定ファイルを作成する
<a name="iot-dc-install-dc-configure-step1"></a>

この手順では、 AWS IoT Device Client をテストするための設定ファイルを作成します。

**AWS IoT Device Client をテストする設定ファイルを作成するには**
+ Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

  1. 次のコマンドを入力して、設定ファイルのディレクトリを作成し、ディレクトリに対するアクセス許可を設定します。

     ```
     mkdir ~/dc-configs
     chmod 745 ~/dc-configs
     ```

  1. `nano` などのテキストエディタを開きます。

  1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。

     ```
     {
       "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
       "cert": "~/certs/testconn/device.pem.crt",
       "key": "~/certs/testconn/private.pem.key",
       "root-ca": "~/certs/AmazonRootCA1.pem",
       "thing-name": "DevCliTestThing",
       "logging": {
         "enable-sdk-logging": true,
         "level": "DEBUG",
         "type": "STDOUT",
         "file": ""
       },
       "jobs": {
         "enabled": false,
         "handler-directory": ""
       },
       "tunneling": {
         "enabled": false
       },
       "device-defender": {
         "enabled": false,
         "interval": 300
       },
       "fleet-provisioning": {
         "enabled": false,
         "template-name": "",
         "template-parameters": "",
         "csr-file": "",
         "device-key": ""
       },
       "samples": {
         "pub-sub": {
           "enabled": true,
           "publish-topic": "test/dc/pubtopic",
           "publish-file": "",
           "subscribe-topic": "test/dc/subtopic",
           "subscribe-file": ""
         }
       },
       "config-shadow": {
         "enabled": false
       },
       "sample-shadow": {
         "enabled": false,
         "shadow-name": "",
         "shadow-input-file": "",
         "shadow-output-file": ""
       }
     }
     ```

  1. *エンドポイント*値を、「」で見つけ AWS アカウント た のデバイスデータエンドポイントに置き換えます[でデバイスをプロビジョニングする AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

  1. テキストエディタのファイルを **\$1/dc-configs/dc-testconn-config.json** として保存します。

  1. 次のコマンドを実行して、新しい設定ファイルでアクセス許可を設定します。

     ```
     chmod 644 ~/dc-configs/dc-testconn-config.json
     ```

ファイルを保存すると、[MQTT テストクライアントを開く](#iot-dc-install-dc-configure-step2) に進む準備が整います。

## MQTT テストクライアントを開く
<a name="iot-dc-install-dc-configure-step2"></a>

この手順では、 AWS IoT デバイス**クライアントが実行時に発行する MQTT メッセージにサブスクライブするように、コンソールで MQTT テスト**クライアントを準備します。 AWS IoT 

****[MQTT test client]** (MQTT テストクライアント) を準備してすべての MQTT メッセージをサブスクライブするには**

1. ローカルホストコンピュータの [AWS IoT コンソール](https://console.aws.amazon.com//iot/home#/test)で、**[MQTT test client]** (MQTT テストクライアント) を選択します。

1. **[トピックへサブスクライブする]** タブの **[トピックのフィルター]** に **\$1** (ハッシュ記号) を入力し、**[サブスクライブ]** をクリックして すべての MQTT トピックをサブスクライブします。

1. **[Subscriptions]** (サブスクリプション) ラベルの下に、「**\$1**」(単一の \$1 記号) が表示されることを確認します。

ウィンドウで **[MQTT test client]** (MQTT テストクライアント) を開いたままにして、[AWS IoT Device Client を実行する](#iot-dc-install-dc-configure-step3) に進みます。

## AWS IoT Device Client を実行する
<a name="iot-dc-install-dc-configure-step3"></a>

この手順では、 AWS IoT Device Client を実行して、MQTT **テストクライアントが受信して表示する単一の MQTT** メッセージを発行します。

**AWS IoT Device Client から MQTT メッセージを送信するには**

1. この手順を実行する際に、Raspberry Pi に接続されているターミナルウィンドウと、**[MQTT test client]** (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。

1. ターミナルウィンドウで、これらのコマンドを入力して、 で作成された設定ファイルを使用して AWS IoT Device Client を実行します[設定ファイルを作成する](#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-testconn-config.json
   ```

   ターミナルウィンドウに、 AWS IoT Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、**[MQTT test client]** (MQTT テストクライアント) を確認します。

1. **[MQTT test client]** (MQTT テストクライアント) の [Subscriptions] (サブスクリプション) ウィンドウで、`test/dc/pubtopic` メッセージトピックに送信された「*Hello World\$1*」メッセージを確認します。

1.  AWS IoT Device Client にエラーが表示されず、**MQTT テストクライアントの**`test/dc/pubtopic`メッセージに *Hello World\$1* が送信されたことがわかった場合、接続は成功しています。

1. ターミナルウィンドウで、 **^C** (Ctrl-C) と入力して AWS IoT Device Client を停止します。

 AWS IoT Device Client が Raspberry Pi で正しく実行され、 と通信できることを実証したら AWS IoT、 に進むことができます[チュートリアル: AWS IoT Device Client との MQTT メッセージ通信のデモンストレーション](iot-dc-testconn.md)。

# チュートリアル: AWS IoT Device Client との MQTT メッセージ通信のデモンストレーション
<a name="iot-dc-testconn"></a>

このチュートリアルでは、 AWS IoT デバイスクライアントが IoT ソリューションで一般的に使用される MQTT メッセージをサブスクライブして発行する方法を示します。

**このチュートリアルを開始するには、以下を行います。**
+ ローカルホストコンピュータと Raspberry Pi は、[前のセクション](iot-dc-install-dc.md)で使用したのと同じ設定にします。

   AWS IoT Device Client のインストール後に microSD カードイメージを保存した場合は、Raspberry Pi でそのイメージに microSD カードを使用できます。
+ このデモを以前に実行したことがある場合は、リソースエラーが重複しないように[ステップ 2: AWS IoT Device Client でデモを構築 AWS アカウント した後で をクリーンアップする](iot-dc-cleanup.md#iot-dc-cleanup-cloud)、 AWS IoT 「」を参照して、以前の実行で作成したすべてのリソースを削除します。

このチュートリアルの完了には 45 分ほどかかります。

**このトピックが終了したら、次の状態になります。**
+ IoT デバイスが から MQTT メッセージをサブスクライブ AWS IoT し、MQTT メッセージをパブリッシュする方法はさまざまです AWS IoT。

**必要な機器:**
+ [前のセクション](iot-dc-install-dc.md)で準備したローカルでの開発およびテスト環境
+ [前のセクション](iot-dc-install-dc.md)で使用した Raspberry Pi
+ [前のセクション](iot-dc-install-dc.md)で使用した Raspberry Pi の microSD メモリカード

**Topics**
+ [Raspberry Pi を準備して MQTT メッセージ通信のデモンストレーションをする](iot-dc-testconn-provision.md)
+ [AWS IoT Device Client を使用したメッセージの発行のデモンストレーション](iot-dc-testconn-publish.md)
+ [AWS IoT Device Client を使用したメッセージのサブスクライブのデモンストレーション](iot-dc-testconn-subscribe.md)

# Raspberry Pi を準備して MQTT メッセージ通信のデモンストレーションをする
<a name="iot-dc-testconn-provision"></a>

この手順では、 AWS IoT と Raspberry Pi にリソースを作成し、 AWS IoT Device Client を使用した MQTT メッセージ通信を示します。

**Topics**
+ [MQTT 通信をデモンストレーションするための証明書ファイルを作成する](#iot-dc-testconn-provision-certs)
+ [MQTT 通信をデモンストレーションするためにデバイスをプロビジョニングする](#iot-dc-testconn-provision-aws)
+ [MQTT 通信を示すように AWS IoT Device Client 設定ファイルと MQTT テストクライアントを設定する](#iot-dc-testconn-provision-dc-config)

## MQTT 通信をデモンストレーションするための証明書ファイルを作成する
<a name="iot-dc-testconn-provision-certs"></a>

この手順では、このデモのデバイス証明書ファイルが作成されます。

**Raspberry Pi のデバイス証明書ファイルを作成してダウンロードするには**



1. ローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力して、デバイスのデバイス証明書ファイルを作成します。

   ```
   mkdir ~/certs/pubsub
   aws iot create-keys-and-certificate \
   --set-as-active \
   --certificate-pem-outfile "~/certs/pubsub/device.pem.crt" \
   --public-key-outfile "~/certs/pubsub/public.pem.key" \
   --private-key-outfile "~/certs/pubsub/private.pem.key"
   ```

   このコマンドでは次のようなレスポンスが返されます。後で使用するために `certificateArn` の値を保存します。

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. 次のコマンドを入力して、証明書ディレクトリとそのファイルに対するアクセス許可を設定します。

   ```
   chmod 700 ~/certs/pubsub
   chmod 644 ~/certs/pubsub/*
   chmod 600 ~/certs/pubsub/private.pem.key
   ```

1. 次のコマンドを実行して、証明書のディレクトリおよびファイルに対するアクセス許可を確認します。

   ```
   ls -l ~/certs/pubsub
   ```

   コマンドの出力は、ファイルの日付と時刻が異なることを除いて、ここで表示されるものと同じである必要があります。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

1. 次のコマンドを入力して、ログファイルのディレクトリを作成します。

   ```
   mkdir ~/.aws-iot-device-client
   mkdir ~/.aws-iot-device-client/log
   chmod 745 ~/.aws-iot-device-client/log
   echo " " > ~/.aws-iot-device-client/log/aws-iot-device-client.log
   echo " " > ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   chmod 600 ~/.aws-iot-device-client/log/*
   ```

## MQTT 通信をデモンストレーションするためにデバイスをプロビジョニングする
<a name="iot-dc-testconn-provision-aws"></a>

このセクションでは、 で Raspberry Pi をプロビジョニングする AWS IoT リソースを作成します AWS IoT。

**AWS IoTでデバイスをプロビジョニングするには:**

1. ローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力して、 AWS アカウントのデバイスデータエンドポイントのアドレスを取得します。

   ```
   aws iot describe-endpoint --endpoint-type IoT:Data-ATS
   ```

   エンドポイントの値は、前のチュートリアルでこのコマンドを実行してから変更されていません。ここでコマンドを再度実行すると、このチュートリアルで使用する設定ファイルにデータエンドポイントの値を簡単に検索して貼り付けることができるようになります。

   これまでの手順で入力したコマンドでは次のようなレスポンスが返されます。後で使用できるように、`endpointAddress` の値を記録しておきます。

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. このコマンドを入力して、Raspberry Pi の新しい AWS IoT モノのリソースを作成します。

   ```
   aws iot create-thing --thing-name "PubSubTestThing"
   ```

    AWS IoT モノのリソースはクラウド内のデバイスの*仮想*表現であるため、 で複数のモノのリソースを作成して AWS IoT 、さまざまな目的に使用できます。これらすべてを同じ物理 IoT デバイスで使用して、デバイスのさまざまな側面を表すことができます。

   このチュートリアルでは、Raspberry Pi を表すために一度に 1 つのモノのリソースのみを使用します。このように、これらのチュートリアルでは、デモの AWS IoT リソースを作成した後、それぞれに特別に作成したリソースを使用してデモに戻って繰り返すことができるように、さまざまなデモを表します。

    AWS IoT モノのリソースが作成された場合、コマンドはこのようなレスポンスを返します。

   ```
   {
   "thingName": "PubSubTestThing",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/PubSubTestThing",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. ターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/PubSubTestThing"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic"
                  ]
              }
          ]
      }
      ```

   1. エディタで、ポリシードキュメントの各`Resource`セクションで、*us-west-2:57EXAMPLE833* を 、コロン文字 (:) AWS リージョン、および 12 桁の AWS アカウント 数字に置き換えます。

   1. テキストエディタのファイルを **\$1/policies/pubsub\$1test\$1thing\$1policy.json** として保存します。

1. このコマンドを実行して、前のステップのポリシードキュメントを使用して AWS IoT ポリシーを作成します。

   ```
   aws iot create-policy \
   --policy-name "PubSubTestThingPolicy" \
   --policy-document "file://~/policies/pubsub_test_thing_policy.json"
   ```

   ポリシーが作成されると、コマンドは次のようなレスポンスを返します。

   ```
   {
                                       "policyName": "PubSubTestThingPolicy",
                                       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
                                       "policyDocument": "{\n\"Version\": \"2012-10-17\",		 	 	 \n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
                                       "policyVersionId": "1"
                                       }
   ```

1. 次のコマンドを実行して、ポリシーをデバイス証明書にアタッチします。`certificateArn` を、このセクション内で前に保存した `certificateArn` 値に置き換えます。

   ```
   aws iot attach-policy \
   --policy-name "PubSubTestThingPolicy" \
   --target "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

1. 次のコマンドを実行して、デバイス証明書を AWS IoT のモノのリソースにアタッチします。`certificateArn` を、このセクション内で前に保存した `certificateArn` 値に置き換えます。

   ```
   aws iot attach-thing-principal \
   --thing-name "PubSubTestThing" \
   --principal "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

でデバイスを正常にプロビジョニングしたら AWS IoT、 に進む準備が整います[MQTT 通信を示すように AWS IoT Device Client 設定ファイルと MQTT テストクライアントを設定する](#iot-dc-testconn-provision-dc-config)。

## MQTT 通信を示すように AWS IoT Device Client 設定ファイルと MQTT テストクライアントを設定する
<a name="iot-dc-testconn-provision-dc-config"></a>

この手順では、 AWS IoT Device Client をテストするための設定ファイルを作成します。

**AWS IoT Device Client をテストする設定ファイルを作成するには**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/pubsub/device.pem.crt",
        "key": "~/certs/pubsub/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "PubSubTestThing",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": false,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": true,
            "publish-topic": "test/dc/pubtopic",
            "publish-file": "",
            "subscribe-topic": "test/dc/subtopic",
            "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. *エンドポイント*値を、「」で見つけ AWS アカウント た のデバイスデータエンドポイントに置き換えます[でデバイスをプロビジョニングする AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

   1. テキストエディタのファイルを **\$1/dc-configs/dc-pubsub-config.json** として保存します。

   1. 次のコマンドを実行して、新しい設定ファイルでアクセス許可を設定します。

      ```
      chmod 644 ~/dc-configs/dc-pubsub-config.json
      ```

1. **[MQTT test client]** (MQTT テストクライアント) を準備して、すべての MQTT メッセージをサブスクライブするには、次の手順を行います。

   1. ローカルホストコンピュータの [AWS IoT コンソール](https://console.aws.amazon.com//iot/home#/test)で、**[MQTT test client]** (MQTT テストクライアント) を選択します。

   1. **[Subscribe to a topic]** (トピックをサブスクライブする) タブの **[Topic filter]** (トピックのフィルター) に「**\$1**」(単一の \$1 記号) を入力し、**[Subscribe]** (サブスクライブ) をクリックします。

   1. **[Subscriptions]** (サブスクリプション) ラベルの下に、「**\$1**」(単一の \$1 記号) が表示されることを確認します。

   このチュートリアルを進めている間は、ウィンドウで **[MQTT test client]** (MQTT テストクライアント) を開いたままにします。

ファイルを保存し、**[MQTT test client]** (MQTT テストクライアント) を設定したら、[AWS IoT Device Client を使用したメッセージの発行のデモンストレーション](iot-dc-testconn-publish.md) に進む準備が整いました。

# AWS IoT Device Client を使用したメッセージの発行のデモンストレーション
<a name="iot-dc-testconn-publish"></a>

このセクションの手順では、 AWS IoT Device Client がデフォルトおよびカスタム MQTT メッセージを送信する方法を示します。

前のステップでこれらの演習用に作成したポリシー内のポリシーステートメントでは、以下のアクションを実行するアクセス許可が Raspberry Pi に付与されます。
+ 

**`iot:Connect`**  
Device Client を実行`PubSubTestThing`している Raspberry Pi である という名前の AWS IoT クライアントに接続を許可します。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Connect"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing"
        ]
      }
  ```
+ 

**`iot:Publish`**  
Raspberry Pi に MQTT トピック `test/dc/pubtopic` でメッセージを発行するアクセス許可を付与します。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Publish"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic"
        ]
      }
  ```

  `iot:Publish` アクションで、リソース配列にリストされている MQTT トピックに発行するアクセス許可が付与されます。これらのメッセージの*内容*は、ポリシーステートメントによって制御されません。

## AWS IoT Device Client を使用してデフォルトのメッセージを発行する
<a name="iot-dc-testconn-publish-default"></a>

この手順では、 AWS IoT Device Client を実行して、MQTT **テストクライアントが受信して表示する単一のデフォルトの MQTT** メッセージを発行します。

**AWS IoT Device Client からデフォルトの MQTT メッセージを送信するには**

1. この手順を実行する際に、Raspberry Pi に接続されている、ローカルホストコンピュータ上のターミナルウィンドウと、**[MQTT test client]** (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。

1. ターミナルウィンドウで、これらのコマンドを入力して、 で作成された設定ファイルを使用して AWS IoT Device Client を実行します[設定ファイルを作成する](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-config.json
   ```

   ターミナルウィンドウに、 AWS IoT Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、**[MQTT test client]** (MQTT テストクライアント) を確認します。

1. **[MQTT テストクライアント]** の **[サブスクリプション]** ウィンドウで、`test/dc/pubtopic` メッセージトピックに送信された「*Hello World\$1*」メッセージを確認します。

1.  AWS IoT Device Client にエラーが表示されず、**MQTT テストクライアントの**`test/dc/pubtopic`メッセージに *Hello World\$1* が送信されたと表示される場合は、接続が成功したことを示しています。

1. ターミナルウィンドウで、 **^C** (Ctrl-C) と入力して AWS IoT Device Client を停止します。

 AWS IoT Device Client がデフォルトの MQTT メッセージを発行したことを証明したら、 に進むことができます[AWS IoT Device Client を使用してカスタムメッセージを発行する](#iot-dc-testconn-publish-custom)。

## AWS IoT Device Client を使用してカスタムメッセージを発行する
<a name="iot-dc-testconn-publish-custom"></a>

このセクションの手順では、カスタム MQTT メッセージを作成し、 AWS IoT Device Client を実行して、カスタム MQTT メッセージを 1 回発行させて、**[MQTT test client]** (MQTT テストクライアント) が受信して表示するようにします。

### AWS IoT Device Client のカスタム MQTT メッセージを作成する
<a name="iot-dc-testconn-publish-custom-create"></a>

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の手順を実行します。

**AWS IoT Device Client が発行するカスタムメッセージを作成するには**

1. ターミナルウィンドウで、`nano` などのテキストエディタを開きます。

1. テキストエディタに次の JSON ドキュメントをコピーして貼り付けます。これは、 AWS IoT Device Client が発行する MQTT メッセージペイロードです。

   ```
   {
     "temperature": 28,
     "humidity": 80,
     "barometer": 1013,
     "wind": {
       "velocity": 22,
       "bearing": 255
     }
   }
   ```

1. テキストエディタの内容を **\$1/messages/sample-ws-message.json** として保存します。

1. 次のコマンドを入力して、作成したメッセージファイルのアクセス許可を設定します。

   ```
   chmod 600 ~/messages/*
   ```

**Device AWS IoT Client がカスタムメッセージを送信するために使用する設定ファイルを作成するには**

1. ターミナルウィンドウで、 などのテキストエディタで`nano`、既存の AWS IoT Device Client 設定ファイル を開きます**\$1/dc-configs/dc-pubsub-config.json**。

1. `samples` オブジェクトが次のようになるように編集します。このファイルの他の部分を変更する必要はありません。

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/subtopic",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

1. テキストエディタの内容を **\$1/dc-configs/dc-pubsub-custom-config.json** として保存します。

1. 次のコマンドを実行して、新しい設定ファイルでアクセス許可を設定します。

   ```
   chmod 644 ~/dc-configs/dc-pubsub-custom-config.json
   ```

### AWS IoT Device Client を使用してカスタム MQTT メッセージを発行する
<a name="iot-dc-testconn-publish-custom-publish"></a>

この変更は、MQTT メッセージペイロードの*内容*のみに影響するので、現在のポリシーは引き続き機能します。ただし、*MQTT トピック* (`~/dc-configs/dc-pubsub-custom-config.json` の `publish-topic` 値で定義されたもの) が変更されている場合、Raspberry Pi が新しい MQTT トピックに発行できるように `iot::Publish` ポリシーステートメントも変更する必要があります。

**AWS IoT Device Client から MQTT メッセージを送信するには**

1. この手順を実行する際に、ターミナルウィンドウと、**[MQTT test client]** (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。また、**[MQTT test client]** (MQTT テストクライアント) のサブスクリプションが、引き続き**[\$1]** トピックフィルターであることを確認してください。そうでない場合は、**[\$1]** トピックフィルターのサブスクリプションに戻します。

1. ターミナルウィンドウで次のコマンドを入力して、[設定ファイルを作成する](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1) で作成した設定ファイルを使用する AWS IoT Device Client を実行します。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   ターミナルウィンドウに、 AWS IoT Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、[MQTT test client] (MQTT テストクライアント) を確認します。

1. **[MQTT test client]** (MQTT テストクライアント) の **[Subscriptions]** (サブスクリプション) ウィンドウで、`test/dc/pubtopic` メッセージトピックに送信されたカスタムメッセージペイロードを確認します。

1.  AWS IoT Device Client にエラーが表示されず、**MQTT テストクライアントの**`test/dc/pubtopic`メッセージに発行したカスタムメッセージペイロードが表示された場合は、カスタムメッセージが正常に発行されました。

1. ターミナルウィンドウで、 **^C** (Ctrl-C) と入力して AWS IoT Device Client を停止します。

 AWS IoT Device Client がカスタムメッセージペイロードを発行したことを証明したら、 に進むことができます[AWS IoT Device Client を使用したメッセージのサブスクライブのデモンストレーション](iot-dc-testconn-subscribe.md)。

# AWS IoT Device Client を使用したメッセージのサブスクライブのデモンストレーション
<a name="iot-dc-testconn-subscribe"></a>

このセクションでは、次の 2 種類のメッセージサブスクリプションについて説明します。
+ 単一トピックのサブスクリプション
+ ワイルドカードトピックのサブスクリプション

これらの演習用に作成したポリシー内のポリシーステートメントでは、以下のアクションを実行するアクセス許可が Raspberry Pi に付与されます。
+ 

**`iot:Receive`**  
`Resource` オブジェクト内の名前と一致する MQTT トピックを受信するアクセス許可を AWS IoT Device Client に付与します。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Receive"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/subtopic"
        ]
      }
  ```
+ 

**`iot:Subscribe`**  
`Resource` オブジェクト内の という名前のものに一致する MQTT トピックフィルターをサブスクライブするアクセス許可を AWS IoT Device Client に付与します。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Subscribe"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic"
        ]
      }
  ```

## 単一の MQTT メッセージトピックをサブスクライブする
<a name="iot-dc-testconn-subscribe-simple-topic"></a>

この手順では、 AWS IoT Device Client が MQTT メッセージをサブスクライブしてログに記録する方法を示します。

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、**\$1/dc-configs/dc-pubsub-custom-config.json** の内容を一覧表示するか、ファイルをテキストエディタで開き、その内容を確認します。`samples` オブジェクトを見つけます。これは次のように表示されています。

```
  "samples": {
    "pub-sub": {
      "enabled": true,
      "publish-topic": "test/dc/pubtopic",
      "publish-file": "~/messages/sample-ws-message.json",
      "subscribe-topic": "test/dc/subtopic",
      "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
```

`subscribe-topic` の値は AWS IoT Device Client が実行時にサブスクライブする MQTT トピックであることに注意します。 AWS IoT Device Client は、このサブスクリプションから受信したメッセージペイロードを `subscribe-file`値内の という名前のファイルに書き込みます。

**AWS IoT Device Client から MQTT メッセージトピックをサブスクライブするには**

1. この手順を実行する際に、ターミナルウィンドウと、[MQTT test client] (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。また、**[MQTT test client]** (MQTT テストクライアント) のサブスクリプションが、引き続き**[\$1]** トピックフィルターであることを確認してください。そうでない場合は、**[\$1]** トピックフィルターのサブスクリプションに戻します。

1. ターミナルウィンドウで、これらのコマンドを入力して、 で作成された設定ファイルを使用して AWS IoT Device Client を実行します[設定ファイルを作成する](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   ターミナルウィンドウに、 AWS IoT Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、 AWS IoT で操作を続行します。

1.  AWS IoT コンソールの **MQTT テストクライアント**で、**トピックへの発行**タブを選択します。

1. **[Topic name]** (トピック名) に **test/dc/subtopic** と入力します。

1. **[Message payload]** (メッセージペイロード) で、メッセージの内容を確認します。

1. MQTT メッセージを発行するには、**[Publish]** (発行) をクリックします。

1. ターミナルウィンドウで、 AWS IoT Device Client から*受信した次のような*エントリを確認します。

   ```
   2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
   ```

1. *メッセージが受信*されたことを示すメッセージ受信エントリが表示されたら、 **^C** (Ctrl-C) を入力して AWS IoT Device Client を停止します。

1. 次のコマンドを入力して、メッセージログファイルの末尾を表示し、**[MQTT test client]** (MQTT テストクライアント) から発行したメッセージを表示します。

   ```
   tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```

ログファイル内のメッセージを表示することで、MQTT テストクライアントから公開したメッセージを AWS IoT Device Client が受信したことを実証しました。

## ワイルドカード文字を使用して複数の MQTT メッセージトピックをサブスクライブする
<a name="iot-dc-testconn-subscribe-wild-topic"></a>

これらの手順は、 AWS IoT Device Client がワイルドカード文字を使用して MQTT メッセージをサブスクライブおよびログに記録する方法を示しています。これを行うには、次の操作を行います。

1.  AWS IoT Device Client が MQTT トピックのサブスクライブに使用するトピックフィルターを更新します。

1. デバイスが使用するポリシーを更新して、新しいサブスクリプションができるようにします。

1.  AWS IoT Device Client を実行し、MQTT テストコンソールからメッセージを発行します。

**ワイルドカード MQTT トピックフィルターを使用して複数の MQTT メッセージトピックをサブスクライブする設定ファイルを作成するには**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、**\$1/dc-configs/dc-pubsub-custom-config.json** を開いて編集し、`samples` オブジェクトを見つけます。

1. テキストエディタで、`samples` オブジェクトを見つけ、`subscribe-topic` の値を次のように更新します。

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/#",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

   新しい `subscribe-topic` の値は、最後に MQTT ワイルドカード文字が付いた [MQTT トピックフィルター](topics.md#topicfilters)です。これは、`test/dc/` で始まるすべての MQTT トピックへのサブスクリプション示しています。 AWS IoT Device Client は、このサブスクリプションから受信したメッセージペイロードを の という名前のファイルに書き込みます`subscribe-file`。

1. 変更された設定ファイルを **\$1/dc-configs/dc-pubsub-wild-config.json** として保存し、エディタを終了します。

**複数の MQTT メッセージトピックをサブスクライブして受信できるように Raspberry Pi が使用するポリシーを変更するには**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、任意のテキストエディタで **\$1/policies/pubsub\$1test\$1thing\$1policy.json** を編集するために開き、ファイル内のポリシーステートメント `iot::Subscribe` と `iot::Receive` を見つけます。

1. `iot::Subscribe` ポリシーステートメントで、Resource オブジェクトの文字列を更新して、次のように `subtopic` を `*` に置き換えます。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Subscribe"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*"
         ]
       }
   ```
**注記**  
[MQTT トピックフィルターワイルドカード文字](topics.md#topicfilters)「`+`」(プラス記号) と「`#`」(\$1 記号) です。末尾に `#` が付いたサブスクリプションリクエストは、`#` 文字の前にある文字列 (例えば、この場合「`test/dc/`」) で始まるすべてのトピックをサブスクライブします。  
ただし、このサブスクリプションを承認するポリシーステートメントのリソース値には、トピックフィルター ARN では `#` (\$1 記号) の代わりに `*` (アスタリスク) を使用する必要があります。これは、ポリシープロセッサが MQTT が使用するとは別のワイルドカード文字を使用するためです。  
ポリシーでトピックおよびトピックフィルターにワイルドカード文字を使用する方法の詳細については、「[MQTT および AWS IoT Core ポリシーでのワイルドカード文字の使用](pub-sub-policy.md#pub-sub-policy-cert)」を参照してください。

1. `iot::Receive` ポリシーステートメントで、Resource オブジェクトの文字列を更新して、次のように `subtopic` を `*` に置き換えます。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Receive"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*"
         ]
       }
   ```

1. 更新されたポリシードキュメントを **\$1/policies/pubsub\$1wild\$1test\$1thing\$1policy.json** として保存し、エディタを終了します。

1. 次のコマンドを入力して、このチュートリアルのポリシーを更新して、新しいリソース定義を使用します。

   ```
   aws iot create-policy-version \
   --set-as-default \
   --policy-name "PubSubTestThingPolicy" \
   --policy-document "file://~/policies/pubsub_wild_test_thing_policy.json"
   ```

   コマンドが成功すると、次のようなレスポンスが返されます。`policyVersionId` が `2` になったことに注意してください。これがこのポリシーの 2 番目のバージョンであることを示しています。

   ポリシーを正常に更新した場合は、次の手順に進むことができます。

   ```
   {
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
       "policyDocument": "{\n  \"Version\": \"2012-10-17\",		 	 	 \n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Connect\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Publish\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Subscribe\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Receive\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n      ]\n    }\n  ]\n}\n",
       "policyVersionId": "2",
       "isDefaultVersion": true
   }
   ```

   ポリシーバージョンが多すぎて新しいバージョンを保存できないというエラーが表示された場合は、次のコマンドを入力して、ポリシーの現在のバージョンを一覧表示します。このコマンドが返すリストを確認して、削除できるポリシーバージョンを探します。

   ```
   aws iot list-policy-versions --policy-name "PubSubTestThingPolicy"
   ```

   不要になったバージョンを削除するには、次のコマンドを入力します。デフォルトのポリシーバージョンを削除することはできません。デフォルトのポリシーバージョンは、`isDefaultVersion` の値が `true` であるものです。

   ```
   aws iot delete-policy-version \
   --policy-name "PubSubTestThingPolicy" \
   --policy-version-id policyId
   ```

   ポリシーバージョンを削除したら、このステップを再試行してください。

更新された設定ファイルとポリシーでは、 AWS IoT Device Client でワイルドカードサブスクリプションをデモンストレーションする準備が整いました。

**AWS IoT Device Client が複数の MQTT メッセージトピックをサブスクライブおよび受信する方法を示すには**

1. **[MQTT test client]** (MQTT テストクライアント) で、サブスクリプションを確認します。**[MQTT test client]** (MQTT テストクライアント) で「**\$1**」トピックフィルターがサブスクライブされていれば、次のステップに進みます。そうでない場合は、**[MQTT テストクライアント]** の **[トピックへのサブスクライブ]** タブで、**[トピックフィルター]** に **\$1**(ハッシュ記号文字) を入力し、**[サブスクライブ]** を選択してサブスクライブします。

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力して AWS IoT Device Client を起動します。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-wild-config.json
   ```

1. ローカルホストコンピュータのターミナルウィンドウで AWS IoT Device Client の出力を見ながら、**MQTT テストクライアント**に戻ります。**[Publish to a topic]** (トピックに公開する) タブで、**[Topic name]** (トピック名) に「**test/dc/subtopic**」と入力し、**[Publish]** (発行) をクリックします。

1. ターミナルウィンドウで、次のようなメッセージを検索して、メッセージが受信されたことを確認します。

   ```
   2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
   ```

1. ローカルホストコンピュータのターミナルウィンドウで AWS IoT Device Client の出力を見ながら、**MQTT テストクライアント**に戻ります。**[Publish to a topic]** (トピックに公開する) タブで、**[Topic name]** (トピック名) に「**test/dc/subtopic2**」と入力し、**[Publish]** (発行) をクリックします。

1. ターミナルウィンドウで、次のようなメッセージを検索して、メッセージが受信されたことを確認します。

   ```
   2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
   ```

1. 両方のメッセージが受信されたことを確認するメッセージが表示されたら、 **^C** (Ctrl-C) と入力して AWS IoT Device Client を停止します。

1. 次のコマンドを入力して、メッセージログファイルの末尾を表示し、**[MQTT test client]** (MQTT テストクライアント) から発行したメッセージを表示します。

   ```
   tail -n 20 ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```
**注記**  
ログファイルには、メッセージペイロードのみが含まれます。メッセージトピックは、受信したメッセージログファイルに記録されません。  
 AWS IoT Device Client によって発行されたメッセージは、受信したログに表示される場合もあります。これは、ワイルドカードトピックフィルターにそのメッセージトピックが含まれており、発行されたメッセージがサブスクライバーに送信される前にメッセージブローカーがサブスクリプションリクエストを処理することがあるためです。

ログファイルのエントリは、メッセージが受信されたことを示しています。この手順は、他のトピック名を使用して繰り返すことができます。`test/dc/` で始まるトピック名を持つメッセージはすべて受信されてログ記録されます。他の文字列で始まるトピック名のメッセージは無視されます。

 AWS IoT Device Client が MQTT メッセージを発行およびサブスクライブする方法を示したら、「」に進みます[チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション](iot-dc-runjobs.md)。

# チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション
<a name="iot-dc-runjobs"></a>

これらのチュートリアルでは、ジョブを設定して Raspberry Pi にデプロイして、IoT デバイスにリモートオペレーションを送信する方法をデモンストレーションします。

**このチュートリアルを開始するには、以下を行います。**
+ ローカルホストコンピュータ Raspberry Pi を[前のセクション](iot-dc-testconn.md)で使用したのと同様の設定してください。
+ 前のセクションのチュートリアルを完了していない場合は、 に AWS IoT Device Client をインストールした後に保存したイメージを持つ microSD カードで Raspberry Pi を使用して、このチュートリアルを試すことができます[(オプション) microSD カードイメージを保存する](iot-dc-install-download.md#iot-dc-install-dc-save)。
+ このデモを以前に実行したことがある場合は、リソースエラーが重複しないように[ステップ 2: AWS IoT Device Client でデモを構築 AWS アカウント した後で をクリーンアップする](iot-dc-cleanup.md#iot-dc-cleanup-cloud)、 AWS IoT 「」を参照して、以前の実行で作成したすべてのリソースを削除します。

このチュートリアルの完了には 45 分ほどかかります。

**このトピックが終了したら、次の状態になります。**
+ IoT デバイスが AWS IoT Core を使用して、 によって管理されるリモートオペレーションを実行するさまざまな方法を説明します AWS IoT 。

**必要な機器:**
+ [前のセクション](iot-dc-install-dc.md)でテストしたローカルの開発およびテスト環境
+ [前のセクション](iot-dc-install-dc.md)でテストした Raspberry Pi
+ [前のセクション](iot-dc-install-dc.md)でテストした Raspberry Pi の microSD メモリカード

**Topics**
+ [ジョブを実行するために Raspberry Pi を準備する](iot-dc-runjobs-prepare.md)
+ [AWS IoT Device Client AWS IoT を使用して でジョブを作成して実行する](iot-dc-runjobs-prepare-define.md)

# ジョブを実行するために Raspberry Pi を準備する
<a name="iot-dc-runjobs-prepare"></a>

このセクションの手順では、 AWS IoT Device Client を使用して Raspberry Pi がジョブを実行するように準備する方法について説明します。

**注記**  
これらの手順はデバイス固有です。このセクションの手順を複数のデバイスで同時に実行する場合、各デバイスには独自のポリシーと、一意のデバイス固有の証明書およびモノ名が必要です。各デバイスに固有のリソースを割り当てるには、手順の説明に従ってデバイス固有の要素を変更しながら、デバイスごとに 1 回ずつこの手順を実行します。

**Topics**
+ [Raspberry Pi をプロビジョニングしてジョブをデモンストレーションする](#iot-dc-runjobs-prepare-provision)
+ [ジョブエージェントを実行するように AWS IoT Device Client を設定する](#iot-dc-runjobs-prepare-config)

## Raspberry Pi をプロビジョニングしてジョブをデモンストレーションする
<a name="iot-dc-runjobs-prepare-provision"></a>

このセクションの手順では、 AWS IoT リソースとデバイス証明書を作成して AWS IoT 、 で Raspberry Pi をプロビジョニングします。

**Topics**
+ [デバイス証明書ファイルを作成してダウンロードし、 AWS IoT ジョブをデモンストレーションする](#iot-dc-runjobs-prepare-cert)
+ [AWS IoT ジョブをデモンストレーションする AWS IoT リソースを作成する](#iot-dc-runjobs-prepare-iot)

### デバイス証明書ファイルを作成してダウンロードし、 AWS IoT ジョブをデモンストレーションする
<a name="iot-dc-runjobs-prepare-cert"></a>

この手順では、このデモのデバイス証明書ファイルが作成されます。

複数のデバイスを準備する場合は、この手順を各デバイスで実行する必要があります。

**Raspberry Pi のデバイス証明書ファイルを作成してダウンロードするには、次の手順を実行します。**

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力します。

1. 次のコマンドを入力して、デバイスのデバイス証明書ファイルを作成します。

   ```
   aws iot create-keys-and-certificate \
   --set-as-active \
   --certificate-pem-outfile "~/certs/jobs/device.pem.crt" \
   --public-key-outfile "~/certs/jobs/public.pem.key" \
   --private-key-outfile "~/certs/jobs/private.pem.key"
   ```

   このコマンドでは次のようなレスポンスが返されます。後で使用するために `certificateArn` の値を保存します。

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. 次のコマンドを入力して、証明書ディレクトリとそのファイルに対するアクセス許可を設定します。

   ```
   chmod 700 ~/certs/jobs
   chmod 644 ~/certs/jobs/*
   chmod 600 ~/certs/jobs/private.pem.key
   ```

1. 次のコマンドを実行して、証明書のディレクトリおよびファイルに対するアクセス許可を確認します。

   ```
   ls -l ~/certs/jobs
   ```

   コマンドの出力は、ファイルの日付と時刻が異なることを除いて、ここで表示されるものと同じである必要があります。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

デバイス証明書ファイルを Raspberry Pi にダウンロードしたら、[Raspberry Pi をプロビジョニングしてジョブをデモンストレーションする](#iot-dc-runjobs-prepare-provision) に進む準備が整います。

### AWS IoT ジョブをデモンストレーションする AWS IoT リソースを作成する
<a name="iot-dc-runjobs-prepare-iot"></a>

このデバイスの AWS IoT リソースを作成します。

複数のデバイスを準備する場合は、この手順をデバイスごとに実行する必要があります。



**AWS IoTでデバイスをプロビジョニングするには:**

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

1. 次のコマンドを入力して、 AWS アカウントのデバイスデータエンドポイントのアドレスを取得します。

   ```
   aws iot describe-endpoint --endpoint-type IoT:Data-ATS
   ```

   最後にこのコマンドを実行してからエンドポイントの値は変更されていません。ここでコマンドをここで再度実行すると、このチュートリアルで使用する設定ファイルにデータエンドポイントの値を簡単に検索して貼り付けることができます。

   **describe-endpoint** コマンドでは次のようなレスポンスが返されます。後で使用できるように、`endpointAddress` の値を記録しておきます。

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. *uniqueThingName* をデバイスの一意の名前に置き換えます。このチュートリアルを複数のデバイスで実行する場合は、各デバイスに独自の名前を付けます。例えば、**TestDevice01**、**TestDevice02** などです。

   このコマンドを入力して、Raspberry Pi の新しい AWS IoT モノのリソースを作成します。

   ```
   aws iot create-thing --thing-name "uniqueThingName"
   ```

    AWS IoT モノのリソースはクラウド内のデバイスの*仮想*表現であるため、 で複数のモノのリソースを作成して AWS IoT 、さまざまな目的に使用できます。これらすべてを同じ物理 IoT デバイスで使用して、デバイスのさまざまな側面を表すことができます。
**注記**  
複数のデバイスに対してポリシーを確保する場合は、静的なモノの名前である `uniqueThingName` の代わりに `${iot:Thing.ThingName}` を使用できます。

   これらのチュートリアルでは、デバイスごとに一度に 1 つのモノのリソースしか使用しません。このように、これらのチュートリアルでは、デモの AWS IoT リソースを作成した後、それぞれに特別に作成したリソースを使用してデモに戻って繰り返すことができるように、さまざまなデモを表します。

    AWS IoT モノのリソースが作成された場合、コマンドはこのようなレスポンスを返します。このデバイスで実行するジョブを作成するときに、後で使用するために `thingArn` の値を記録します。

   ```
   {
   "thingName": "uniqueThingName",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/uniqueThingName",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. ターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:DescribeJobExecution",
                      "iot:GetPendingJobExecutions",
                      "iot:StartNextPendingJobExecution",
                      "iot:UpdateJobExecution"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
                  ]
              }
          ]
      }
      ```

   1. エディタでは、すべてのポリシーステートメントの`Resource`セクションで、*us-west-2:57EXAMPLE833* を、自身の AWS リージョン、コロン文字 (:)、12 桁の AWS アカウント 番号に置き換えます。

   1. エディタで、すべてのポリシーステートメントの *uniqueThingName* を、このリソースに付けたモノ名と置き換えます。

   1. テキストエディタのファイルを **\$1/policies/jobs\$1test\$1thing\$1policy.json** として保存します。

      複数のデバイスに対してこの手順を実行する場合は、各デバイスでこのファイル名にファイルを保存します。

1. *uniqueThingName* をデバイスのモノの名前に置き換え、このコマンドを実行して、そのデバイスに合わせた AWS IoT ポリシーを作成します。

   ```
   aws iot create-policy \
   --policy-name "JobTestPolicyForuniqueThingName" \
   --policy-document "file://~/policies/jobs_test_thing_policy.json"
   ```

   ポリシーが作成されると、コマンドは次のようなレスポンスを返します。  
****  

   ```
   {
       "policyName": "JobTestPolicyForuniqueThingName",
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/JobTestPolicyForuniqueThingName",
       "policyDocument": "{\n\"Version\": \"2012-10-17\",\n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
       "policyVersionId": "1"
   }
   ```

1. *uniqueThingName* をデバイスのモノ名と置き換え、`certificateArn` をこのセクションで前に保存したこのデバイスの `certificateArn` の値に置き換えてから、次のコマンドを実行して、ポリシーをデバイス証明書にアタッチします。

   ```
   aws iot attach-policy \
   --policy-name "JobTestPolicyForuniqueThingName" \
   --target "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

1.  *uniqueThingName* をデバイスのモノの名前に置き換え、 をこのセクションの前半`certificateArn`で保存した`certificateArn`値に置き換え、このコマンドを実行してデバイス証明書を AWS IoT モノリソースにアタッチします。

   ```
   aws iot attach-thing-principal \
   --thing-name "uniqueThingName" \
   --principal "certificateArn"
   ```

   成功した場合、このコマンドは何も返しません。

Raspberry Pi を正常にプロビジョニングしたら、引き続きテストに含まれる別の Raspberry Pi についてこのセクションを繰り返します。すべてのデバイスがプロビジョニングされている場合は、[ジョブエージェントを実行するように AWS IoT Device Client を設定する](#iot-dc-runjobs-prepare-config) に進みます。

## ジョブエージェントを実行するように AWS IoT Device Client を設定する
<a name="iot-dc-runjobs-prepare-config"></a>

この手順では、 AWS IoT Device Client がジョブエージェントを実行するための設定ファイルを作成します。

注: 複数のデバイスを準備する場合は、この手順を各デバイスで実行する必要があります。

**AWS IoT Device Client をテストする設定ファイルを作成するには:**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の操作を行います。

   1. `nano` などのテキストエディタを開きます。

   1. この JSON ドキュメントをコピーして、開いているテキストエディタに貼り付けます。

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/jobs/device.pem.crt",
        "key": "~/certs/jobs/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "uniqueThingName",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": true,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": false,
            "publish-topic": "",
            "publish-file": "",
            "subscribe-topic": "",
            "subscribe-file": ""
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. *エンドポイント*値を、「」で見つけ AWS アカウント た のデバイスデータエンドポイント値に置き換えます[でデバイスをプロビジョニングする AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

   1. *uniqueThingName* をこのデバイスに使用したモノ名に置き換えます。

   1. テキストエディタのファイルを **\$1/dc-configs/dc-jobs-config.json** として保存します。

1. 次のコマンドを実行して、新しい設定ファイルのファイルアクセス許可を設定します。

   ```
   chmod 644 ~/dc-configs/dc-jobs-config.json
   ```

**[MQTT test client]** (MQTT テストクライアント) はこのテストには使用しません。デバイスはジョブ関連の MQTT メッセージを と交換しますが AWS IoT、ジョブの進行状況メッセージはジョブを実行しているデバイスとのみ交換されます。ジョブの進行状況メッセージはジョブを実行しているデバイスとのみ交換されるため、 AWS IoT コンソールなどの別のデバイスからサブスクライブすることはできません。

設定ファイルを保存すると、[AWS IoT Device Client AWS IoT を使用して でジョブを作成して実行する](iot-dc-runjobs-prepare-define.md) に進む準備が整います。

# AWS IoT Device Client AWS IoT を使用して でジョブを作成して実行する
<a name="iot-dc-runjobs-prepare-define"></a>

このセクションの手順では、ジョブドキュメントと AWS IoT ジョブリソースを作成します。ジョブリソースを作成すると、 AWS IoT はジョブドキュメントを、ジョブエージェントがジョブドキュメントをデバイスまたはクライアントに適用する指定されたジョブターゲットに送信します。

**Topics**
+ [IoT ジョブのジョブドキュメントを作成して保存する](#iot-dc-runjobs-prepare-define-jobdoc)
+ [1 つの IoT デバイス AWS IoT に対して でジョブを実行する](#iot-dc-runjobs-prepare-define-job)

## IoT ジョブのジョブドキュメントを作成して保存する
<a name="iot-dc-runjobs-prepare-define-jobdoc"></a>

この手順では、 ジョブリソースに含めるシンプルな AWS IoT ジョブドキュメントを作成します。このジョブドキュメントでは「Hello world\$1」と ジョブターゲットに表示されます。

**ジョブドキュメントを作成して保存するには、次の手順に従います。**

1. ジョブドキュメントを保存する Amazon S3 バケットを選択します。これに使用する既存の Amazon S3 バケットがない場合は、バケットを作成する必要があります。Amazon S3 バケットを作成する方法については、「[Amazon S3 の開始方法](https://docs.aws.amazon.com//AmazonS3/latest/userguide/GetStartedWithS3.html)」のトピックを参照してください。

1. このジョブのジョブドキュメントを作成して保存します。

   1. ローカルホストコンピュータで、テキストエディタを開きます。

   1. 次のテキストをコピーしてエディタに貼り付けます。

      ```
      {
          "operation": "echo",
          "args": ["Hello world!"]
      }
      ```

   1. ローカルホストコンピュータで、エディタの内容を **hello-world-job.json** という名前のファイルに保存します。

   1. ファイルが正しく保存されたことを確認します。一部のテキストエディタはテキストファイルを保存するときに自動的に `.txt` をファイル名に追加します。エディタが `.txt` をファイル名に追加した場合、先に進む前にファイル名を修正してください。

1. *path\$1to\$1file* を、**hello-world-job.json** が現在のディレクトリにない場合はそこへのパスに置き換え、*s3\$1bucket\$1name* を、選択したバケットへの Amazon S3 バケットパスに置き換えてから、次のコマンドを実行して、ジョブドキュメントを Amazon S3 バケットに配置します。

   ```
   aws s3api put-object \
   --key hello-world-job.json \
   --body path_to_file/hello-world-job.json --bucket s3_bucket_name
   ```

   Amazon S3 に保存したジョブドキュメントを特定するジョブドキュメント URL は、次の URL の *s3\$1bucket\$1name* と *AWS\$1region* を置き換えたものになります。後で *document\$1path* として使用するために、結果の URL を記録します。

   ```
   https://s3_bucket_name.s3.AWS_Region.amazonaws.com/hello-world-job.json
   ```
**注記**  
AWS セキュリティにより、ブラウザを使用するなどして AWS アカウント、 の外部でこの URL を開くことができなくなります。URL は、デフォルトで ファイルにアクセスできる AWS IoT ジョブエンジンによって使用されます。本番稼働環境では、 AWS IoT サービスに、Amazon S3 に保存されているジョブドキュメントにアクセスするためのアクセス許可があることを確認する必要があります。

ジョブドキュメントの URL を保存したら、[1 つの IoT デバイス AWS IoT に対して でジョブを実行する](#iot-dc-runjobs-prepare-define-job) に進みます。

## 1 つの IoT デバイス AWS IoT に対して でジョブを実行する
<a name="iot-dc-runjobs-prepare-define-job"></a>

このセクションの手順では、Raspberry Pi で AWS IoT Device Client を起動して、デバイスでジョブエージェントを実行してジョブの実行を待機します。また、 にジョブリソースを作成し AWS IoT、ジョブを に送信して IoT デバイス上で実行します。

**注記**  
この手順では、1 つのデバイスでのみジョブを実行します。

**Raspberry Pi でジョブエージェントを開始するには、次の手順に従います。**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、このコマンドを実行して AWS IoT Device Client を起動します。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-jobs-config.json
   ```

1. ターミナルウィンドウで、 AWS IoT Device Client と がこれらのメッセージを表示することを確認します。

   ```
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Jobs is enabled
                         .
                         .
                         .
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Client base has been notified that Jobs has started
   2021-11-15T18:45:56.708Z [INFO]  {JobsFeature.cpp}: Running Jobs!
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to startNextPendingJobExecution accepted and rejected
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to nextJobChanged events
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusAccepted for jobId +
   2021-11-15T18:45:56.738Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionAccepted with code {0}
   2021-11-15T18:45:56.739Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusRejected for jobId +
   2021-11-15T18:45:56.753Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToNextJobChanged with code {0}
   2021-11-15T18:45:56.760Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobRejected with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobAccepted with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionRejected with code {0}
   2021-11-15T18:45:56.777Z [DEBUG] {JobsFeature.cpp}: Publishing startNextPendingJobExecutionRequest
   2021-11-15T18:45:56.785Z [DEBUG] {JobsFeature.cpp}: Ack received for StartNextPendingJobPub with code {0}
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1. ターミナルウィンドウで、次のメッセージが表示されたら、次の手順に進み、ジョブリソースを作成します。これは、リストの最後のエントリではない可能性があることに注意してください。

   ```
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

**AWS IoT ジョブリソースを作成するには**

1. ローカルホストコンピュータで、次の操作を行います。

   1. *job\$1document\$1url* を [IoT ジョブのジョブドキュメントを作成して保存する](#iot-dc-runjobs-prepare-define-jobdoc) のジョブドキュメント URL に置き換えます。

   1. *thing\$1arn* をデバイス用に作成したモノのリソースの ARN に置き換えてから、次のコマンドを実行します。

      ```
      aws iot create-job \
      --job-id hello-world-job-1 \
      --document-source "job_document_url" \
      --targets "thing_arn" \
      --target-selection SNAPSHOT
      ```

      成功すると、コマンドは次のような結果を返します。

      ```
      {
        "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
        "jobId": "hello-world-job-1"
      }
      ```

1. ターミナルウィンドウには、このような AWS IoT Device Client からの出力が表示されます。

   ```
   2021-11-15T18:02:26.688Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Job ids differ
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: Executing job: hello-world-job-1
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Assuming executable is in PATH
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: About to execute: echo Hello world!
   2021-11-15T18:10:24.890Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken 3TEWba9Xj6 in the updateJobExecution promises map
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process now running
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process about to call execvp
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Parent process now running, child PID is 16737
   2021-11-15T18:10:24.891Z [DEBUG] {16737}: Hello world!
   2021-11-15T18:10:24.891Z [DEBUG] {JobEngine.cpp}: JobEngine finished waiting for child process, returning 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job exited with status: 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job executed successfully!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.892Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.892Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken GmQ0HTzWGg in the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken 3TEWba9Xj6 from the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:24.917Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken GmQ0HTzWGg from the updateJobExecution promises map
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:25.861Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1.  AWS IoT Device Client が実行中でジョブを待っている間、`job-id`値を変更し、ステップ 1 **create-job**から を再実行することで、別のジョブを送信できます。

ジョブの実行が完了したら、ターミナルウィンドウで ^C (control-C) と入力して AWS IoT Device Client を停止します。

# チュートリアル: AWS IoT Device Client チュートリアルの実行後のクリーンアップ
<a name="iot-dc-cleanup"></a>

このチュートリアルの手順では、このラーニングパスのチュートリアルを完了するまでに作成したファイルとリソースを削除する手順を説明します。

**Topics**
+ [ステップ 1: Device Client でデモを構築した後で AWS IoT デバイスをクリーンアップする](#iot-dc-cleanup-devices)
+ [ステップ 2: AWS IoT Device Client でデモを構築 AWS アカウント した後で をクリーンアップする](#iot-dc-cleanup-cloud)

## ステップ 1: Device Client でデモを構築した後で AWS IoT デバイスをクリーンアップする
<a name="iot-dc-cleanup-devices"></a>

このチュートリアルでは、このラーニングパスでデモを作成した後に microSD カードをクリーンアップする方法の 2 つのオプションについて説明します。必要なセキュリティレベルを提供するオプションを選択します。

デバイスの microSD カードをクリーニングしても、作成した AWS IoT リソースは削除されないことに注意してください。デバイスの microSD カードをクリーンアップした後に AWS IoT リソースをクリーンアップするには、「」のチュートリアルを確認してください[ステップ 2: AWS IoT Device Client でデモを構築 AWS アカウント した後で をクリーンアップする](#iot-dc-cleanup-cloud)。

### オプション 1: microSD カードを書き換えてクリーンアップする
<a name="iot-dc-cleanup-devices-flash"></a>

このラーニングパスのチュートリアルを完了した後、microSD カードをクリーニングする最も簡単で徹底的な方法は、デバイスの最初の準備時に作成して保存しておいたイメージファイルで microSD カードを上書きすることです。

この手順では、ローカルホストコンピュータを使用して、保存された microSD カードイメージを microSD カードに書き込みます。

**注記**  
デバイスがオペレーティングシステムにリムーバブルストレージメディアを使用していない場合は、そのデバイスの手順を参照してください。

**microSD カードに新しいイメージを書き込むには**

1. ローカルホストコンピュータで、microSD カードに書き込む保存した microSD カードイメージを見つけます。

1. microSD カードをローカルホストコンピュータに挿入します。

1. SD カードイメージングツールを使用して、選択したイメージファイルを microSD カードに書き込みます。

1. Raspberry Pi OS イメージを microSD カードに書き込んだ後、microSD カードを取り出し、ローカルホストコンピュータから安全に取り外します。

microSD カードは使用可能になっています。

### オプション 2: ユーザーディレクトリを削除してクリーンアップする
<a name="iot-dc-cleanup-devices-dirs"></a>

チュートリアルを完了した後、microSD カードのイメージを書き換えずに microSD カードをクリーニングするには、ユーザーディレクトリを個別に削除します。この方法では、システムファイルがインストールされている場合、そのファイルは削除されないため、保存されたイメージで microSD カードを書き換える方法ほど徹底的ではありません。

必要性に対して、ユーザーディレクトリが十分に削除されるならば、この手順に従うことができます。

**このラーニングパスのユーザーディレクトリをデバイスから削除するには**

1. 次のコマンドを実行して、デバイスに接続されたターミナルウィンドウで、このラーニングパスで作成されたユーザーディレクトリ、サブディレクトリ、およびそのすべてのファイルを削除します。
**注記**  
これらのディレクトリとファイルを削除すると、チュートリアルを再度完了しないとデモを実行できなくなります。

   ```
   rm -Rf ~/dc-configs
   rm -Rf ~/policies
   rm -Rf ~/messages
   rm -Rf ~/certs
   rm -Rf ~/.aws-iot-device-client
   ```

1. 次のコマンドを実行して、デバイスに接続されているターミナルウィンドウで、アプリケーションのソースディレクトリとファイルを削除します。
**注記**  
これらのコマンドはプログラムをアンインストールしません。プログラムのビルドとインストールに使用されたソースファイルのみを削除します。これらのファイルを削除すると、 AWS CLI と AWS IoT Device Client が機能しない場合があります。

   ```
   rm -Rf ~/aws-cli
   rm -Rf ~/aws
   rm -Rf ~/aws-iot-device-client
   ```

## ステップ 2: AWS IoT Device Client でデモを構築 AWS アカウント した後で をクリーンアップする
<a name="iot-dc-cleanup-cloud"></a>

これらの手順は、このラーニングパスのチュートリアルを完了する際に作成した AWS リソースを特定して削除するのに役立ちます。

### AWS IoT リソースをクリーンアップする
<a name="iot-dc-cleanup-cloud-iot"></a>

この手順は、このラーニングパスのチュートリアルを完了する際に作成した AWS IoT リソースを特定して削除するのに役立ちます。


**AWS IoT このラーニングパスで作成された リソース**  

| チュートリアル | モノのリソース | ポリシーリソース | 
| --- | --- | --- | 
|  [チュートリアル: AWS IoT Device Client のインストールと設定](iot-dc-install-dc.md)  |  **DevCliTestThing**  | DevCliTestThingPolicy | 
|  [チュートリアル: AWS IoT Device Client との MQTT メッセージ通信のデモンストレーション](iot-dc-testconn.md)  |  **PubSubTestThing**  | PubSubTestThingPolicy | 
|  [チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション](iot-dc-runjobs.md)  | ユーザー定義 (複数ある可能性があります) |  *ユーザー定義* (複数ある可能性があります)  | 

**AWS IoT リソースを削除するには、作成したモノのリソースごとに以下の手順に従います。**

1. `thing_name` を削除するモノのリソースの名前に置き換えてから、次のコマンドを実行して、ローカルホストコンピュータからモノのリソースにアタッチされた証明書を一覧表示します。

   ```
   aws iot list-thing-principals --thing-name thing_name
   ```

   このコマンドは、`thing_name` にアタッチされている証明書を一覧表示するこのようなレスポンスを返します。ほとんどの場合、リストに含まれる証明書は 1 つだけです。

   ```
   {
       "principals": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:cert/23853eea3cf0edc7f8a69c74abeafa27b2b52823cab5b3e156295e94b26ae8ac"
       ]
   }
   ```

1. 前のコマンドでリストされた各証明書について、次の手順を実行します。

   1. `certificate_ID` を前のコマンドの証明書 ID に置き換えます。証明書 ID は、前のコマンドで返された ARN で `cert/` の後に続く英数字です。次に、次のコマンドを実行して、証明書を無効にします。

      ```
      aws iot update-certificate --new-status INACTIVE --certificate-id certificate_ID
      ```

      成功すると、このコマンドは何も返しません。

   1. `certificate_ARN` を以前に返された証明書のリストの証明書 ARN に置き換えてから、次のコマンドを実行して、この証明書にアタッチされたポリシーを一覧表示します。

      ```
      aws iot list-attached-policies --target certificate_ARN
      ```

      このコマンドは、証明書にアタッチされたポリシーを一覧表示するこのようなレスポンスを返します。ほとんどの場合、リストにはポリシーが 1 つしかありません。

      ```
      {
          "policies": [
              {
                  "policyName": "DevCliTestThingPolicy",
                  "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/DevCliTestThingPolicy"
              }
          ]
      }
      ```

   1. 証明書にアタッチされた各ポリシーについて、次の手順を実行します。

      1. `policy_name` を 前のコマンドの `policyName` の値に置き換え、`certificate_ARN` を証明書の ARN に置き換えてから、次のコマンドを実行して、証明書からポリシーをデタッチします。

         ```
         aws iot detach-policy --policy-name policy_name --target certificate_ARN
         ```

         成功すると、このコマンドは何も返しません。

      1. `policy_name` を `policyName` の値に置き換えてから、次のコマンドを実行して、ポリシーがその他の証明書にアタッチされているかどうかを確認します。

         ```
         aws iot list-targets-for-policy --policy-name policy_name
         ```

         コマンドがこのような空のリストを返す場合、ポリシーはどの証明書にもアタッチされていません。その場合、ポリシーのバージョンを一覧表示します。ポリシーにまだ証明書が添付されている場合は、**detach-thing-principal** ステップに進みます。

         ```
         {
             "targets": []
         }
         ```

      1. `policy_name` を `policyName` の値に置き換えてから、次のコマンドを実行してポリシーのバージョンを確認します。ポリシーを削除するには、ポリシーのバージョンが 1 つだけであることが必要です。

         ```
         aws iot list-policy-versions --policy-name policy_name
         ```

         次の例のように、ポリシーにバージョンが 1 つしかない場合は、スキップして **delete-policy** ステップに進み、直ちにポリシーを削除できます。

         ```
         {
             "policyVersions": [
                 {
                     "versionId": "1",
                     "isDefaultVersion": true,
                     "createDate": "2021-11-18T01:02:46.778000+00:00"
                 }
             ]
         }
         ```

         次の例のように、ポリシーに複数のバージョンがある場合、ポリシーを削除する前に、`isDefaultVersion` の値が `false` であるポリシーバージョンを削除する必要があります。

         ```
         {
             "policyVersions": [
                 {
                     "versionId": "2",
                     "isDefaultVersion": true,
                     "createDate": "2021-11-18T01:52:04.423000+00:00"
                 },
                 {
                     "versionId": "1",
                     "isDefaultVersion": false,
                     "createDate": "2021-11-18T01:30:18.083000+00:00"
                 }
             ]
         }
         ```

         ポリシーバージョンを削除する必要がある場合は、`policy_name` を `policyName` の値に置き換え、`version_ID` を前のコマンドの `versionId` の値に置き換えてから、次のコマンドを実行してポリシーバージョンを削除します。

         ```
         aws iot delete-policy-version --policy-name policy_name --policy-version-id version_ID
         ```

         成功すると、このコマンドは何も返しません。

         ポリシーバージョンを 1 つ削除した後、ポリシーのポリシーバージョンが 1 つになるまで、このステップを繰り返します。

      1. `policy_name` を `policyName` の値に置き換えてから、次のコマンドを実行してポリシーを削除します。

         ```
         aws iot delete-policy --policy-name policy_name
         ```

   1. `thing_name` をモノの名前に置き換え、`certificate_ARN` を証明書の ARN に置き換えてから、次のコマンドを実行してモノのリソースから証明書をデタッチします。

      ```
      aws iot detach-thing-principal --thing-name thing_name --principal certificate_ARN
      ```

      成功すると、このコマンドは何も返しません。

   1. `certificate_ID` を前のコマンドの証明書 ID に置き換えます。証明書 ID は、前のコマンドで返された ARN で `cert/` の後に続く英数字です。次に、次のコマンドを実行して、証明書リソースを削除します。

      ```
      aws iot delete-certificate --certificate-id certificate_ID
      ```

      成功すると、このコマンドは何も返しません。

1. `thing_name` をモノの名前に置き換えて、次のコマンドを実行してモノを削除します。

   ```
   aws iot delete-thing --thing-name thing_name
   ```

   成功すると、このコマンドは何も返しません。

### AWS リソースをクリーンアップする
<a name="iot-dc-cleanup-cloud-aws"></a>

この手順は、このラーニングパスのチュートリアルを完了する際に作成した他の AWS リソースを特定して削除するのに役立ちます。


**このラーニングパスで作成されたその他の AWS リソース**  

| チュートリアル | リソースタイプ | リソース名または ID | 
| --- | --- | --- | 
|  [チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション](iot-dc-runjobs.md)  | Amazon S3 オブジェクト | hello-world-job.json | 
|  [チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション](iot-dc-runjobs.md)  |  AWS IoT ジョブリソース  | ユーザー定義 | 

**このラーニングパスで作成された AWS リソースを削除するには**

1. このラーニングパスで作成されたジョブを削除するには

   1. このコマンドを実行して、 のジョブを一覧表示します AWS アカウント。

      ```
      aws iot list-jobs
      ```

      コマンドは、 AWS アカウント および 内の AWS IoT ジョブのリストを返します AWS リージョン 。

      ```
      {
          "jobs": [
              {
                  "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-2",
                  "jobId": "hello-world-job-2",
                  "targetSelection": "SNAPSHOT",
                  "status": "COMPLETED",
                  "createdAt": "2021-11-16T23:40:36.825000+00:00",
                  "lastUpdatedAt": "2021-11-16T23:40:41.375000+00:00",
                  "completedAt": "2021-11-16T23:40:41.375000+00:00"
              },
              {
                  "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
                  "jobId": "hello-world-job-1",
                  "targetSelection": "SNAPSHOT",
                  "status": "COMPLETED",
                  "createdAt": "2021-11-16T23:35:26.381000+00:00",
                  "lastUpdatedAt": "2021-11-16T23:35:29.239000+00:00",
                  "completedAt": "2021-11-16T23:35:29.239000+00:00"
              }
          ]
      }
      ```

   1. このラーニングパスで作成したジョブとしてリストから認識したジョブごとに、 を削除するジョブ`jobId`の値`jobId`に置き換え、このコマンドを実行して AWS IoT ジョブを削除します。

      ```
      aws iot delete-job --job-id jobId
      ```

      コマンドが正常に終了すると、何も返しません。

1. このラーニングパスの Amazon S3 バケットに保存したジョブドキュメントを削除するには

   1. `bucket` を使用したバケットの名前に置き換えてから、次のコマンドを実行して、使用した Amazon S3 バケット内のオブジェクトを一覧表示します。

      ```
      aws s3api list-objects --bucket bucket
      ```

      このコマンドは、次のようにバケット内の Amazon S3 オブジェクトのリストを返します。

      ```
      {
          "Contents": [
              {
                  "Key": "hello-world-job.json",
                  "LastModified": "2021-11-18T03:02:12+00:00",
                  "ETag": "\"868c8bc3f56b5787964764d4b18ed5ef\"",
                  "Size": 54,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              },
              {
                  "Key": "iot_job_firmware_update.json",
                  "LastModified": "2021-04-13T21:57:07+00:00",
                  "ETag": "\"7c68c591949391791ecf625253658c61\"",
                  "Size": 66,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              },
              {
                  "Key": "order66.json",
                  "LastModified": "2021-04-13T21:57:07+00:00",
                  "ETag": "\"bca60d5380b88e1a70cc27d321caba72\"",
                  "Size": 29,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              }
          ]
      }
      ```

   1. このラーニングパスで作成したオブジェクトとしてリストから認識したオブジェクトごとに、`bucket` をバケット名に置き換え、`key` を削除するオブジェクトのキー値に置き換えてから、次のコマンドを実行して Amazon S3 オブジェクトを削除します。

      ```
       aws s3api delete-object --bucket bucket --key key
      ```

      コマンドが正常に終了すると、何も返しません。

このラーニングパスの完了時に作成したすべての AWS リソースとオブジェクトを削除したら、チュートリアルを最初からやり直すことができます。

# AWS IoT Device SDKs を使用したソリューションの構築
<a name="iot-tutorials-sdk-intro"></a>

このセクションのチュートリアルでは、 を使用して本番環境にデプロイできる IoT ソリューションを開発する手順について説明します AWS IoT。

これらのチュートリアルは、 AWS IoT Device SDKs を使用し、安全で信頼性の高いソリューションを作成するために適用されている概念をより詳細に説明[AWS IoT Device Client を使用したデモの構築](iot-tutorials-dc-intro.md)するため、 のセクションよりも完了までに時間がかかる場合があります。

## AWS IoT Device SDKsを使用してソリューションの構築を開始する
<a name="iot-sdk-tutorial-overview"></a>

これらのチュートリアルでは、さまざまな AWS IoT シナリオについて説明します。必要に応じて、チュートリアルでは AWS IoT Device SDKsを使用します。

**Topics**
+ [AWS IoT Device SDKsを使用してソリューションの構築を開始する](#iot-sdk-tutorial-overview)
+ [チュートリアル: Device SDK AWS IoT Core を使用して AWS IoT デバイスを に接続する](sdk-tutorials.md)
+ [デバイスデータを他の サービスにルーティングする AWS IoT ルールの作成](iot-rules-tutorial.md)
+ [デバイスがオフラインになっている間にデバイスの状態をデバイスシャドウで保持する](iot-shadows-tutorial.md)
+ [チュートリアル: のカスタムオーソライザーの作成 AWS IoT Core](custom-auth-tutorial.md)
+ [チュートリアル: AWS IoT と Raspberry Pi を使用した土壌湿度のモニタリング](iot-moisture-tutorial.md)

# チュートリアル: Device SDK AWS IoT Core を使用して AWS IoT デバイスを に接続する
<a name="sdk-tutorials"></a>

このチュートリアルでは、デバイスを に接続 AWS IoT Core して、データを送受信する方法を示します AWS IoT。このチュートリアルを完了する AWS IoT Core と、デバイスが に接続するように設定され、デバイスが と通信する方法を理解できます AWS IoT。

**Topics**
+ [前提条件](#sdk-tutorials-prereq)
+ [のデバイスを準備します。 AWS IoT](#sdk-tutorials-prepare)
+ [MQTT プロトコルを確認する](#sdk-tutorials-mqtt-review)
+ [pubsub.py Device SDK サンプルアプリケーションを確認する](#sdk-tutorials-explore-sample)
+ [デバイスを接続して と通信する AWS IoT Core](#sdk-tutorials-experiment)
+ [結果を確認する](#sdk-tutorials-conclusion)
+ [チュートリアル: AWS IoT Device SDK for Embedded C の使用](iot-embedded-c-sdk.md)

## 前提条件
<a name="sdk-tutorials-prereq"></a>

このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
+ 

**[AWS IoT Core チュートリアルの開始方法](iot-gs.md) を完了していること**  
[デバイスを設定する](configure-device.md) する必要があるチュートリアルのセクションで、デバイスの [Raspberry Pi または他のデバイスを接続する](connecting-to-existing-device.md) オプションを選択し、Python 言語オプションを使用してデバイスを設定します。
**注記**  
このチュートリアルでも使用するため、そのチュートリアルで使用するターミナルウィンドウは開いたままにします。
+ 

**Device SDK v2 for Python を実行できる AWS IoT デバイス。**  
このチュートリアルでは、比較的強力なデバイスを必要とする Python コード例 AWS IoT Core を使用して、デバイスを に接続する方法を示します。リソースに制約のあるデバイスを使用している場合は、これらのコード例が機能しない可能性があります。その場合は、「[チュートリアル: AWS IoT Device SDK for Embedded C の使用](iot-embedded-c-sdk.md)」チュートリアルの方が、接続に成功する可能性がより高くなります。
+ 

**デバイスに接続するために必要な情報を取得済みであること**  
デバイスを に接続するには AWS IoT、モノの名前、ホスト名、ポート番号に関する情報が必要です。
**注記**  
カスタム認証を使用してデバイスを AWS IoT Coreに接続することもできます。オーソライザーの Lambda 関数に渡す接続データは、使用するプロトコルによって異なります。
  + **モノの名前**: 接続する AWS IoT モノの名前。デバイスとして を AWS IoT モノとして登録している必要があります。詳細については、「[を使用したデバイスの管理 AWS IoT](iot-thing-management.md)」を参照してください。
  + **ホスト名**: アカウント固有の IoT エンドポイントのホスト名。
  + **ポート番号**: 接続先のポート番号。

  Python SDK の AWS IoT `configureEndpoint`メソッドを使用して、ホスト名とポート番号を設定できます。

  ```
  myAWSIoTMQTTClient.configureEndpoint("random.iot.region.amazonaws.com", 8883)
  ```

## のデバイスを準備します。 AWS IoT
<a name="sdk-tutorials-prepare"></a>

[AWS IoT Core チュートリアルの開始方法](iot-gs.md) では、デバイスと AWS アカウントが通信できるように準備しました。このセクションでは、 とのデバイス接続に適用される準備の側面を確認します AWS IoT Core。

デバイスの AWS IoT Core接続に際して

1. **AWS アカウント** が必要です。

   の手順[セットアップ AWS アカウント](setting-up.md)では、 をまだ作成 AWS アカウント していない場合に を作成する方法について説明します。

1. そのアカウントでは、 AWS アカウント および リージョンのデバイスに次の**AWS IoT リソース**を定義する必要があります。

   [AWS IoT リソースの作成](create-iot-resources.md) の手順では、 AWS アカウント とリージョンのデバイス用にこれらのリソースを作成する方法が示されています。
   +  AWS IoT に登録され、デバイスを認証するために有効化された**デバイス証明書**。

     多くの場合、証明書は **AWS IoT モノのオブジェクト**を使用して作成され、そのオブジェクトにアタッチされます。モノのオブジェクトはデバイスが に接続するためには必要ありませんが AWS IoT、追加の AWS IoT 機能がデバイスで利用可能になります。
   + デバイス証明書にアタッチされた**ポリシー**で、接続 AWS IoT Core して必要なすべてのアクションを実行することを許可します。

1.  AWS アカウントのデバイスエンドポイントにアクセスできる**インターネット接続**。

   デバイスエンドポイントは で説明[AWS IoT デバイスデータとサービスエンドポイント](iot-connect-devices.md#iot-connect-device-endpoints)されており、[AWS IoT コンソールの設定ページ](https://console.aws.amazon.com/iot/home#/settings)に表示されます。

1. **通信ソフトウェア** ( AWS IoT Device SDK が提供するものなど)。このチュートリアルでは、[AWS IoT Device SDK v2 for Python](https://github.com/aws/aws-iot-device-sdk-python-v2#aws-iot-device-sdk-v2-for-python) を使用します。

## MQTT プロトコルを確認する
<a name="sdk-tutorials-mqtt-review"></a>

サンプルアプリケーションについて説明する前に、MQTT プロトコルを理解しておくと役立ちます。MQTT プロトコルには、HTTP などの他のネットワーク通信プロトコルに比べていくつかの利点があり、IoT デバイスで一般的な選択肢となっています。このセクションでは、このチュートリアルに適用される MQTT の主要な側面を確認します。MQTT と HTTP を比較する方法の詳細については、「[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection)」を参照してください。

**MQTT は、発行/サブスクライブ通信モデルを使用します**  
MQTT プロトコルは、ホストとの発行/サブスクライブ通信モデルを使用します。このモデルは、HTTP が使用するリクエスト/応答モデルとは異なります。MQTT では、デバイスは一意のクライアント ID によって識別されるホストとのセッションを確立します。データを送信するために、デバイスはトピックによって識別されたメッセージをホストのメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、トピックをサブスクライブします。

**MQTT サポート永続セッション**  
メッセージブローカーは、デバイスからメッセージを受信し、サブスクライブしているデバイスにメッセージを発行します。[永続セッション](mqtt.md#mqtt-persistent-sessions) (開始デバイスが切断されている場合でもアクティブなセッション) では、デバイスは、切断中に発行されたメッセージを取得できます。デバイス側では、MQTT は、デバイスによって送信されたメッセージをホストが確実に受信できるようにするサービス品質レベル ([QoS](mqtt.md#mqtt-qos)) をサポートします。

## pubsub.py Device SDK サンプルアプリケーションを確認する
<a name="sdk-tutorials-explore-sample"></a>

このセクションでは、このチュートリアルで使用されている **AWS IoT Device SDK v2 for Python** の `pubsub.py` サンプルアプリケーションを確認します。ここでは、 に接続 AWS IoT Core して MQTT メッセージを発行およびサブスクライブする方法を確認します。次のセクションでは、デバイスが接続および通信する方法を調べるのに役立ついくつかの演習を示します AWS IoT Core。

**`pubsub.py` サンプルアプリケーションは、 との MQTT 接続のこれらの側面を示しています AWS IoT Core。**
+ [通信プロトコル](#sdk-tutorials-explore-protocols)
+ [永続セッション](#sdk-tutorials-explore-persistent)
+ [サービスの品質](#sdk-tutorials-explore-qos)
+ [メッセージの発行](#sdk-tutorials-explore-publish)
+ [メッセージのサブスクリプション](#sdk-tutorials-explore-subscribe)
+ [デバイスの切断と再接続](#sdk-tutorials-explore-connect)

### 通信プロトコル
<a name="sdk-tutorials-explore-protocols"></a>

`pubsub.py` サンプルは、MQTT および MQTT over WSS プロトコルを使用した MQTT 接続を示しています。[AWS 共通ランタイム (AWS CRT)](https://github.com/awslabs/aws-crt-python#aws-crt-python) ライブラリは、低レベルの通信プロトコルサポートを提供し、 AWS IoT Device SDK v2 for Python に含まれています。

#### MQTT
<a name="sdk-tutorials-explore-mqtt"></a>

この`pubsub.py`サンプルでは`mtls_from_path`、MQTT プロトコル AWS IoT Core を使用して との接続を確立[https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py)するために、 で (ここに示す) を呼び出します。 `mtls_from_path`は X.509 証明書と TLS v1.2 を使用してデバイスを認証します。CRT AWS ライブラリは、その接続の下位レベルの詳細を処理します。

```
mqtt_connection = mqtt_connection_builder.mtls_from_path(
    endpoint=args.endpoint,
    cert_filepath=args.cert,
    pri_key_filepath=args.key,
    ca_filepath=args.ca_file,
    client_bootstrap=client_bootstrap,
    on_connection_interrupted=on_connection_interrupted,
    on_connection_resumed=on_connection_resumed,
    client_id=args.client_id,
    clean_session=False,
    keep_alive_secs=6
)
```

`endpoint`  
 AWS アカウントの IoT デバイスエンドポイント  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`cert_filepath`  
デバイスの証明書ファイルへのパス  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`pri_key_filepath`  
証明書ファイルで作成されたデバイスのプライベートキーファイルへのパス  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`ca_filepath`  
Root CA ファイルへのパス。MQTT サーバーがまだトラストストアにない証明書を使用する場合にのみ必要です。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`client_bootstrap`  
ソケット通信アクティビティを処理する共通ランタイムオブジェクト  
サンプルアプリケーションでは、このオブジェクトは `mqtt_connection_builder.mtls_from_path` の呼び出しの前にインスタンス化されます。

`on_connection_interrupted``on_connection_resumed`  
デバイスの接続が中断され、再開されたときに呼び出すコールバック関数

`client_id`  
 AWS リージョンでこのデバイスを一意に識別する ID  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`clean_session`  
新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合)

`keep_alive_secs`  
`CONNECT` リクエストで送信するキープアライブ値 (秒単位)。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

#### MQTT over WSS
<a name="sdk-tutorials-explore-mqtt-wss"></a>

`pubsub.py` サンプルでは、[https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py) の `websockets_with_default_aws_signing` (以下に示されています) を呼び出して、WSS 経由で MQTT プロトコルを使用して AWS IoT Core との接続を確立します。`websockets_with_default_aws_signing` は、[署名 V4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) を使用して WSS 経由で MQTT 接続を作成し、デバイスを認証します。

```
mqtt_connection = mqtt_connection_builder.websockets_with_default_aws_signing(
    endpoint=args.endpoint,
    client_bootstrap=client_bootstrap,
    region=args.signing_region,
    credentials_provider=credentials_provider,
    websocket_proxy_options=proxy_options,
    ca_filepath=args.ca_file,
    on_connection_interrupted=on_connection_interrupted,
    on_connection_resumed=on_connection_resumed,
    client_id=args.client_id,
    clean_session=False,
    keep_alive_secs=6
)
```

`endpoint`  
 AWS アカウントの IoT デバイスエンドポイント  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`client_bootstrap`  
ソケット通信アクティビティを処理する共通ランタイムオブジェクト  
サンプルアプリケーションでは、このオブジェクトは `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの前にインスタンス化されます。

`region`  
 AWS 署名 V4 認証で使用される署名リージョン。`pubsub.py` では、コマンドラインに入力されたパラメータを渡します。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`credentials_provider`  
認証に使用するために提供される AWS 認証情報  
サンプルアプリケーションでは、このオブジェクトは `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの前にインスタンス化されます。

`websocket_proxy_options`  
HTTP プロキシオプション (プロキシホストを使用している場合)  
サンプルアプリケーションでは、この値は `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの前に初期化されます。

`ca_filepath`  
Root CA ファイルへのパス。MQTT サーバーがまだトラストストアにない証明書を使用する場合にのみ必要です。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`on_connection_interrupted``on_connection_resumed`  
デバイスの接続が中断され、再開されたときに呼び出すコールバック関数

`client_id`  
 AWS リージョンでこのデバイスを一意に識別する ID。  
サンプルアプリケーションでは、この値はコマンドラインから渡されます。

`clean_session`  
新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合)

`keep_alive_secs`  
`CONNECT` リクエストで送信するキープアライブ値 (秒単位)。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

#### HTTPS
<a name="sdk-tutorials-explore-https"></a>

HTTPS とは? では、HTTPS リクエストを発行するデバイス AWS IoT Core をサポートしています。プログラミングの観点からは、デバイスは他のアプリケーションと同様に HTTPS リクエストを AWS IoT Core に送信します。デバイスから HTTP メッセージを送信する Python プログラムの例については、Python の `requests` ライブラリを使用した [HTTPS コード例](http.md#codeexample)を参照してください。この例では、 が AWS IoT Core MQTT メッセージとして解釈するように、HTTPS AWS IoT Core を使用して にメッセージを送信します。

はデバイスからの HTTPS リクエスト AWS IoT Core をサポートしますが、デバイスの通信に使用するプロトコルについて情報に基づいた決定[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection)ができるように、 に関する情報を必ず確認してください。

### 永続セッション
<a name="sdk-tutorials-explore-persistent"></a>

サンプルアプリケーションでは、`clean_session` パラメータを `False` に設定して、接続を永続化する必要があることを示します。実際には、これは、この呼び出しによって開かれた接続が、既存の永続セッション (存在する場合) に再接続することを意味します。そうでなければ、新しい永続セッションを作成して接続します。

永続セッションでは、デバイスに送信されたメッセージは、デバイスが接続されていない間、メッセージブローカーによって保存されます。デバイスが永続セッションに再接続すると、メッセージブローカーは、サブスクライブしている保存済みメッセージをデバイスに送信します。

永続セッションがない場合、デバイスは、デバイスが接続されていないときに送信されたメッセージを受信しません。どのオプションを使用するかは、アプリケーションと、デバイスが接続されていないときに発生するメッセージを通信する必要があるかどうかによって異なります。詳細については、「」を参照してください[MQTT 永続的セッション](mqtt.md#mqtt-persistent-sessions)

### サービスの品質
<a name="sdk-tutorials-explore-qos"></a>

デバイスがメッセージを発行およびサブスクライブするときに、優先するサービス品質 (QoS) を設定できます。 は、発行およびサブスクライブオペレーションの QoS レベル 0 と 1 AWS IoT をサポートします。の QoS レベルの詳細については AWS IoT、「」を参照してください[MQTT Quality of Service (QoS) オプション](mqtt.md#mqtt-qos)。

Python の AWS CRT ランタイムは、サポートされる QoS レベルにこれらの定数を定義します。


**Python サービス品質レベル**  

| MQTT QoS レベル | SDK で使用される Python シンボリック値 | 説明 | 
| --- | --- | --- | 
| QoS レベル 0 | mqtt.QoS.AT\$1MOST\$1ONCE | メッセージの送信は、受信されたかどうかにかかわらず、1 回だけ行われます。例えば、デバイスが接続されていない場合やネットワークエラーがある場合など、メッセージがまったく送信されない場合があります。 | 
| QoS レベル 1 | mqtt.QoS.AT\$1LEAST\$1ONCE | メッセージは、PUBACK 確認応答を受信するまで繰り返し送信されます。 | 

サンプルアプリケーションでは、発行およびサブスクライブのリクエストは QoS レベル 1 (`mqtt.QoS.AT_LEAST_ONCE`) で行われます。
+ 

**発行での QoS**  
デバイスが QoS レベル 1 のメッセージを発行すると、メッセージブローカーからの `PUBACK` 応答を受信するまでメッセージが繰り返し送信されます。デバイスが接続されていない場合、メッセージは再接続後に送信されるようにキューに入れられます。
+ 

**サブスクライブでの QoS**  
デバイスが QoS レベル 1 のメッセージをサブスクライブすると、メッセージブローカーは、デバイスに送信できるようになるまで、デバイスがサブスクライブしているメッセージを保存します。メッセージブローカーは、デバイスから `PUBACK` 応答を受信するまでメッセージを再送信します。

### メッセージの発行
<a name="sdk-tutorials-explore-publish"></a>

への接続が正常に確立されると AWS IoT Core、デバイスはメッセージを発行できます。`pubsub.py` サンプルでは、`mqtt_connection` オブジェクトの `publish` オペレーションを呼び出してこれを行います。

```
mqtt_connection.publish(
    topic=args.topic,
    payload=message,
    qos=mqtt.QoS.AT_LEAST_ONCE
)
```

`topic`  
メッセージを識別するメッセージのトピック名  
サンプルアプリケーションでは、これはコマンドラインから渡されます。

`payload`  
文字列としてフォーマットされたメッセージペイロード (例: JSON ドキュメント)  
サンプルアプリケーションでは、これはコマンドラインから渡されます。  
JSON ドキュメントは一般的なペイロード形式であり、他の AWS IoT のサービスによって認識されます。ただし、メッセージペイロードのデータ形式は、パブリッシャーとサブスクライバーが同意する任意の形式にすることができます。ただし、他の AWS IoT サービスでは、いくつかのケースにおいて、ほとんどのオペレーションで JSON と CBOR のみが認識されます。

`qos`  
このメッセージの QoS レベル

### メッセージのサブスクリプション
<a name="sdk-tutorials-explore-subscribe"></a>

 AWS IoT およびその他の のサービスやデバイスからメッセージを受信するには、デバイスはそれらのメッセージをトピック名でサブスクライブします。デバイスは、[トピック名](topics.md#topicnames)を指定して個々のメッセージをサブスクライブし、ワイルドカード文字を含めることができる[トピックフィルター](topics.md#topicfilters)を指定してメッセージのグループをサブスクライブできます。この `pubsub.py` サンプルでは、ここに示すコードを使用してメッセージをサブスクライブし、受信後にメッセージを処理するためのコールバック関数を登録します。

```
subscribe_future, packet_id = mqtt_connection.subscribe(
    topic=args.topic,
    qos=mqtt.QoS.AT_LEAST_ONCE,
    callback=on_message_received
)
subscribe_result = subscribe_future.result()
```

`topic`  
サブスクライブするトピック。これは、トピック名またはトピックフィルターにすることができます。  
サンプルアプリケーションでは、これはコマンドラインから渡されます。

`qos`  
デバイスが切断されている間、メッセージブローカーがこれらのメッセージを保存する必要があるかどうか。  
`mqtt.QoS.AT_LEAST_ONCE` (QoS レベル 1) の値では、接続の作成時に永続セッションを指定する必要があります (`clean_session=False`)。

`callback`  
サブスクライブされたメッセージを処理するために呼び出す関数。

`mqtt_connection.subscribe` 関数は、future とパケット ID を返します。サブスクリプションリクエストが正常に開始された場合、返されるパケット ID は 0 より大きくなります。サブスクリプションがメッセージブローカーによって受信され、登録されたことを確認するには、コード例に示すように、非同期オペレーションの結果が返されるまで待機する必要があります。

**コールバック関数**  
`pubsub.py` サンプルのコールバックは、デバイスがサブスクライブされたメッセージを受信したときに処理します。

```
def on_message_received(topic, payload, **kwargs):
    print("Received message from topic '{}': {}".format(topic, payload))
    global received_count
    received_count += 1
    if received_count == args.count:
        received_all_event.set()
```

`topic`  
メッセージのトピック  
これは、トピックフィルターにサブスクライブしている場合でも、受信したメッセージの特定のトピック名です。

`payload`  
メッセージペイロード  
このフォーマットはアプリケーション固有です。

`kwargs`  
[https://awslabs.github.io/aws-crt-python/api/mqtt.html#awscrt.mqtt.Connection.subscribe](https://awslabs.github.io/aws-crt-python/api/mqtt.html#awscrt.mqtt.Connection.subscribe) で説明されている可能な追加の引数。

`pubsub.py` サンプルでは、`on_message_received` はトピックとそのペイロードのみを表示します。また、制限に達した後、プログラムを終了するために受信したメッセージもカウントします。

アプリケーションはトピックとペイロードを評価して、実行するアクションを決定します。

### デバイスの切断と再接続
<a name="sdk-tutorials-explore-connect"></a>

`pubsub.py` サンプルには、デバイスが切断されたときと接続が再確立されたときに呼び出されるコールバック関数が含まれています。これらのイベントに対してデバイスが実行するアクションは、アプリケーション固有です。

デバイスが初めて接続するとき、受信するトピックをサブスクライブする必要があります。再接続時にデバイスのセッションが存在する場合、そのサブスクリプションが復元され、それらのサブスクリプションから保存されたメッセージは再接続後にデバイスに送信されます。

再接続時にデバイスのセッションが存在しない場合は、サブスクリプションを再サブスクライブする必要があります。永続セッションには有効期限があり、デバイスが切断されている時間が長すぎると期限切れになる可能性があります。

## デバイスを接続して と通信する AWS IoT Core
<a name="sdk-tutorials-experiment"></a>

このセクションでは、デバイスの AWS IoT Coreへの接続のさまざまな側面を詳しく知るのに役立ついくつかの演習を紹介します。これらの演習では、 AWS IoT コンソールで [MQTT テストクライアント](https://console.aws.amazon.com/iot/home#/test)を使用して、デバイスが発行する内容を確認し、デバイスにメッセージを発行します。これらの演習では、「[AWS IoT Device SDK v2 for Python](https://github.com/aws/aws-iot-device-sdk-python-v2/tree/master/samples#sample-apps-for-the-aws-iot-device-sdk-v2-for-python)」の [https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py) サンプルを使用し、「[AWS IoT Core チュートリアルの開始方法](iot-gs.md)」のチュートリアルで得た経験を基に構築します。

**Topics**
+ [ワイルドカードトピックフィルターをサブスクライブする](#sdk-tutorials-experiment-wild)
+ [トピックフィルターのサブスクリプションを処理する](#sdk-tutorials-experiment-process)
+ [デバイスからメッセージを発行する](#sdk-tutorials-experiment-publish)

これらの演習では、`pubsub.py` サンプルプログラムから始めます。

**注記**  
これらの演習では、[AWS IoT Core チュートリアルの開始方法](iot-gs.md) のチュートリアルを完了しており、そのチュートリアルのデバイスのターミナルウィンドウを使用していることを前提としています。

### ワイルドカードトピックフィルターをサブスクライブする
<a name="sdk-tutorials-experiment-wild"></a>

この演習では、`pubsub.py` を呼び出してワイルドカードトピックフィルターをサブスクライブするために使用するコマンドラインを変更し、メッセージのトピックに基づいて受信したメッセージを処理します。

#### 演習手順
<a name="sdk-tutorials-experiment-wild-steps"></a>

この演習では、デバイスに温度制御と照明制御が含まれていると想像してください。これらのトピック名を使用して、トピックに関するメッセージを識別します。

1. 演習を開始する前に、[AWS IoT Core チュートリアルの開始方法](iot-gs.md) のチュートリアルのこのコマンドをデバイスで実行して、演習の準備がすべて整っていることを確認してください。

   ```
   cd ~/aws-iot-device-sdk-python-v2/samples
   python3 pubsub.py --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

   [開始方法のチュートリアル](connecting-to-existing-device.md#gs-device-node-app-run)で見たのと同じ出力が表示されるはずです。

1. この演習では、これらのコマンドラインパラメータを変更します。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/sdk-tutorials.html)

   これらの変更を最初のコマンドラインに加えると、このコマンドラインになります。デバイスのターミナルウィンドウにこのコマンドを入力します。

   ```
   python3 pubsub.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

   プログラムは次のように表示されます。

   ```
   Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-24d7cdcc-cc01-458c-8488-2d05849691e1'...
   Connected!
   Subscribing to topic 'device/+/details'...
   Subscribed with QoS.AT_LEAST_ONCE
   Waiting for all messages to be received...
   ```

   ターミナルにこのように表示された場合、デバイスは準備ができており、トピック名が `device`で始まり `/detail`で終わるメッセージをリッスンしています。それでは、それをテストしてみましょう。

1. デバイスが受信する可能性のあるメッセージをいくつか示します。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/sdk-tutorials.html)

1.  AWS IoT コンソールで MQTT テストクライアントを使用して、前のステップで説明したメッセージをデバイスに送信します。

   1.  AWS IoT コンソールで [MQTT テストクライアント](https://console.aws.amazon.com/iot/home#/test)を開きます。

   1. [**Subscribe to topic**] (トピックへのサブスクライブ) の [**Subscription topic**] (トピックのサブスクリプション) フィールドで、トピックフィルター **device/\$1/details** を入力して、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

   1. MQTT テストクライアントの [**Subscriptions**] (サブスクリプション) 列で、[**device/\$1/details**] を選択します。

   1. 上記の表の各トピックについて、MQTT テストクライアントで次の操作を行います。

      1. [**Publish**] (発行) で、テーブルの [**Topic name**] (トピック名) 列の値を入力します。

      1. トピック名の下のメッセージペイロードフィールドに、表の [**Message payload**] (メッセージペイロード) 列の値を入力します。

      1. `pubsub.py` が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [**Publish to topic**] (トピックに発行) を選択します。

      ターミナルウィンドウで `pubsub.py` によってメッセージが受信されたことがわかります。

#### 演習結果
<a name="sdk-tutorials-experiment-wild-result"></a>

これにより、`pubsub.py` は、ワイルドカードトピックフィルターを使用してメッセージをサブスクライブし、それらを受信し、ターミナルウィンドウに表示しました。単一のトピックフィルターをサブスクライブし、2 つの異なるトピックを持つメッセージを処理するためにコールバック関数が呼び出されたことに注意してください。

### トピックフィルターのサブスクリプションを処理する
<a name="sdk-tutorials-experiment-process"></a>

前の演習に基づいて、`pubsub.py` サンプルアプリケーションを変更してメッセージトピックを評価し、トピックに基づいてサブスクライブされたメッセージを処理します。

#### 演習手順
<a name="sdk-tutorials-experiment-process-steps"></a>

**メッセージトピックを評価するには**

1. `pubsub.py` を `pubsub2.py` にコピーします。

1. お好きなテキストエディタまたは IDE で `pubsub2.py` を開きます。

1. `pubsub2.py` で、`on_message_received` 関数を見つけます。

1. `on_message_received` で、次のコードを `print("Received message` で始まる行の後、および `global received_count` で始まる行の前に挿入します。

   ```
       topic_parsed = False
       if "/" in topic:
           parsed_topic = topic.split("/")
           if len(parsed_topic) == 3:
               # this topic has the correct format
               if (parsed_topic[0] == 'device') and (parsed_topic[2] == 'details'):
                   # this is a topic we care about, so check the 2nd element
                   if (parsed_topic[1] == 'temp'):
                       print("Received temperature request: {}".format(payload))
                       topic_parsed = True
                   if (parsed_topic[1] == 'light'):
                       print("Received light request: {}".format(payload))
                       topic_parsed = True
       if not topic_parsed:
           print("Unrecognized message topic.")
   ```

1. このコマンドラインを使用して、変更を保存し、変更したプログラムを実行します。

   ```
   python3 pubsub2.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

1.  AWS IoT コンソールで、[MQTT テストクライアント](https://console.aws.amazon.com/iot/home#/test)を開きます。

1. [**Subscribe to topic**] (トピックへのサブスクライブ) の [**Subscription topic**] (トピックのサブスクリプション) フィールドで、トピックフィルター **device/\$1/details** を入力して、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

1. MQTT テストクライアントの [**Subscriptions**] (サブスクリプション) 列で、[**device/\$1/details**] を選択します。

1. この表の各トピックについて、MQTT テストクライアントで次の操作を行います。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/sdk-tutorials.html)

   1. [**Publish**] (発行) で、テーブルの [**Topic name**] (トピック名) 列の値を入力します。

   1. トピック名の下のメッセージペイロードフィールドに、表の [**Message payload**] (メッセージペイロード) 列の値を入力します。

   1. `pubsub.py` が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [**Publish to topic**] (トピックに発行) を選択します。

   ターミナルウィンドウで `pubsub.py` によってメッセージが受信されたことがわかります。

ターミナルウィンドウに、このような内容が表示されます。

```
Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-af794be0-7542-45a0-b0af-0b0ea7474517'...
Connected!
Subscribing to topic 'device/+/details'...
Subscribed with QoS.AT_LEAST_ONCE
Waiting for all messages to be received...
Received message from topic 'device/light/details': b'{ "desiredLight": 100, "currentLight": 50 }'
Received light request: b'{ "desiredLight": 100, "currentLight": 50 }'
Received message from topic 'device/temp/details': b'{ "desiredTemp": 20, "currentTemp": 15 }'
Received temperature request: b'{ "desiredTemp": 20, "currentTemp": 15 }'
2 message(s) received.
Disconnecting...
Disconnected!
```

#### 演習結果
<a name="sdk-tutorials-experiment-process-result"></a>

この演習では、サンプルアプリケーションがコールバック関数で複数のメッセージを認識して処理するようにコードを追加しました。これにより、デバイスはメッセージを受信し、それに基づいてアクションを実行できます。

デバイスが複数のメッセージを受信して処理する別の方法は、異なるメッセージを個別にサブスクライブし、各サブスクリプションを独自のコールバック関数に割り当てることです。

### デバイスからメッセージを発行する
<a name="sdk-tutorials-experiment-publish"></a>

pubsub.py サンプルアプリケーションを使用して、デバイスからメッセージを発行できます。メッセージをそのまま発行しますが、メッセージを JSON ドキュメントとして読み取ることはできません。この演習では、読み取り可能なメッセージペイロードに JSON ドキュメントを発行できるようにサンプルアプリを変更します AWS IoT Core。

#### 演習手順
<a name="sdk-tutorials-experiment-publish-steps"></a>

この演習では、次のメッセージが `device/data`トピックとともに送信されます。

```
{
    "timestamp": 1601048303,
    "sensorId": 28,
    "sensorData": [
        {
        "sensorName": "Wind speed",
        "sensorValue": 34.2211224
        }
    ]
}
```

**この演習のメッセージを監視するように MQTT テストクライアントを準備するには**

1. [**Subscribe to topic**] (トピックへのサブスクライブ)の[**Subscription topic field**] (トピックのサブスクリプションフィールド)で、topic filter(トピックフィルター) **device/data** を入力して、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

1. MQTT テストクライアントの [**Subscriptions**] (サブスクリプション) 列で、[**device/data**] (デバイス/データ) を選択します。

1. MQTT テストクライアントウィンドウを開いたままにして、デバイスからのメッセージを待ちます。

**pubsub.py サンプルアプリケーションで JSON ドキュメントを送信するには**

1. デバイスで、`pubsub.py` を `pubsub3.py` にコピーします。

1. `pubsub3.py` を編集して、発行するメッセージのフォーマット方法を変更します。

   1. テキストエディタで `pubsub3.py` を開きます。

   1. 次のコード行を見つけます。

      `message = "{} [{}]".format(message_string, publish_count)`

   1. 次のように変更します。

      `message = "{}".format(message_string)`

   1. 次のコード行を見つけます。

      `message_json = json.dumps(message)`

   1. 次のように変更します。

      `message = "{}".json.dumps(json.loads(message))`

   1. 変更を保存します。

1. デバイス上でこのコマンドを実行して、メッセージを 2 回送信します。

   ```
   python3 pubsub3.py  --ca_file ~/certs/Amazon-root-CA-1.pem  --cert ~/certs/device.pem.crt  --key ~/certs/private.pem.key  --topic device/data  --count 2 --message '{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}'  --endpoint your-iot-endpoint
   ```

1. MQTT テストクライアントで、次のようにメッセージペイロード内の JSON ドキュメントを解釈してフォーマットしたことを確認します。  
![\[AWS IoT コンソールの MQTT クライアントに JSON メッセージペイロードがどのように表示されるかを示す画像。\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/mqtt-test-client-output.png)

デフォルトでは、`pubsub3.py` は送信するメッセージもサブスクライブします。アプリの出力でメッセージを受信したことがわかります。ターミナルウィンドウは次のようになります。

```
Connecting to a3qEXAMPLEsffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-5cff18ae-1e92-4c38-a9d4-7b9771afc52f'...
Connected!
Subscribing to topic 'device/data'...
Subscribed with QoS.AT_LEAST_ONCE
Sending 2 message(s)
Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}
Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}'
Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}
Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}'
2 message(s) received.
Disconnecting...
Disconnected!
```

#### 演習結果
<a name="sdk-tutorials-experiment-publish-result"></a>

これにより、デバイスは に送信するメッセージを生成 AWS IoT Core して基本的な接続をテストし、 が処理 AWS IoT Core するデバイスメッセージを提供できます。たとえば、このアプリを使用して、デバイスからテスト AWS IoT ルールアクションにテストデータを送信できます。

## 結果を確認する
<a name="sdk-tutorials-conclusion"></a>

このチュートリアルの例では、デバイスが と通信する方法の基本 AWS IoT Core、つまり AWS IoT ソリューションの基本的な部分について実践的な経験をしました。デバイスが と通信できる場合 AWS IoT Core、対応できるサービスやその他のデバイスにメッセージを AWS 渡すことができます。同様に、 AWS サービスやその他のデバイスは、デバイスに返送されるメッセージにつながる情報を処理できます。

さらに詳しく調べる準備ができたら AWS IoT Core 、以下のチュートリアルを試してください。
+ [チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)
+ [チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md)
+ [チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md)

# チュートリアル: AWS IoT Device SDK for Embedded C の使用
<a name="iot-embedded-c-sdk"></a>

このセクションでは、AWS IoT Device SDK for Embedded C を実行する方法について説明します。

**Topics**
+ [ステップ 1: AWS IoT Device SDK for Embedded C をインストールする](#install-embedded-c-sdk)
+ [ステップ 2: サンプルアプリケーションを設定する](#iot-c-sdk-app-config)
+ [ステップ 3: サンプルアプリケーションをビルドして実行する](#iot-c-sdk-app-run)

## ステップ 1: AWS IoT Device SDK for Embedded C をインストールする
<a name="install-embedded-c-sdk"></a>

AWS IoT Device SDK for Embedded C は通常、最適化された C 言語ランタイムを必要とするリソース制約のあるデバイスを対象としています。この SDK は、任意のオペレーティングシステムで使用でき、任意のプロセッサタイプ (MCU や MPU など) でホストできます。使用可能なメモリと処理リソースが多い場合は、上位の AWS IoT Device および Mobile SDK (C\$1\$1、Java、JavaScript、Python など) のいずれかを使用することをお勧めします。

一般的に、AWS IoT Device SDK for Embedded C は、組み込みオペレーティングシステムを実行する MCU またはローエンド MPU を使用するシステムを対象としています。このセクションのプログラミング例では、ご利用のデバイスが Linux を使用していると仮定しています。

**Example**  

1. [GitHub](https://github.com/aws/aws-iot-device-sdk-embedded-C) から AWS IoT Device SDK for Embedded C をデバイスにダウンロードします。

   ```
   git clone https://github.com/aws/aws-iot-device-sdk-embedded-c.git --recurse-submodules
   ```

   これにより、現在のディレクトリに `aws-iot-device-sdk-embedded-c` という名前のディレクトリが作成されます。

1. そのディレクトリに移動し、最新のリリースを確認します。最新のリリースタグについては、[github.com/aws/aws-iot-device-sdk-embedded-C/tags](https://github.com/aws/aws-iot-device-sdk-embedded-C/tags) を参照してください。

   ```
   cd aws-iot-device-sdk-embedded-c
   git checkout latest-release-tag
   ```

1. OpenSSL バージョン 1.1.0 以降をインストールします。OpenSSL 開発ライブラリは、通常、パッケージマネージャーを介してインストールされた場合、「libssl-dev」または「openssl-devel」と呼ばれます。

   ```
   sudo apt-get install libssl-dev
   ```

## ステップ 2: サンプルアプリケーションを設定する
<a name="iot-c-sdk-app-config"></a>

AWS IoT Device SDK for Embedded C には、サンプルアプリケーションが含まれています。分かりやすいように、このチュートリアルでは `mqtt_demo_mutual_auth` アプリケーションを使用して、AWS IoT Core メッセージブローカーに接続し MQTT トピックにサブスクライブして発行する方法を示します。

1. [AWS IoT Core チュートリアルの開始方法](iot-gs.md) で作成した証明書およびプライベートキーを `build/bin/certificates` ディレクトリにコピーします。
**注記**  
デバイスおよびルート CA 証明書の有効期限切れや失効の対象となります。これらの証明書の有効期限が切れたり、失効した場合は、新しい CA 証明書またはプライベートキーおよびデバイス証明書をデバイスにコピーする必要があります。

1. サンプルは、パーソナル AWS IoT Core エンドポイント、プライベートキー、証明書、およびルート CA 証明書で設定する必要があります。`aws-iot-device-sdk-embedded-c/demos/mqtt/mqtt_demo_mutual_auth` ディレクトリに移動します。

   AWS CLIがインストールされている場合は、コマンドを使用してアカウントのエンドポイント URL を見つける事ができます。

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

   AWS CLI がインストールされていない場合は、[[AWS IoTconsole](https://console.aws.amazon.com/iot/home)](コンソール)を開きます。ナビゲーションペインで、[**Manage (管理)**]、[**Things (モノ)**] の順に選択します。デバイスの IoT のモノを選択し、[**Interact**] (操作) を選択します。モノ の詳細ページの [**HTTPS**] セクションにエンドポイントが表示されます。

1. `demo_config.h` ファイルを開いて、以下の値を更新します。  
AWS\$1IOT\$1ENDPOINT  
パーソナルエンドポイント。  
CLIENT\$1CERT\$1PATH  
証明書ファイルのパス (例　`certificates/device.pem.crt"`)。  
CLIENT\$1PRIVATE\$1KEY\$1PATH  
プライベートキーのファイル名 (例　`certificates/private.pem.key` )。

   以下に例を示します。

   ```
   // Get from demo_config.h
   // =================================================
   #define AWS_IOT_ENDPOINT               "my-endpoint-ats.iot.us-east-1.amazonaws.com"
   #define AWS_MQTT_PORT                  8883
   #define CLIENT_IDENTIFIER              "testclient"
   #define ROOT_CA_CERT_PATH              "certificates/AmazonRootCA1.crt"
   #define CLIENT_CERT_PATH               "certificates/my-device-cert.pem.crt"
   #define CLIENT_PRIVATE_KEY_PATH        "certificates/my-device-private-key.pem.key"
   // =================================================
   ```

1. 次のコマンドを使用して、デバイスに CMake がインストールされているかどうかを確認します。

   ```
   cmake --version
   ```

   コンパイラのバージョン情報が表示された場合は、次のセクションに進みます。

   エラーが発生する、または情報が表示されない場合は、次のコマンドを使用して cmake パッケージをインストールする必要があります。

   ```
   sudo apt-get install cmake
   ```

   **cmake --version** コマンドを再度実行し、CMake がインストールされ、続行する準備ができていることを確認します。

1. 次のコマンドを使用して、デバイスに開発ツールがインストールされているかどうかを確認します。

   ```
   gcc --version
   ```

   コンパイラのバージョン情報が表示された場合は、次のセクションに進みます。

   エラーが発生したり、コンパイラ情報が表示されない場合は、次のコマンドを使用して `build-essential` パッケージをインストールする必要があります。

   ```
   sudo apt-get install build-essential
   ```

   **gcc --version** コマンドを再度実行し、ビルドツールがインストールされ、続行する準備ができていることを確認します。

## ステップ 3: サンプルアプリケーションをビルドして実行する
<a name="iot-c-sdk-app-run"></a>

この手順では、デバイスで `mqtt_demo_mutual_auth` アプリケーションを生成し、AWS IoT Device SDK for Embedded C を使用して [AWS IoT コンソール](https://console.aws.amazon.com/iot/home)に接続する方法について説明します。

**AWS IoT Device SDK for Embedded C サンプルアプリケーションを実行するには**

1. `aws-iot-device-sdk-embedded-c` に移動し、ディレクトリを作成します。

   ```
   mkdir build && cd build
   ```

1. 次の CMake コマンドを入力して、ビルドに必要な Makefiles を生成します。

   ```
   cmake ..  
   ```

1. 次のコマンドを入力して、実行可能アプリケーションファイルをビルドします。

   ```
   make
   ```

1. 次のコマンドで `mqtt_demo_mutual_auth` アプリを実行します。

   ```
   cd bin
   ./mqtt_demo_mutual_auth
   ```

   次のような出力が表示されます:   
![\[AWS IoT Device SDK for Embedded C サンプルアプリケーションを実行するためのコマンドライン出力。\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/successful-run2.png)

これで、デバイスは AWS IoT Device SDK for Embedded C を使用して AWS IoT に接続されました。

AWS IoT コンソールを使用して、サンプルアプリケーションが発行している MQTT メッセージを表示することもできます。[AWS IoT コンソール](https://console.aws.amazon.com/iot/home)で MQTT クライアントを使用する方法については、「[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md)」を参照してください。

# デバイスデータを他の サービスにルーティングする AWS IoT ルールの作成
<a name="iot-rules-tutorial"></a>

これらのチュートリアルでは、より一般的な AWS IoT ルールアクションを使用してルールを作成およびテストする方法を示します。

AWS IoT ルールは、デバイスから他の AWS サービスにデータを送信します。特定の MQTT メッセージをリッスンし、メッセージペイロード内のデータをフォーマットし、結果を他の AWS のサービスに送信します。

Lambda 関数やそれ以上に複雑なものを使用するルールを作成することが目標であっても、ここに示されている順序でこれらを試すことをお勧めします。チュートリアルは、基本的なものから複雑なものへと順に表示されます。新しい概念を段階的に提示することで、特定のチュートリアルを持たないルールアクションの作成に使用できる概念を学習するのに役立ちます。

**注記**  
AWS IoT ルールは、IoT デバイスから他の AWS サービスにデータを送信するのに役立ちます。ただし、これを正常に実行するには、データを送信する他のサービスに関する実用的な知識が必要です。これらのチュートリアルでは、タスクを完了するために必要な情報が提供されていますが、ソリューションで使用する前に、データの送信先のサービスについて詳しく知っておくと便利です。他のサービスの詳細な説明 AWS は、これらのチュートリアルの範囲外です。

**チュートリアルのシナリオの概要**  
これらのチュートリアルのシナリオは、定期的にデータを発行する気象センサーデバイスのシナリオです。この架空のシステムには、このようなセンサー装置がたくさんあります。ただし、このセクションのチュートリアルでは、1 つのデバイスに焦点を当てつつ、複数のセンサーに対応する方法を示します。

このセクションのチュートリアルでは、 AWS IoT ルールを使用して、気象センサーデバイスのこの架空のシステムで次のタスクを実行する方法を示します。
+ 

**[チュートリアル: MQTT メッセージの再発行](iot-repub-rule.md)**  
このチュートリアルでは、気象センサーから受信した MQTT メッセージを、センサー ID と温度値のみを含むメッセージとして再発行する方法を示します。 AWS IoT Core サービスのみを使用し、シンプルな SQL クエリと MQTT クライアントを使用してルールをテストする方法をデモンストレーションします。
+ 

**[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)**  
このチュートリアルでは、気象センサーデバイスの値が特定の値を超えた場合に SNS メッセージを送信する方法を示します。前のチュートリアルで説明した概念に基づいており、別の AWS サービスである [Amazon Simple Notification Service](https://docs.aws.amazon.com//sns/latest/dg/welcome.html) (Amazon SNS) を操作する方法を追加しています。

  Amazon SNS を初めて使用する場合は、このチュートリアルを開始する前に、[開始方法](https://docs.aws.amazon.com//sns/latest/dg/sns-getting-started.html)の演習を行います。
+ 

**[チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md)**  
このチュートリアルでは、気象センサーデバイスのデータをデータベーステーブルに保存する方法を示します。ルールクエリステートメントと置換テンプレートを使用して、送信先のサービスである [Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html) のメッセージデータをフォーマットします。

  DynamoDB を初めて使用する場合は、このチュートリアルを開始する前に、[開始方法](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)の演習を行います。
+ 

**[チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md)**  
このチュートリアルでは、Lambda 関数を呼び出してデバイスデータを再フォーマットし、それをテキストメッセージとして送信する方法を示します。[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) 関数に Python スクリプトと AWS SDK 関数を追加して、気象センサーデバイスからのメッセージペイロードデータでフォーマットし、テキストメッセージを送信します。

  Lambda を初めて使用する場合は、このチュートリアルを開始する前に、[開始方法](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)の演習を行います。

**AWS IoT ルールの概要**  
これらのチュートリアルはすべて AWS IoT ルールを作成します。

デバイスから別の AWS サービスにデータを送信する AWS IoT ルールには、以下を使用します。


+ ルールクエリステートメントは、次のもので構成されます。
  + メッセージペイロードからデータを選択してフォーマットする SQL SELECT 句
  + 使用するメッセージを識別するトピックフィルター (ルールクエリステートメントの FROM オブジェクト)
  + アクションを実行する特定の条件を指定するオプションの条件ステートメント (SQL WHERE 句)
+ 少なくとも 1 つのルールアクション

デバイスは、MQTT トピックにメッセージを発行します。SQL SELECT ステートメントのトピックフィルターは、ルールを適用する MQTT トピックを識別します。SQL SELECT ステートメントで指定されたフィールドは、ルールのアクションで使用するために、着信 MQTT メッセージペイロードからのデータをフォーマットします。ルールのすべてのアクションのリストについては、「[AWS IoT ルールのアクション](iot-rule-actions.md)」を参照してください。

**Topics**
+ [チュートリアル: MQTT メッセージの再発行](iot-repub-rule.md)
+ [チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)
+ [チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md)
+ [チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md)

# チュートリアル: MQTT メッセージの再発行
<a name="iot-repub-rule"></a>

このチュートリアルでは、指定された MQTT メッセージが受信されたときに MQTT メッセージを発行する AWS IoT ルールを作成する方法を示します。受信メッセージペイロードは、発行前にルールによって変更できます。これにより、デバイスやそのファームウェアを変更することなく、特定のアプリケーションに合わせたメッセージを作成できます。また、ルールのフィルタリング機能を使用して、特定の条件が満たされた場合にのみメッセージを発行することもできます。

ルールによって再発行されるメッセージは、他の AWS IoT デバイスまたはクライアントによって送信されるメッセージのように動作します。デバイスは、他の MQTT メッセージトピックにサブスクライブできるのと同様に、再発行されたメッセージにサブスクライブできます。

**このチュートリアルでは、次の内容を学習します。**
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

このチュートリアルの完了には 30 分ほどかかります。

**Topics**
+ [MQTT トピックと AWS IoT ルールを確認する](#iot-repub-rule-mqtt)
+ [ステップ 1: MQTT メッセージを再発行する AWS IoT ルールを作成する](#iot-repub-rule-define)
+ [ステップ 2: 新しいルールをテストする](#iot-repub-rule-test)
+ [ステップ 3: 結果と次のステップを確認する](#iot-repub-rule-review)

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+ 

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
+ 

**[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) を確認したこと**  
トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。

## MQTT トピックと AWS IoT ルールを確認する
<a name="iot-repub-rule-mqtt"></a>

 AWS IoT ルールについて話す前に、MQTT プロトコルを理解するのに役立ちます。IoT ソリューションでは、MQTT プロトコルは HTTP などの他のネットワーク通信プロトコルよりも優れた機能を提供しているため、IoT デバイスでの使用のための選択肢として好まれています。このセクションでは、このチュートリアルに適用される MQTT の主な側面を見ていきます。MQTT と HTTP を比較する方法の詳細については、「[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection)」を参照してください。

**MQTT プロトコル**  
MQTT プロトコルは、ホストとの発行/サブスクライブ通信モデルを使用します。データを送信するために、デバイスはトピックによって識別される AWS IoT メッセージをメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、受信するトピックにサブスクライブします。 AWS IoT ルールエンジンは、メッセージブローカーから MQTT メッセージを受信します。

**AWS IoT ルール**  
AWS IoT ルールは、ルールクエリステートメントと 1 つ以上のルールアクションで構成されます。 AWS IoT ルールエンジンが MQTT メッセージを受信すると、これらの要素は次のようにメッセージに対するアクションを実行します。
+ 

**ルールクエリステートメント**  
ルールのクエリステートメントは、使用する MQTT トピックを記述し、メッセージペイロードからのデータを解釈し、一般的な SQL データベースで使用されるステートメントに似た SQL ステートメントによって記述されるようにデータをフォーマットします。クエリステートメントの結果は、ルールのアクションに送信されるデータです。
+ 

**ルールアクション**  
ルールの各ルールアクションは、ルールのクエリステートメントから生じるデータに作用します。 は[多くのルールアクション](iot-rule-actions.md) AWS IoT をサポートします。ただし、このチュートリアルでは、[再発行](republish-rule-action.md) ルールアクションに焦点を当てます。このアクションは、クエリステートメントの結果を特定のトピックを持つ MQTT メッセージとして発行します。

## ステップ 1: MQTT メッセージを再発行する AWS IoT ルールを作成する
<a name="iot-repub-rule-define"></a>

このチュートリアルで作成する AWS IoT ルールは、*device\$1id* がメッセージを送信したデバイスの ID である `device/device_id/data` MQTT トピックにサブスクライブします。これらのトピックは、`device/+/data` として [トピックフィルター](topics.md#topicfilters)によって記述されます。ここで、`+` は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。

一致するトピックからルールがメッセージを受信すると、`device_id` および `temperature` の値を `device/data/temp` トピックを含む新しい MQTT メッセージとして再発行します。

例えば、`device/22/data`トピックを含む MQTT メッセージのペイロードは、以下のようになります。

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

このルールは、メッセージペイロードから `temperature` 値を、トピックから `device_id` を取得し、`device/data/temp` トピックを含む MQTT メッセージおよびメッセージペイロードとして次のように再発行します。

```
{
  "device_id": "22",
  "temperature": 28
}
```

このルールでは、デバイスの ID と温度データのみを必要とするデバイスは、`device/data/temp` トピックにサブスクライブして、その情報のみを受信します。

**MQTT メッセージを再発行するルールを作成するには**

1. [AWS IoT コンソールの**ルール**ハブを開きます](https://console.aws.amazon.com//iot/home#/rulehub)。

1. [**Rules**] (ルール) で、[**Create**] (作成) を選択して、新しいルールの作成を開始します。

1. [**Create a rule**] (ルールを作成) の上部で、次のように操作します。

   1. **[Name]** (名前) で、ルールの名前を入力します。このチュートリアルでは、**republish\$1temp** という名前を付けます。

      ルール名は、アカウントとリージョン内で一意である必要があります。また、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。

   1.  [**Description**] (説明) で、ルールの説明を入力します。

      わかりやすい説明を使用すると、このルールの動作と作成した理由を思い出すのに役立ちます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。

1. [**Create a rule**] (ルールを作成) の [**Rule query statement**] (ルールクエリステートメント) で、以下を実行します。

   1.  [**Using SQL version**] (SQL バージョンの使用) で、**2016-03-23** を選択します。

   1. [**Rule query statement**] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。

      ```
      SELECT topic(2) as device_id, temperature FROM 'device/+/data'
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致するトピックを持つ MQTT メッセージをリッスンします。
      + トピック文字列から 2 番目の要素を選択し、`device_id` フィールドに割り当てます。
      + メッセージペイロードから値 `temperature` フィールドを選択し、`temperature` フィールドに割り当てます。

1. [**Set one or more actions**] (1 つ以上のアクションを設定) で、以下を実行します。

   1. このルールのルールアクションのリストを開くには、[**Add action**] (アクションの追加) を選択します。

   1. **「アクションの選択**」で、**「 AWS IoT トピックへのメッセージの再発行**」を選択します。

   1. アクションリストの一番下で、[**Configure action**] (アクションを設定) を選択すると、選択したアクションの設定ページが開きます。

1. [**Configure action**] (アクションの設定) で、次のとおり実行します。

   1.  [**Topic**] (トピック) で、**device/data/temp** と入力します。これは、このルールが発行するメッセージの MQTT トピックです。

   1.  [**Quality of Service**] (サービスの品質) で、[**0 - The message is delivered zero or more times**] (0 - メッセージは 0 回以上配信されます。) を選択します。

   1.  **「ロールを選択または作成して、このアクションを実行するための AWS IoT アクセス権を付与**する」を参照してください。

      1.  [**ロールの作成**] を選択します。**[Create a new role]** (新しいロールを作成) ダイアログボックスが開きます。

      1. 新しいロールを説明する名前を入力します。このチュートリアルでは、**republish\$1role** を使用します。

         新しいロールを作成すると、ルールアクションを実行するための正しいポリシーが作成され、新しいロールにアタッチされます。このルールアクションのトピックを変更するか、別のルールアクションでこのロールを使用する場合は、そのロールのポリシーを更新して、新しいトピックまたはアクションを承認する必要があります。既存のロールを更新するには、このセクションで **[Update role]** (ロールの更新) を選択します。

      1. **[Create Role]** (ロールの作成) を選択してロールを作成し、ダイアログボックスを閉じます。

   1. [**Add action**] (アクションの追加) を選択してアクションをルールに追加し、[**Create a rule**] (ルールの作成) ページに戻ります。

1. ** AWS IoT トピックアクションへのメッセージの再発行**が**「1 つ以上のアクションを設定する**」にリストされるようになりました。

   新しいアクションのタイルの **[Republish a message to an AWS IoT topic]** (IoT トピックにメッセージを再発行する) をクリックすると、再発行アクションが発行されるトピックが表示されます。

   このルールに追加するルールアクションはこれだけです。

1. **[Create a rule]** (ルールの作成) で、一番下までスクロールし、**[Create rule]** (ルールの作成) を選択してルールを作成し、この手順を完了します。

## ステップ 2: 新しいルールをテストする
<a name="iot-repub-rule-test"></a>

新しいルールをテストするには、MQTT クライアントを使用して、このルールで使用される MQTT メッセージを発行して、これにサブスクライブします。

新しいウィンドウの [AWS IoT コンソールで MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。これにより、MQTT クライアントの設定を失うことなくルールを編集できます。MQTT クライアントは、サブスクリプションやメッセージログをコンソール内の別のページに移動するために残しておいても、それらを保持しません。

**MQTT クライアントを使用してルールをテストするには**

1. [AWS IoT コンソールの MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)で、入力トピック (この場合は `device/+/data`) をサブスクライブします。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

   1. [**Subscription topic**] (サブスクリプショントピック) で、入力トピックフィルター **device/\$1/data** のトピックを入力します。

   1. 残りのフィールドはデフォルト設定のままにします。

   1. [**Subscribe to topic**] を選択します。

      [**Subscriptions**] (サブスクリプション) 列の [**Publish to a topic**] (トピックへの発行) の下に **device/\$1/data** が表示されます。

1. ルールが発行するトピックをサブスクライブします: `device/data/temp`。

   1. [**Subscriptions**] (サブスクリプション) で、[**Subscribe to a topic**] (トピックへサブスクライブする) を再度選択し、[**Subscription topic**] (サブスクリプショントピック) で、再発行されたメッセージのトピック **device/data/temp** を入力します。

   1. 残りのフィールドはデフォルト設定のままにします。

   1. [**Subscribe to topic**] を選択します。

      [**Subscriptions**] (サブスクリプション) 列の [**device/\$1/data**] の下に **device/data/temp** が表示されます。

1. 特定のデバイス ID **device/22/data** を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含む MQTT トピックには発行できません。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Publish to topic**] (トピックに発行) を選択します。

   1. [**Publish**] (発行) フィールドに、入力トピック名 **device/22/data** を入力します。

   1. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. MQTT メッセージを送信するには、[**Publish to topic**] (トピックに発行) を選択します。

1. 送信されたメッセージを確認します。

   1. MQTT クライアントの **[Subscriptions]** (サブスクリプション) で、以前にサブスクライブした 2 つのトピックの横に緑色のドットが表示されます。

      緑のドットは、最後に表示した後に 1 つ以上の新しいメッセージを受信したことを示します。

   1. [**Subscriptions**] (サブスクリプション) で [**device/\$1/data**] を選択して、メッセージペイロードが今発行したものと一致し、次のようになっていることを確認します。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. **[Subscriptions]** (サブスクリプション) で、**[device/data/temp]** を選択して、再発行されたメッセージペイロードが次のようになっていることを確認します。

      ```
      {
        "device_id": "22",  
        "temperature": 28
      }
      ```

      `device_id` 値は引用符で囲まれた文字列で、`temperature` 値は数値であることに注意してください。これは、[https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic) 関数が入力メッセージのトピック名から文字列を抽出している一方で、`temperature` 値は入力メッセージのペイロードの数値を使用することによるものです。

      `device_id` 値を数値にしたい場合は、ルールクエリステートメントで `topic(2)` を次のように置き換えます。

      ```
      cast(topic(2) AS DECIMAL)
      ```

      `topic(2)` 値を数値にキャストすることは、トピックのその部分に数字のみが含まれている場合にのみ機能することに注意してください。

1. 正しいメッセージが **device/data/temp** トピックに発行されたことが確認できれば、ルールは機能しています。再発行ルールアクションの詳細については、次のセクションを参照してください。

   **device/\$1/data** または **device/data/temp** トピックのいずれかに正しいメッセージが発行されたことが確認できない場合は、トラブルシューティングのヒントを確認してください。

### 再発行メッセージルールのトラブルシューティング
<a name="iot-repub-rule-trouble"></a>

想定する結果が表示されない場合に備えて、確認すべき事項をいくつかご紹介します。
+ 

**エラーバナーが表示された**  
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
+ 

**MQTT クライアントで入力メッセージが表示されない**  
入力メッセージを `device/22/data` トピックにサブスクライブすると、そのメッセージは MQTT クライアントに表示されます。`device/+/data`トピックフィルターを選択します。

**確認すべき事項**
  + 

**サブスクライブしたトピックフィルターを確認する**  
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。

    メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
  + 

**メッセージ発行機能を確認する**  
MQTT クライアントの [**Subscriptions**] (サブスクリプション) で、[**device/\$1/data**] を選択し、パブリッシュ メッセージのトピックを確認してから、[**Publish to topic**] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
+ 

**MQTT クライアントに再発行されたメッセージが表示されない**  
ルールが機能するには、メッセージを受信および再発行することを許可する正しいポリシーを有しており、メッセージを受信する必要があります。

**確認すべき事項**
  + 

**AWS リージョン MQTT クライアントの と作成したルールを確認する**  
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
  + 

**ルールクエリステートメントの入力メッセージのトピックを確認する**  
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。

    ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
  + 

**入力メッセージペイロードの内容を確認する**  
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。

    ルールクエリステートメントの `temperature` フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントの `temperature` フィールドはメッセージペイロードの `temperature` フィールドと同じである必要があります。

    メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
  + 

**ルールアクションで再発行されたメッセージトピックを確認する**  
再発行ルールアクションが新しいメッセージを発行するトピックは、MQTT クライアントでサブスクライブしたトピックと一致する必要があります。

    コンソールで作成したルールを開き、ルールアクションがメッセージを再発行するトピックを確認します。
  + 

**ルールによって使用されているロールを確認する**  
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

    ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。

    これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。

## ステップ 3: 結果と次のステップを確認する
<a name="iot-repub-rule-review"></a>

**このチュートリアルでは、次の作業を行いました。**
+ 新しい MQTT メッセージを生成するために、ルールクエリステートメントでシンプルな SQL クエリといくつかの関数を使用しました。
+ 新しいメッセージを再発行するルールを作成しました。
+ MQTT クライアントを使用して AWS IoT ルールをテストしました。

**次の手順**  
このルールでいくつかのメッセージを再発行した後、チュートリアルのいくつかの側面を変更すると、再発行メッセージにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックで *device\$1id* を変更し、再発行されたメッセージ ペイロードの影響を観察します。
+ ルールクエリステートメントで選択したフィールドを変更し、再発行されたメッセージペイロードに生じる影響を確認します。
+ このシリーズの次のチュートリアルを試して、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法を学びましょう。

このチュートリアルで使用する [Republish] (再発行) ルールアクションも、ルールクエリステートメントのデバッグに役立ちます。例えば、このアクションをルールに追加して、ルールクエリステートメントがルールアクションで使用されるデータをどのようにフォーマットしているかを確認できます。

# チュートリアル: Amazon SNS 通知の送信
<a name="iot-sns-rule"></a>

このチュートリアルでは、MQTT メッセージデータを Amazon SNS トピックに送信して SMS テキストメッセージとして送信できるようにする AWS IoT ルールを作成する方法を示します。

このチュートリアルでは、温度がルールで設定された値を超えるたびに、気象センサーから Amazon SNS トピックのすべてのサブスクライバーにメッセージデータを送信するルールを作成します。ルールは、報告された温度がルールで設定された値を超えたことを検出し、そのとき、デバイス ID、報告された温度、および超過した温度制限のみを含む新しいメッセージペイロードを作成します。ルールは、新しいメッセージペイロードを JSON ドキュメントとして SNS トピックに送信し、このトピックが SNS トピックのすべてのサブスクライバーに通知します。

**このチュートリアルでは、次の内容を学習します。**
+ Amazon SNS 通知を作成してテストする方法
+  AWS IoT ルールから Amazon SNS 通知を呼び出す方法
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

このチュートリアルの完了には 30 分ほどかかります。

**Topics**
+ [ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する](#iot-sns-rule-create-sns-topic)
+ [ステップ 2: テキストメッセージを送信する AWS IoT ルールを作成する](#iot-sns-rule-create-rule)
+ [ステップ 3: AWS IoT ルールと Amazon SNS 通知をテストする](#iot-sns-rule-test-rule)
+ [ステップ 4: 結果と次のステップを確認する](#iot-sns-rule-review-results)

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+ 

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
+ 

**[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) を確認したこと**  
トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。
+ 

**[Amazon Simple Notification Service](https://docs.aws.amazon.com//sns/latest/dg/welcome.html) を確認しました**  
これまでに Amazon SNS を使用したことがない場合は、[Amazon SNS へのアクセスの設定](https://docs.aws.amazon.com//sns/latest/dg/sns-setting-up.html)を確認してください。他の AWS IoT チュートリアルをすでに完了している場合は、 AWS アカウント が正しく設定されている必要があります。

## ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する
<a name="iot-sns-rule-create-sns-topic"></a>

この手順では、気象センサーがメッセージデータを送信できる Amazon SNS トピックを作成する方法について説明します。その後、Amazon SNS トピックは、すべてのサブスクライバーに、温度制限を超えたことを SMS テキストメッセージで通知します。

**SMS テキストメッセージを送信する Amazon SNS トピックを作成するには**

1. **Amazon SNS トピックを作成します。**

   1. [Amazon SNS コンソール](https://console.aws.amazon.com//sns/home)にサインインします。

   1. 左のナビゲーションペインで、[**トピック**] を選択します。

   1. [**トピック**] ページで、[**トピックの作成**] を選択します。

   1. **[Details]** (詳細) で、**[Standard]** (標準) タイプを選択します。デフォルトでは、コンソールは FIFO トピックを作成します。

   1. **[Name]** (名前) で、SNS トピック名を入力します。このチュートリアルでは、**high\$1temp\$1notice** と入力します。

   1. ページの最下部にスクロールし、**[Create topic]** (トピックの作成) を選択します。

      コンソールに新しいトピックの [**詳細**] ページが表示されます。

1. **Amazon SNS サブスクリプションを作成します。**
**注記**  
このサブスクリプションで使用する電話番号では、このチュートリアルで送信するメッセージのテキストメッセージ料金が発生する可能性があります。

   1. **high\$1temp\$1notice** トピックの詳細ページで、**[Create subscription]** (サブスクリプションの作成) を選択します。

   1. **[Create subscription]** (サブスクリプションの作成) の **[Details]** (詳細) セクションの **[Protocol]** (プロトコル) リストで、**[SMS]** を選択します。

   1. **[Endpoint]** (エンドポイント) で、テキストメッセージを受信できる電話の番号を入力します。`+` で始まり、国コードと市外局番が含まれ、他の句読文字が含まれないように入力してください。

   1. [**Create subscription**] を選択します。

1. **Amazon SNS 通知をテストします。**

   1. [Amazon SNS コンソール](https://console.aws.amazon.com//sns/home)の左のナビゲーションペインで、**[Topics]** (トピック) を選択します。

   1. トピックの詳細ページを開くには、**[Topics]** (トピック) のトピックのリストで、**[high\$1temp\$1notice]** を選択します。

   1. **[Publish message to topic]** (トピックへのメッセージの発行) ページを開くには、**[high\$1temp\$1notice]** の詳細ページで **[Publish message]** (メッセージの発行) を選択します。

   1. **[Publish message to topic]** (トピックへのメッセージの発行) の **[Message body]** (メッセージ本文) セクションの **[Message body to send to the endpoint]** (エンドポイントに送信するメッセージ本文) で、短いメッセージを入力します。

   1. ページの下部まで下方向にスクロールし、**[Publish message]** (メッセージの発行) を選択します。

   1. サブスクリプションを作成するときに以前に使用した番号の電話で、メッセージが受信されたことを確認します。

   テストメッセージが受信されない場合は、電話番号と電話の設定を再度確認してください。

   チュートリアルを続行する前に、[Amazon SNS コンソール](https://console.aws.amazon.com//sns/home)からテストメッセージを発行できることを確認してください。

## ステップ 2: テキストメッセージを送信する AWS IoT ルールを作成する
<a name="iot-sns-rule-create-rule"></a>

このチュートリアルで作成する AWS IoT ルールは、 `device_id`がメッセージを送信したデバイスの ID である `device/device_id/data` MQTT トピックにサブスクライブします。これらのトピックは、`device/+/data` としてトピックフィルターで記述されます。ここで、`+` は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。このルールは、メッセージペイロードの `temperature` フィールドの値もテストします。

ルールは、一致するトピックからメッセージを受信すると、トピック名から `device_id` を、メッセージペイロードから `temperature` 値を取得し、テストする制限に定数値を追加し、これらの値を JSON ドキュメントとして Amazon SNS 通知トピックに送信します。

 例えば、気象センサーデバイス番号 32 からの MQTT メッセージは `device/32/data` トピックを使用し、次のようなメッセージペイロードを持っています。

```
{
  "temperature": 38,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

ルールのルールクエリステートメントは、メッセージペイロードから `temperature` 値を、トピック名から `device_id` 値を取得し、定数 `max_temperature` 値を追加して、次のようなメッセージペイロードを Amazon SNS トピックに送信します。

```
{
  "device_id": "32",
  "reported_temperature": 38,
  "max_temperature": 30
}
```

**制限を超えた温度値を検出する AWS IoT ルールを作成し、Amazon SNS トピックに送信するデータを作成するには**

1. [AWS IoT コンソールの**ルール**ハブを開きます](https://console.aws.amazon.com//iot/home#/rulehub)。

1. これが最初のルールである場合は、[**Create**] (作成) または [**Create a rule**] (ルールの作成) を選択します。

1. **[Create a rule]** (ルールの作成) で以下のとおり操作します。

   1. [**名前**] に「**temp\$1limit\$1notify**」と入力します。

      ルール名は AWS アカウント および リージョン内で一意である必要があり、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の単語を区切りました。

   1. [**Description**] (説明) で、ルールの説明を入力します。

      わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。

1. [**Create a rule**] (ルールを作成) の [**Rule query statement**] (ルールクエリステートメント) で、以下を実行します。

   1.  **[Using SQL version]** (SQL バージョンの使用) で、**2016-03-23** を選択します。

   1. [**Rule query statement**] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。

      ```
      SELECT topic(2) as device_id, 
          temperature as reported_temperature, 
          30 as max_temperature 
        FROM 'device/+/data' 
        WHERE temperature > 30
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致し、`temperature` 値が 30 より大きいトピックを含む MQTT メッセージをリッスンします。
      + トピック文字列から 2 番目の要素を選択し、`device_id` フィールドに割り当てます。
      + メッセージペイロードから値 `temperature` フィールドを選択し、`reported_temperature` フィールドに割り当てます。
      + 制限値を表す定数値 `30` を作成し、それを `max_temperature` フィールドに割り当てます。

1. このルールのルールアクションのリストを開くには、**[Set one or more actions]** (1 つ以上のアクションを設定する) で **[Add action]** (アクションの追加) を選択します。

1. **[Select an action]** (アクションを選択してください) で、**[Send a message as an SNS push notification]** (SNS プッシュ通知としてメッセージを送信する) を選択します。

1. 選択したアクションの設定ページを開くには、アクションリストの下部にある [**Configure action**] (アクションの設定) を選択します。

1. [**Configure action**] (アクションの設定) で、次のとおり実行します。

   1. **SNS ターゲット**で、**[Select]** (選択) を選択し、**high\$1temp\$1notice** という名前の SNS トピックを見つけて、**[Select]** (選択) を選択します。

   1. [**Message format**] (メッセージ形式) で、[**RAW**] を選択します。

   1. **「ロールを選択または作成して、このアクションを実行するための AWS IoT アクセス権を付与する」で**、**「ロールの作成**」を選択します。

   1. [**Create a new role**] (新しいロールの作成) の [**Name**] (名前) で、新しいロールの一意の名前を入力します。このチュートリアルでは、**sns\$1rule\$1role** を使用します。

   1. [**ロールの作成**] を選択します。

   このチュートリアルを繰り返す場合、または既存のロールを再利用する場合は、続行する前に **[Update role]** (ロールの更新) を選択してください。これにより、ロールのポリシードキュメントが更新され、SNS ターゲットで動作します。

1. **[Add action]** (アクションの追加) を選択して、**[Create a rule]** (ルールの作成) ページに戻ります。

   新しいアクションのタイルの **[Send a message as an SNS push notification]** (SNS プッシュ通知としてメッセージを送信する) の下に、ルールが呼び出す SNS トピックが表示されます。

   このルールに追加するルールアクションはこれだけです。

1. ルールを作成してこの手順を完了するには、[**Create a rule**] (ルールの作成) で一番下までスクロールし、[**Create rule**] (ルールの作成) を選択します。

## ステップ 3: AWS IoT ルールと Amazon SNS 通知をテストする
<a name="iot-sns-rule-test-rule"></a>

新しいルールをテストするには、MQTT クライアントを使用して、このルールで使用される MQTT メッセージを発行して、これにサブスクライブします。

新しいウィンドウの [AWS IoT コンソールで MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。これにより、MQTT クライアントの設定を失うことなくルールを編集できます。コンソールの別のページに移動するために MQTT クライアントを残しても、サブスクリプションやメッセージログは保持されません。

**MQTT クライアントを使用してルールをテストするには**

1. [AWS IoT コンソールの MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)で、入力トピック (この場合は `device/+/data`) をサブスクライブします。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

   1. [**Subscription topic**] (サブスクリプショントピック) で、入力トピックフィルター **device/\$1/data** のトピックを入力します。

   1. 残りのフィールドはデフォルト設定のままにします。

   1. [**Subscribe to topic**] を選択します。

      [**Subscriptions**] (サブスクリプション) 列の [**Publish to a topic**] (トピックへの発行) の下に **device/\$1/data** が表示されます。

1. 特定のデバイス ID **device/32/data** を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含む MQTT トピックには発行できません。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Publish to topic**] (トピックに発行) を選択します。

   1. [**Publish**] (発行) フィールドに、入力トピック名 **device/32/data** を入力します。

   1. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. **[Publish to topic]** (トピックに発行) を選択して、MQTT メッセージを発行します。

1. テキストメッセージが送信されたことを確認します。

   1. MQTT クライアントの [**Subscriptions**] (サブスクリプション) の下に、以前にサブスクライブしたトピックの隣に緑色のドットが表示されます。

      緑色のドットは、最後にメッセージを表示してから 1 つ以上の新しいメッセージが受信されたことを示します。

   1. [**Subscriptions**] (サブスクリプション) で [**device/\$1/data**] を選択して、メッセージペイロードが今発行したものと一致し、次のようになっていることを確認します。

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. SNS トピックのサブスクライブに使用した電話を確認し、メッセージペイロードの内容が次のようになっていることを確認します。

      ```
      {"device_id":"32","reported_temperature":38,"max_temperature":30}
      ```

      `device_id` 値は引用符で囲まれた文字列で、`temperature` 値は数値であることに注意してください。これは、[https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic) 関数が入力メッセージのトピック名から文字列を抽出している一方で、`temperature` 値は入力メッセージのペイロードの数値を使用することによるものです。

      `device_id` 値を数値にしたい場合は、ルールクエリステートメントで `topic(2)` を次のように置き換えます。

      ```
      cast(topic(2) AS DECIMAL)
      ```

      `topic(2)` 値を数値にキャストすると、トピックのその部分に数字のみが含まれている場合にのみ `DECIMAL` 値が機能することに注意してください。

1. 温度が制限を超えていない MQTT メッセージの送信を試みます。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Publish to topic**] (トピックに発行) を選択します。

   1. [**Publish**] (発行) フィールドに、入力トピック名 **device/33/data** を入力します。

   1. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. MQTT メッセージを送信するには、[**Publish to topic**] (トピックに発行) を選択します。

   **device/\$1/data** サブスクリプションで送信したメッセージが表示されます。ただし、温度値がルールクエリステートメントの最大温度を下回っているため、テキストメッセージは受信されません。

   正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。

### SNS メッセージルールのトラブルシューティング
<a name="iot-sns-rule-trouble"></a>

想定する結果が得られない場合に備えて、確認すべき事項をいくつか示します。
+ 

**エラーバナーが表示された**  
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
+ 

**MQTT クライアントで入力メッセージが表示されない**  
手順で説明されているように `device/+/data` トピックフィルターをサブスクライブした場合、入力メッセージを `device/22/data` トピックに発行するたびに、そのメッセージが MQTT クライアントに表示されます。

**確認すべき事項**
  + 

**サブスクライブしたトピックフィルターを確認する**  
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。

    メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
  + 

**メッセージ発行機能を確認する**  
MQTT クライアントの [**Subscriptions**] (サブスクリプション) で、[**device/\$1/data**] を選択し、パブリッシュ メッセージのトピックを確認してから、[**Publish to topic**] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
+ 

**SMS メッセージが届かない**  
ルールが機能するには、メッセージの受信と SNS 通知の送信を許可する正しいポリシーを有しており、メッセージを受信する必要があります。

**確認すべき事項**
  + 

**AWS リージョン MQTT クライアントの と作成したルールを確認する**  
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
  + 

**メッセージペイロードの温度値がテストしきい値を超えていることを確認します。**  
ルールクエリステートメントで定義されている温度値が 30 以下の場合、ルールはそのアクションを実行しません。
  + 

**ルールクエリステートメントの入力メッセージのトピックを確認する**  
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。

    ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
  + 

**入力メッセージペイロードの内容を確認する**  
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。

    ルールクエリステートメントの `temperature` フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントの `temperature` フィールドはメッセージペイロードの `temperature` フィールドと同じである必要があります。

    メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
  + 

**ルールアクションで再発行されたメッセージトピックを確認する**  
再発行ルールアクションが新しいメッセージを発行するトピックは、MQTT クライアントでサブスクライブしたトピックと一致する必要があります。

    コンソールで作成したルールを開き、ルールアクションがメッセージを再発行するトピックを確認します。
  + 

**ルールによって使用されているロールを確認する**  
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

    ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。

    これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。

## ステップ 4: 結果と次のステップを確認する
<a name="iot-sns-rule-review-results"></a>

**このチュートリアルでは、次の作業を行いました。**
+ Amazon SNS 通知トピックとサブスクリプションを作成し、テストしました。
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用して、通知用の新しいメッセージを作成しました。
+ カスタマイズされたメッセージペイロードを使用した Amazon SNS 通知を送信する AWS IoT ルールを作成しました。
+ MQTT クライアントを使用して AWS IoT ルールをテストしました。

**次の手順**  
このルールを使用していくつかのテキストメッセージを送信した後、チュートリアルの一部を変更すると、メッセージと送信される場合にどのような影響があるかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックの *device\$1id* を変更し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントで選択したフィールドを変更し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントのテストを変更して、最高温度ではなく最低温度をテストします。`max_temperature` の名前を変更することを忘れないでください\$1
+ SNS 通知の送信時に MQTT メッセージを送信する再発行ルールアクションを追加します。
+ このシリーズの次のチュートリアルを試して、[チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md) の方法を学びましょう。

# チュートリアル: デバイスデータの DynamoDB テーブルへの保存
<a name="iot-ddb-rule"></a>

このチュートリアルでは、DynamoDB テーブルにメッセージデータを送信する AWS IoT ルールを作成する方法を示します。

このチュートリアルでは、架空の気象センサーデバイスから DynamoDB テーブルにメッセージデータを送信するルールを作成します。このルールは、多くの気象センサーからのデータをフォーマットして、単一のデータベーステーブルに追加できるようにします。

**このチュートリアルで学習する内容**
+ DynamoDB テーブルの作成方法
+  AWS IoT ルールから DynamoDB テーブルにメッセージデータを送信する方法
+  AWS IoT ルールで置換テンプレートを使用する方法
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

このチュートリアルの完了には 30 分ほどかかります。

**Topics**
+ [ステップ 1: このチュートリアルの DynamoDB テーブルを作成する](#iot-ddb-rule-ddb-table)
+ [ステップ 2: DynamoDB テーブルにデータを送信する AWS IoT ルールを作成する](#iot-ddb-rule-topic-rule)
+ [ステップ 3: AWS IoT ルールと DynamoDB テーブルをテストする](#iot-ddb-rule-test)
+ [ステップ 4: 結果と次のステップを確認する](#iot-ddb-rule-review)

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+ 

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
+ 

**[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) を確認したこと**  
トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。
+ 

**[Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html) の概要を確認しました**  
これまで DynamoDB を使用したことがない場合は、[DynamoDB の開始方法](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)を確認して、DynamoDB の基本的な概念と操作に慣れてください。

## ステップ 1: このチュートリアルの DynamoDB テーブルを作成する
<a name="iot-ddb-rule-ddb-table"></a>

このチュートリアルでは、これらの属性を持つ DynamoDB テーブルを作成し、架空の気象センサーデバイスのデータを記録します。
+ `sample_time` はプライマリキーで、サンプルが記録された時間を記述します。
+ `device_id` はソートキーで、サンプルを提供したデバイスを記述します 
+ `device_data` は、デバイスから受信され、ルールクエリステートメントによってフォーマットされたデータです

**このチュートリアルの DynamoDB テーブルを作成するには**

1. [DynamoDB コンソール](https://console.aws.amazon.com//dynamodb/home)を開き、**[Create table]** (テーブルの作成) を選択します。

1. **Create table** (テーブルの作成) の

   1.  **[Table name]** (テーブル名) で、テーブル名 **wx\$1data** を入力します。

   1. **[Partition key]** (パーティションキー) で **sample\$1time** と入力し、フィールドの横にあるオプションリストで **Number** を選択します。

   1. **[Sort key]** (ソートキー) で **device\$1id** と入力します。フィールドの横にあるオプションリストで **Number** を選択します。

   1. ページの下部で、**[Create]** (作成) を選択します。

後で DynamoDB ルールアクションを設定するときに `device_data` を定義します。

## ステップ 2: DynamoDB テーブルにデータを送信する AWS IoT ルールを作成する
<a name="iot-ddb-rule-topic-rule"></a>

このステップでは、ルールクエリステートメントを使用して、架空の気象センサーデバイスからのデータをフォーマットし、データベーステーブルに書き込みます。

気象センサーデバイスから受信したサンプルメッセージペイロードは、次のようになります。

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

データベースエントリでは、ルールクエリステートメントを使用して、メッセージペイロードの構造を次のようにフラット化します。

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind_velocity": 22,
  "wind_bearing": 255
}
```

このルールでは、いくつかの [置換テンプレート](iot-substitution-templates.md) も使用します。置換テンプレートは、関数およびメッセージデータから動的値を挿入することを可能にする式です。

**DynamoDB テーブルにデータを送信する AWS IoT ルールを作成するには**

1.  AWS IoT コンソールの [[Rules]](https://console.aws.amazon.com//iot/home#/rulehub) (ルール) ハブを開きます。または、 AWS マネジメントコンソール 内で AWS IoT ホームページを開き、**メッセージルーティング＞ルール**に移動できます。

1. **[Rules]** (ルール) で新しいルールの作成を開始するには、**[Create rule]** (ルールの作成) を選択します。

1. **[Rule properties]** (ルールのプロパティ) の

   1. **[Rule name]** (ルール名) で **wx\$1data\$1ddb** と入力します。

      ルール名は AWS アカウント および リージョン内で一意である必要があり、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。

   1. **[Rule description]** (ルールの説明) で、ルールを説明します。

      わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。

1. **[次へ]** を選択して続行します。

1. **[SQL statement]** (SQL ステートメント) の

   1. [**SQL version**] (SQL バージョン) で、**2016-03-23** を選択します。

   1. [**SQL statement**] (SQL ステートメント) 編集ボックスで、ステートメントを入力します。

      ```
      SELECT temperature, humidity, barometer,
        wind.velocity as wind_velocity,
        wind.bearing as wind_bearing,
      FROM 'device/+/data'
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致するトピックを持つ MQTT メッセージをリッスンします。
      + `wind` 属性の要素を個々の属性としてフォーマットします。
      + `temperature`、`humidity`、および `barometer` 属性を変更せずに渡します。

1. **[次へ]** を選択して続行します。

1. **[Rule actions]** (ルールのアクション) で

   1. このルールのルールアクションのリストを開くには、**[Action 1]** (アクション 1) で **DynamoDB** を選択します。
**注記**  
ルールアクションとして DynamoDBv2 ではなく DynamoDB を選択してください。

   1. **[Table name]** (テーブル名) で、前の手順で作成した DynamoDB テーブルの名前 **wx\$1data** を選択します。

      **[Partition key type]** (パーティションキータイプ) および **[Sort key type]** (ソートキータイプ) のフィールドには、DynamoDB テーブルの値が入力されます。

   1. [**パーティションキー**] に「**sample\$1time**」と入力します。

   1. [**パーティションキーの値**] に「**\$1\$1timestamp()\$1**」と入力します。

      これは、このルールで使用する [置換テンプレート](iot-substitution-templates.md) の最初のものです。メッセージペイロードの値を使用する代わりに、timestamp 関数から返された値を使用します。詳細については、*AWS IoT Core デベロッパーガイド*の 「[タイムスタンプ](iot-sql-functions.md#iot-function-timestamp)」を参照してください。

   1. **[Sort key]** (ソートキー) に「**device\$1id**」と入力します。

   1. [**ソートキー値**] に「**\$1\$1cast(topic(2) AS DECIMAL)\$1**」と入力します。

      これは、このルールで使用する [置換テンプレート](iot-substitution-templates.md) の 2 番目のものです。キーの数値形式と一致するように DECIMAL 値にキャストした後、デバイスの ID である [topic] (トピック) 名の 2 番目の要素の値を挿入します。トピックの詳細については、*AWS IoT Core デベロッパーガイド*の「[トピック](iot-sql-functions.md#iot-function-topic)」を参照してください。または、キャスティングの詳細については、*AWS IoT Core デベロッパーガイド*の「[キャスト](iot-sql-functions.md#iot-sql-function-cast)」を参照してください。

   1. [**この列にメッセージデータを書き込む**] に **device\$1data** と入力します。

      これにより、DynamoDB テーブルに `device_data` 列が作成されます。

   1. [**オペレーション**] は空白のままにします。

   1. **[IAM role]** (IAM ロール) で、**[Create new role]** (新しいロールの作成) を選択します。

   1. **[Create role]** (ロールの作成) ダイアログボックスの **[Role name]** (ロール名) に **[wx\$1ddb\$1role]** と入力します。この新しいロールには、作成した **wx\$1data** DynamoDB テーブルにデータを送信する **wx\$1data\$1ddb** ルールを許可する「aws-iot-rule」というプレフィックスが付いたポリシーが自動的に含まれます。

   1. **IAM role** (IAM ロール) で **wx\$1ddb\$1role** を選択します。

   1. ページの最下部にある **[Next]** (次へ) を選択します。

1. **[Review and create]** (確認と作成) ページの最下部で、**[Create]** (作成) を選択して、ルールを作成します。

## ステップ 3: AWS IoT ルールと DynamoDB テーブルをテストする
<a name="iot-ddb-rule-test"></a>

新しいルールをテストするには、MQTT クライアントを使用して、このテストで使用した MQTT メッセージを発行し、これにサブスクライブします。

新しいウィンドウの [AWS IoT コンソールで MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。これにより、MQTT クライアントの設定を失うことなくルールを編集できます。MQTT クライアントは、サブスクリプションやメッセージログをコンソール内の別のページに移動するために残しておいても、それらを保持しません。また、別のコンソールウィンドウを[AWS IoT コンソールの DynamoDB Tables ハブ](https://console.aws.amazon.com//dynamodb/home#tables:)に開いて、ルールが送信する新しいエントリを表示することもできます。

**MQTT クライアントを使用してルールをテストするには**

1. [AWS IoT コンソールの MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)で、入力トピック `device/+/data` をサブスクライブします。

   1. MQTT クライアントで、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

   1. [**Topic filter**] (トピックフィルター) に、入力トピックフィルター **device/\$1/data** のトピックを入力します。

   1. [**Subscribe**] (サブスクライブ) を選択します。

1. 特定のデバイス ID **device/22/data** を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含む MQTT トピックには発行できません。

   1. MQTT クライアントで、[**Publish to a topic**] (トピックへの発行) を選択します。

   1. [**Topic name**] (トピック名) に、入力トピックの名前 **device/22/data** を入力します。

   1. [**Message payload**] (メッセージペイロード) に、次のサンプルデータを入力します。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. MQTT メッセージを発行するには、[**Publish**] (発行) を選択します。

   1. MQTT クライアントで、[**Subscribe to a topic**] (トピックへのサブスクライブ) を選択します。[**Subscribe**] (サブスクライブ) 列で、**device/\$1/data** サブスクリプションを選択します。前のステップのサンプルデータがそこに表示されていることを確認します。

1. ルールが作成した DynamoDB テーブルの行を確認します。

   1. [AWS IoT コンソールの DynamoDB Tables ハブで](https://console.aws.amazon.com//dynamodb/home#tables:)、**wx\$1data** を選択し、**Items** タブを選択します。

      [**Items**] (アイテム) タブを既に開いている場合は、テーブルのヘッダーの右上にある更新アイコンを選択して、表示を更新する必要がある場合があります。

   1. テーブルの **sample\$1time** 値はリンクであり、オープンであることに注意してください。最初のメッセージを送ったばかりの場合は、そのメッセージだけがリストに表示されます。

      このリンクには、テーブルのその行のすべてのデータが表示されます。

   1. **device\$1data** エントリを展開して、ルールクエリステートメントの結果のデータを表示します。

   1. この表示で使用できるデータのさまざまな表現を詳しく確認します。このディスプレイでデータを編集することもできます。

   1. このデータ行の確認が終了したら、加えた変更を保存するには [**Save**] (保存) を選択し、変更を保存せずに終了するには [**Cancel**] (キャンセル) を選択します。

正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。

### DynamoDB ルールのトラブルシューティング
<a name="iot-ddb-rule-trouble"></a>

想定する結果が表示されない場合に備えて、確認すべき事項をいくつかご紹介します。
+ 

**エラーバナーが表示された**  
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
+ 

**MQTT クライアントで入力メッセージが表示されない**  
入力メッセージを `device/22/data` トピックにサブスクライブすると、そのメッセージは MQTT クライアントに表示されます。`device/+/data`トピックフィルターを選択します。

**確認すべき事項**
  + 

**サブスクライブしたトピックフィルターを確認する**  
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。

    メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
  + 

**メッセージ発行機能を確認する**  
MQTT クライアントの [**Subscriptions**] (サブスクリプション) で、[**device/\$1/data**] を選択し、パブリッシュ メッセージのトピックを確認してから、[**Publish to topic**] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
+ 

**DynamoDB テーブルにデータが表示されない**  
まず、テーブルのヘッダーの右上にある更新アイコンを選択して、表示を更新します。探しているデータが表示されない場合は、以下を確認してください。

**確認すべき事項**
  + 

**AWS リージョン MQTT クライアントの と作成したルールを確認する**  
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
  + 

**ルールクエリステートメントの入力メッセージのトピックを確認する**  
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。

    ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
  + 

**入力メッセージペイロードの内容を確認する**  
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。

    ルールクエリステートメントの `temperature` フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントの `temperature` フィールドはメッセージペイロードの `temperature` フィールドと同じである必要があります。

    メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
  + 

**ルールアクションで使用されるキー名とフィールド名を確認する**  
トピックルールで使用されるフィールド名は、発行メッセージの JSON メッセージペイロードにあるフィールド名と一致する必要があります。

    コンソールで作成したルールを開き、そのルールを持つ MQTT クライアントで使用されているルールアクション設定のフィールド名を確認します。
  + 

**ルールによって使用されているロールを確認する**  
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

    ルールにメッセージデータの受信と DynamoDB テーブルの更新を許可するポリシーは、使用されるトピックに固有のものです。ルールで使用されるトピックまたは DynamoDB テーブル名を変更した場合は、ルールアクションのロールを更新して、ポリシーが一致するように更新する必要があります。

    これが問題であると疑われる場合は、ルールのアクションを編集し、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。

## ステップ 4: 結果と次のステップを確認する
<a name="iot-ddb-rule-review"></a>

このルールを使用して DynamoDB テーブルにいくつかのメッセージを送信した後、チュートリアルからいくつかの側面を変更すると、テーブルに書き込まれるデータにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックの *device\$1id* を変更し、データへの影響を観察します。これを使用して、複数の気象センサーからのデータ受信をシミュレートできます。
+ ルールクエリステートメントで選択したフィールドを変更し、データへの影響を確認します。これを使用すると、テーブルに保存されたデータをフィルタリングできます。
+ 再発行ルールアクションを追加して、テーブルに追加された各行について MQTT メッセージを送信します。これをデバッグに使用することができます。

このチュートリアルを完了したら、[チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md) を確認してください。

# チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする
<a name="iot-lambda-rule"></a>

このチュートリアルでは、MQTT メッセージデータを AWS Lambda アクションに送信してフォーマットし、別の AWS サービスに送信する方法を示します。このチュートリアルでは、 AWS Lambda アクションは AWS SDK を使用して、 の使用方法に関するチュートリアルで作成した Amazon SNS トピックにフォーマットされたメッセージを送信します[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)。

[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルでは、ルールのクエリステートメントから生成された JSON ドキュメントがテキストメッセージの本文として送信されました。その結果、次の例のようなテキストメッセージが表示されました。

```
{"device_id":"32","reported_temperature":38,"max_temperature":30}
```

このチュートリアルでは、 AWS Lambda ルールアクションを使用して、ルールクエリステートメントのデータを次の例のようにわかりやすい形式にフォーマットする AWS Lambda 関数を呼び出します。

```
Device 32 reports a temperature of 38, which exceeds the limit of 30.
```

このチュートリアルで作成する AWS Lambda 関数は、ルールクエリステートメントのデータを使用してメッセージ文字列をフォーマットし、 AWS SDK の [SNS 発行](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#SNS.Client.publish)関数を呼び出して通知を作成します。

**このチュートリアルで学習する内容**
+  AWS Lambda 関数を作成してテストする方法
+  AWS Lambda 関数で AWS SDK を使用して Amazon SNS 通知を発行する方法
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

このチュートリアルの完了には 45 分ほどかかります。

**Topics**
+ [ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する](#iot-lambda-rule-create-lambda)
+ [ステップ 2: AWS IoT ルールアクションを使用して AWS Lambda ルールを作成する](#iot-lambda-rule-create-rule)
+ [ステップ 3: AWS IoT ルールと AWS Lambda ルールアクションをテストする](#iot-lambda-rule-test-rule)
+ [ステップ 4: 結果と次のステップを確認する](#iot-lambda-rule-next-steps)

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+ 

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
+ 

**[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) を確認したこと**  
トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。
+ 

**このセクションのその他のルールチュートリアルを完了しました**  
このチュートリアルでは、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルで作成した SNS 通知トピックが必要です。また、このセクションの他のルール関連のチュートリアルを完了していることも前提としています。
+ 

**[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) の概要を確認する**  
 AWS Lambda を使用したことがない場合は、[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)「」と[「Lambda の開始方法](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)」を確認して、その用語と概念を確認してください。

## ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する
<a name="iot-lambda-rule-create-lambda"></a>

このチュートリアルの AWS Lambda 関数は、ルールクエリステートメントの結果を受け取り、要素をテキスト文字列に挿入し、その結果の文字列を通知のメッセージとして Amazon SNS に送信します。

通知の送信にルールアクション[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)を使用した AWS IoT のチュートリアルとは異なり、このチュートリアルは AWS SDK の 関数を使用して Lambda 関数から通知を送信します。ただし、このチュートリアルで使用されている実際の Amazon SNS 通知トピックは、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルで使用したものと同じです。

**テキストメッセージを送信する AWS Lambda 関数を作成するには**

1. 新しい AWS Lambda 関数を作成します。

   1. [AWS Lambda コンソール](https://console.aws.amazon.com//lambda/home)で、[**関数の作成**] を選択します。

   1. [**Create function**] (関数の作成) で、[**Use a blueprint**] (ブループリントを使用) を選択します。

      **hello-world-python** ブループリントを検索して選択し、[**Configure**] (設定) を選択します。

   1. [**Basic information**] (基本的な情報) で、次の操作を実行します。

      1. [**Function name**] (関数名) で、関数の名前 **format-high-temp-notification** を入力します。

      1. **実行ロール**で、** AWS ポリシーテンプレートから新しいロールを作成する**を選択します。

      1. [Role name] (ロール名) で、新しいロールの名前 **format-high-temp-notification-role** を入力します。

      1. [**Policy templates - *optional***] (ポリシーテンプレート - オプション) で、[**Amazon SNS publish policy**] (Amazon SNS 発行ポリシー) を検索して選択します。

      1. [**Create function**] を選択します。

1. ブループリントコードを変更して、Amazon SNS 通知をフォーマットして送信します。

   1. 関数を作成すると、**format-high-temp-notification** の詳細ページが表示されます。表示されない場合は、[[Lambda **Functions**](https://console.aws.amazon.com//lambda/home#/functions)] (Lambda 関数) ページから開きます。

   1. **format-high-temp-notification** の詳細ページで、[**Configuration**] (設定) タブを選択し、[**Function code**] (関数コード) パネルまでスクロールします。

   1. [**Function code**] (関数コード) ウィンドウの [**Environment**] (環境) ペインで、Python ファイル `lambda_function.py` を選択します。

   1. [**Function code**] (関数コード) ウィンドウで、ブループリントから元のプログラムコードをすべて削除し、このコードに置き換えます。

      ```
      import boto3
      #
      #   expects event parameter to contain:
      #   {
      #       "device_id": "32",
      #       "reported_temperature": 38,
      #       "max_temperature": 30,
      #       "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
      #   }
      # 
      #   sends a plain text string to be used in a text message
      #
      #      "Device {0} reports a temperature of {1}, which exceeds the limit of {2}."
      #   
      #   where:
      #       {0} is the device_id value
      #       {1} is the reported_temperature value
      #       {2} is the max_temperature value
      #
      def lambda_handler(event, context):
      
          # Create an SNS client to send notification
          sns = boto3.client('sns')
      
          # Format text message from data
          message_text = "Device {0} reports a temperature of {1}, which exceeds the limit of {2}.".format(
                  str(event['device_id']),
                  str(event['reported_temperature']),
                  str(event['max_temperature'])
              )
      
          # Publish the formatted message
          response = sns.publish(
                  TopicArn = event['notify_topic_arn'],
                  Message = message_text
              )
      
          return response
      ```

   1. [**デプロイ**] を選択します。

1. 新しいウィンドウで、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルから、Amazon SNS トピックの Amazon リソースネーム (ARN) を検索します。

   1. 新しいウィンドウで、[Amazon SNS コンソールの [Topics] (トピック) ページ](https://console.aws.amazon.com//sns/v3/home#/topics)を開きます。

   1. [**Topics**] (トピック) ページで、Amazon SNS トピックのリストから **high\$1temp\$1notice** 通知トピックを見つけます。

   1. 次のステップで使用する **high\$1temp\$1notice** 通知トピックの **ARN** を見つけます。

1. Lambda 関数のテストケースを作成します。

   1. コンソールの [[Lambda **Functions**](https://console.aws.amazon.com//lambda/home#/functions)] (Lambda 関数) ページの **format-high-temp-notification** ページで、ページの右上にある (無効に見える) [**Select a test event**] (テストイベントの選択) を選択し、[**Configure test events**] (テストイベントの設定) を選択します。

   1. [**Configure test event**] (テストイベントの設定) で、[**Create new test event**] (新しいテストイベントの作成) を選択します。

   1. [**Event name**] (イベント名) で、**SampleRuleOutput** と入力します。

   1. [**Event name**] (イベント名) の下の JSON エディタで、このサンプル JSON ドキュメントを貼り付けます。これは、 AWS IoT ルールが Lambda 関数に送信する内容の例です。

      ```
      {
        "device_id": "32",
        "reported_temperature": 38,
        "max_temperature": 30,
        "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
      }
      ```

   1. **high\$1temp\$1notice** 通知トピックの **ARN** があるウィンドウを参照し、ARN 値をコピーします。

   1. JSON エディターの `notify_topic_arn` 値を通知トピックの ARN に置き換えます。

       AWS IoT ルールを作成するときにこの ARN 値を再度使用できるように、このウィンドウを開いたままにします。

   1. [**Create**] を選択します。

1. サンプルデータを使用して関数をテストします。

   1. **format-high-temp-notification** の詳細ページの右上で、**SampleRuleOutput** が [**Test**] (テスト) ボタンの横に表示されていることを確認します。表示されない場合は、利用可能なテストイベントのリストから選択します。

   1. サンプルルール出力メッセージを関数に送信するには、[**Test**] (テスト) を選択します。

関数と通知の両方が機能した場合は、通知にサブスクライブした電話でテキストメッセージが受信されます。

電話でテキストメッセージが受信されない場合は、操作の結果を確認してください。[**Function code**] (関数コード) パネルの [**Execution result**] (実行結果) タブで、応答を確認して、発生したエラーを見つけます。関数が電話に通知を送信できるようになるまで、次のステップに進まないでください。

## ステップ 2: AWS IoT ルールアクションを使用して AWS Lambda ルールを作成する
<a name="iot-lambda-rule-create-rule"></a>

このステップでは、ルールクエリステートメントを使用して、架空の気象センサーデバイスからのデータをフォーマットして Lambda 関数に送信します。この関数は、テキストメッセージをフォーマットして送信します。

気象装置から受信したサンプルメッセージペイロードは、次のようになります。

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind": {
    "velocity": 22,
    "bearing": 255
  }
}
```

このルールでは、ルールクエリステートメントを使用して、次のような Lambda 関数のメッセージペイロードを作成します。

```
{
  "device_id": "32",
  "reported_temperature": 38,
  "max_temperature": 30,
  "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
}
```

これには、Lambda 関数が正しいテキストメッセージをフォーマットして送信するために必要なすべての情報が含まれます。

**Lambda 関数を呼び出す AWS IoT ルールを作成するには**

1. [AWS IoT コンソールの**ルール**ハブを開きます](https://console.aws.amazon.com//iot/home#/rulehub)。

1. [**Rules**] (ルール) で新しいルールの作成を開始するには、[**Create**] (作成) を選択します。

1. [**Create a rule**] (ルールを作成) の上部で、次のように操作します。

   1. [**Name**] (名前) で、ルールの名前 **wx\$1friendly\$1text** を入力します。

      ルール名は AWS アカウント および リージョン内で一意である必要があり、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。

   1.  [**Description**] (説明) で、ルールの説明を入力します。

      わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。

1. [**Create a rule**] (ルールを作成) の [**Rule query statement**] (ルールクエリステートメント) で、以下を実行します。

   1.  [**Using SQL version**] (SQL バージョンの使用) で、**2016-03-23** を選択します。

   1. [**Rule query statement**] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。

      ```
      SELECT 
        cast(topic(2) AS DECIMAL) as device_id, 
        temperature as reported_temperature,
        30 as max_temperature,
        'arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice' as notify_topic_arn
      FROM 'device/+/data' WHERE temperature > 30
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致し、`temperature` 値が 30 より大きいトピックを含む MQTT メッセージをリッスンします。
      + トピック文字列から 2 番目の要素を選択し、それを 10 進数に変換してから、`device_id` フィールドに割り当てます。
      + メッセージペイロードから `temperature` フィールドの値を選択し、それを `reported_temperature` フィールドに割り当てます。
      + 制限値を表す定数値 `30` を作成し、それを `max_temperature` フィールドに割り当てます。
      + `notify_topic_arn` フィールドの定数値を作成します。

   1. **high\$1temp\$1notice** 通知トピックの **ARN** があるウィンドウを参照し、ARN 値をコピーします。

   1. ルールクエリステートメントエディタの ARN 値 (*arn:aws:sns:us-east-1:57EXAMPLE833:high\$1temp\$1notice*) を通知トピックの ARN に置き換えます。

1. [**Set one or more actions**] (1 つ以上のアクションを設定) で、以下を実行します。

   1. このルールのルールアクションのリストを開くには、[**Add action**] (アクションの追加) を選択します。

   1. [**Select an action**] (アクションを選択してください) で、[**Send a message to a Lambda function**] (Lambda 関数にメッセージを送信する) を選択します。

   1. 選択したアクションの設定ページを開くには、アクションリストの下部にある [**Configure action**] (アクションの設定) を選択します。

1. [**Configure action**] (アクションの設定) で、次のとおり実行します。

   1. [**Function name**] (関数名) で、[**Select**] (選択) を選択します。

   1. **format-high-temp-notification** を選択します。

   1. [**Configure action**] (アクションの設定) の下部で、[**Add action**] (アクションの追加) を選択します。

   1. ルールを作成するには、[**Create a rule**] (ルールの作成) の下部にある [**Create rule**] (ルールの作成) を選択します。

## ステップ 3: AWS IoT ルールと AWS Lambda ルールアクションをテストする
<a name="iot-lambda-rule-test-rule"></a>

新しいルールをテストするには、MQTT クライアントを使用して、このルールで使用される MQTT メッセージを発行して、これにサブスクライブします。

新しいウィンドウの [AWS IoT コンソールで MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。これで、MQTT クライアントの設定を失うことなくルールを編集できるようになりました。コンソールの別のページに移動するために MQTT クライアントを残すと、サブスクリプションやメッセージログは失われます。

**MQTT クライアントを使用してルールをテストするには**

1. [AWS IoT コンソールの MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)で、入力トピック (この場合は `device/+/data`) をサブスクライブします。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Subscribe to topic**] (トピックへのサブスクライブ) を選択します。

   1. [**Subscription topic**] (サブスクリプショントピック) で、入力トピックフィルター **device/\$1/data** のトピックを入力します。

   1. 残りのフィールドはデフォルト設定のままにします。

   1. [**Subscribe to topic**] を選択します。

      [**Subscriptions**] (サブスクリプション) 列の [**Publish to a topic**] (トピックへの発行) の下に **device/\$1/data** が表示されます。

1. 特定のデバイス ID **device/32/data** を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含む MQTT トピックには発行できません。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Publish to topic**] (トピックに発行) を選択します。

   1. [**Publish**] (発行) フィールドに、入力トピック名 **device/32/data** を入力します。

   1. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. MQTT メッセージを発行するには、[**Publish to topic**] (トピックに発行) を選択します。

1. テキストメッセージが送信されたことを確認します。

   1. MQTT クライアントの [**Subscriptions**] (サブスクリプション) の下に、以前にサブスクライブしたトピックの隣に緑色のドットが表示されます。

      緑色のドットは、最後にメッセージを表示してから 1 つ以上の新しいメッセージが受信されたことを示します。

   1. [**Subscriptions**] (サブスクリプション) で [**device/\$1/data**] を選択して、メッセージペイロードが今発行したものと一致し、次のようになっていることを確認します。

      ```
      {
        "temperature": 38,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. SNS トピックのサブスクライブに使用した電話を確認し、メッセージペイロードの内容が次のようになっていることを確認します。

      ```
      Device 32 reports a temperature of 38, which exceeds the limit of 30.
      ```

      メッセージトピックのトピック ID 要素を変更する場合、`topic(2)` 値を数値にキャストすることは、メッセージトピックのその要素に数字のみが含まれている場合にのみ機能することに注意してください。

1. 温度が制限を超えていない MQTT メッセージの送信を試みます。

   1. MQTT クライアントの [**Subscription**] (サブスクリプション) で、[**Publish to topic**] (トピックに発行) を選択します。

   1. [**Publish**] (発行) フィールドに、入力トピック名 **device/33/data** を入力します。

   1. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      ```
      {
        "temperature": 28,
        "humidity": 80,
        "barometer": 1013,
        "wind": {
          "velocity": 22,
          "bearing": 255
        }
      }
      ```

   1. MQTT メッセージを送信するには、[**Publish to topic**] (トピックに発行) を選択します。

   **device/\$1/data** サブスクリプションで送信したメッセージが表示されますが、温度値がルールクエリステートメントの最大温度を下回っているため、テキストメッセージは受信されません。

   正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。

### AWS Lambda ルールと通知のトラブルシューティング
<a name="iot-lambda-rule-troubleshoot"></a>

想定する結果が得られない場合に備えて、確認すべき事項をいくつか示します。
+ 

**エラーバナーが表示された**  
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
+ 

**MQTT クライアントで入力メッセージが表示されない**  
手順で説明されているように `device/+/data` トピックフィルターをサブスクライブした場合、入力メッセージを `device/32/data` トピックに発行するたびに、そのメッセージが MQTT クライアントに表示されます。

**確認すべき事項**
  + 

**サブスクライブしたトピックフィルターを確認する**  
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。

    メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
  + 

**メッセージ発行機能を確認する**  
MQTT クライアントの [**Subscriptions**] (サブスクリプション) で、[**device/\$1/data**] を選択し、パブリッシュ メッセージのトピックを確認してから、[**Publish to topic**] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
+ 

**SMS メッセージが届かない**  
ルールが機能するには、メッセージの受信と SNS 通知の送信を許可する正しいポリシーを有しており、メッセージを受信する必要があります。

**確認すべき事項**
  + 

**AWS リージョン MQTT クライアントの と作成したルールを確認する**  
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
  + 

**メッセージペイロードの温度値がテストしきい値を超えていることを確認します。**  
ルールクエリステートメントで定義されている温度値が 30 以下の場合、ルールはそのアクションを実行しません。
  + 

**ルールクエリステートメントの入力メッセージのトピックを確認する**  
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。

    ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
  + 

**入力メッセージペイロードの内容を確認する**  
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。

    ルールクエリステートメントの `temperature` フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントの `temperature` フィールドはメッセージペイロードの `temperature` フィールドと同じである必要があります。

    メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
  + 

**Amazon SNS 通知を確認する**  
[ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する](iot-sns-rule.md#iot-sns-rule-create-sns-topic) では、Amazon SNS 通知をテストする方法を説明するステップ 3 を参照し、通知をテストして通知が機能することを確認します。
  + 

**Lambda 関数を確認する**  
[ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する](#iot-lambda-rule-create-lambda) では、テストデータを使用して Lambda 関数をテストする方法を説明するステップ 5 を参照し、Lambda 関数をテストします。
  + 

**ルールによって使用されているロールを確認する**  
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

    ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。

    これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。

## ステップ 4: 結果と次のステップを確認する
<a name="iot-lambda-rule-next-steps"></a>

**このチュートリアルでは、次の作業を行いました。**
+ カスタマイズされたメッセージペイロードを使用した Amazon SNS 通知を送信する Lambda 関数を呼び出す AWS IoT ルールを作成しました。
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用して、Lambda 関数の新しいメッセージペイロードを作成しました。
+ MQTT クライアントを使用して AWS IoT ルールをテストしました。

**次の手順**  
このルールを使用していくつかのテキストメッセージを送信した後、チュートリアルの一部を変更すると、メッセージと送信される場合にどのような影響があるかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックの *device\$1id* を変更し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントで選択したフィールドを変更し、Lambda 関数を更新して新しいメッセージで使用し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントのテストを変更して、最高温度ではなく最低温度をテストします。Lambda 関数を更新して新しいメッセージをフォーマットし、`max_temperature` の名前を変更することを忘れないでください。
+  AWS IoT ルールの開発中および使用中に発生する可能性のあるエラーを見つける方法の詳細については、「」を参照してください[モニタリング AWS IoT](monitoring_overview.md)。

# デバイスがオフラインになっている間にデバイスの状態をデバイスシャドウで保持する
<a name="iot-shadows-tutorial"></a>

これらのチュートリアルでは、 AWS IoT Device Shadow サービスを使用してデバイスの状態情報を保存および更新する方法を示します。JSON ドキュメントである Shadow ドキュメントは、デバイス、ローカルアプリケーション、またはサービスによって発行されたメッセージに基づいて、デバイスの状態の変化を示します。このチュートリアルでは、Shadow ドキュメントが電球の色の変化を示します。これらのチュートリアルでは、デバイスがインターネットから切断されている場合でもシャドウがこの情報を保存し、オンラインに戻ってこの情報をリクエストしたときに最新の状態情報をデバイスに返す方法も示しています。

ここに示されている順序でこれらのチュートリアルを試すことをお勧めします。この順序は、作成が必要な AWS IoT リソースと必要なハードウェアのセットアップから始まります。これは、概念を段階的に学ぶのにも役立ちます。これらのチュートリアルでは、 で使用する Raspberry Pi デバイスを設定して接続する方法を示します AWS IoT。必要なハードウェアがない場合は、選択したデバイスに適応させるか、[Amazon EC2 で仮想デバイスを作成](creating-a-virtual-thing.md)して、これらのチュートリアルに従うことができます。

**チュートリアルのシナリオの概要**  
これらのチュートリアルのシナリオは、電球の色を変更し、そのデータを予約済みのシャドウトピックに発行するローカルアプリケーションまたはサービスです。これらのチュートリアルは、[インタラクティブな開始方法のチュートリアル](interactive-demo.md)で説明されている Device Shadow 機能に似ており、Raspberry Pi デバイスに実装されています。このセクションのチュートリアルでは、名前付きのシャドウまたは複数のデバイスに対応する方法を示しつつ、単一のクラシックシャドウに焦点を当てます。

以下のチュートリアルは、 AWS IoT Device Shadow サービスの使用方法を学ぶのに役立ちます。
+ 

**[チュートリアル: シャドウアプリケーションを実行するための Raspberry Pi の準備](create-resources-shadow.md)**  
このチュートリアルでは、 に接続するための Raspberry Pi デバイスを設定する方法を示します AWS IoT。また、 AWS IoT ポリシードキュメントとモノのリソースを作成し、証明書をダウンロードして、そのモノのリソースにポリシーをアタッチします。このチュートリアルの完了には 30 分ほどかかります。
+ 

**[チュートリアル: Device SDK のインストールと Device Shadows のサンプルアプリケーションの実行](lightbulb-shadow-application.md)**  
このチュートリアルでは、必要なツール、ソフトウェア、 AWS IoT Device SDK for Python をインストールし、サンプルシャドウアプリケーションを実行する方法を示します。このチュートリアルは、[Raspberry Pi または他のデバイスを接続する](connecting-to-existing-device.md) に示されている概念に基づいており、完了までに 20 分かかります。
+ 

**[チュートリアル: サンプルアプリケーションと MQTT テストクライアントを使用した Device Shadow とのやり取り](interact-lights-device-shadows.md)**  
このチュートリアルでは、`shadow.py`サンプルアプリケーションと**AWS IoT コンソール**を使用して、 AWS IoT Device Shadows と電球の状態の変化との相互作用を観察する方法を示します。このチュートリアルでは、MQTT メッセージを Device Shadow の予約済みトピックに送信する方法も示しています。このチュートリアルの完了には 45 分間を要する場合があります。

**AWS IoT Device Shadow の概要**  
Device Shadow は、 AWS IoT レジストリで作成した[モノのリソース](iot-thing-management.md)によって管理されるデバイスの永続的な仮想表現です。Shadow ドキュメントは、デバイスの現在の状態の情報を保存および取得するために使用される JSON または JavaScript 表記のドキュメントです。シャドウを使用すれば、デバイスがインターネットに接続されているかどうかにかかわらず、MQTT トピックまたは HTTP REST API を介してデバイスの状態を取得および設定できます。

シャドウのドキュメントには、デバイスの状態の次の側面を説明する `state` プロパティが含まれています。
+ `desired`: アプリケーションは、`desired` オブジェクトを更新することによって、デバイスプロパティの必要な状態を指定します。
+ `reported`: デバイスは、`reported` オブジェクト内の現在の状態を報告します。
+ `delta`: `delta` オブジェクト内の目的の状態と報告された状態 AWS IoT の違いを報告します。

これは、Shadow 状態ドキュメントの例です。

```
{
  "state": {
    "desired": {
      "color": "green"
      },
    "reported": {
      "color": "blue"
      },
    "delta": {
      "color": "green"
      }
   }
}
```

デバイスの Shadow ドキュメントを更新するには、[予約済みの MQTT トピック](reserved-topics.md#reserved-topics-shadow)、HTTP で `GET`、`UPDATE`、および `DELETE` オペレーションをサポートする [Device Shadow REST API](device-shadow-rest-api.md)、ならびに [AWS IoT CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot-data/index.html) を使用できます。

前の例で、`desired` 色を `yellow` に変更したいとします。これを行うには、[UpdateThingShadow](device-shadow-rest-api.md#API_UpdateThingShadow) API にリクエストを送信するか、[Update](device-shadow-mqtt.md#update-pub-sub-topic) トピック `$aws/things/THING_NAME/shadow/update` にメッセージを発行します。

```
{
  "state": {
    "desired": {
      "color": yellow
    }
  }
}
```

更新は、リクエストで指定したフィールドにのみ反映されます。Device Shadow が正常に更新されると、 は`delta`トピック に新しい`desired`状態 AWS IoT を発行します`$aws/things/THING_NAME/shadow/delta`。この場合の Shadow ドキュメントは次のようになります。

```
{
  "state": {
    "desired": {
      "color": yellow
    },
    "reported": {
      "color": green
    },
    "delta": {
      "color": yellow
      }
  }
}
```

次に、次の JSON メッセージ`$aws/things/THING_NAME/shadow/update`を含む `Update`トピックを使用して、新しい状態が AWS IoT Device Shadow に報告されます。

```
{
  "state": {
    "reported": {
      "color": yellow
    }
  }
}
```

現在の状態情報を取得する場合は、[GetThingShadow](device-shadow-rest-api.md#API_GetThingShadow) API にリクエストを送信するか、MQTT メッセージを [Get](device-shadow-mqtt.md#get-pub-sub-topic) トピック `$aws/things/THING_NAME/shadow/get` に発行します。

Device Shadow サービスの使用の詳細については、「[AWS IoT Device Shadow サービス](iot-device-shadows.md)」を参照してください。

デバイス、アプリケーション、およびサービスでの Device Shadow の使用の詳細については、[デバイスでのシャドウの使用](device-shadow-comms-device.md) および [アプリとサービスでのシャドウの使用](device-shadow-comms-app.md) を参照してください。

 AWS IoT シャドウの操作については、「」を参照してください[シャドウとの相互作用](device-shadow-data-flow.md)。

MQTT の予約済みトピックおよび HTTP REST API については、[Device Shadow MQTT トピック](device-shadow-mqtt.md) および [Device Shadow の REST API](device-shadow-rest-api.md) を参照してください。

# チュートリアル: シャドウアプリケーションを実行するための Raspberry Pi の準備
<a name="create-resources-shadow"></a>

このチュートリアルでは、Raspberry Pi デバイスをセットアップして設定し、デバイスが MQTT メッセージを接続および交換するために必要な AWS IoT リソースを作成する方法を示します。

**注記**  
[Amazon EC2 を使用して仮想デバイスを作成する](creating-a-virtual-thing.md) する予定がある場合は、このページをスキップして [デバイスを設定する](configure-device.md) に進むことができます。仮想のモノを作成するときに、これらのリソースを作成します。Raspberry Pi の代わりに別のデバイスを使用したい場合は、選択したデバイスに合わせてこれらのチュートリアルに従ってみてください。

**このチュートリアルの学習内容は次のとおりです。**
+ Raspberry Pi デバイスを設定し、 で使用するように設定します AWS IoT。
+ デバイスが サービスとやり取り AWS IoT することを許可する AWS IoT ポリシードキュメントを作成します。
+ X.509 デバイス証明書にモノ AWS IoT のリソースを作成し、ポリシードキュメントをアタッチします。

  モノは、 AWS IoT レジストリ内のデバイスの仮想表現です。証明書はデバイスを AWS IoT Core に認証し、ポリシードキュメントはデバイスを操作することを許可します AWS IoT。

**このチュートリアルを実行する方法**  
Device Shadows の `shadow.py` サンプルアプリケーションを実行するには、 AWS IoTに接続する Raspberry Pi デバイスが必要です。ここに示されている順序でこのチュートリアルに従うことをお勧めします。この順序では、最初に Raspberry Pi とその付属内容を設定してから、ポリシーを作成し、作成したモノのリソースにポリシーをアタッチします。その後、Raspberry Pi でサポートされているグラフィカルユーザーインターフェイス (GUI) を使用してデバイスのウェブブラウザで AWS IoT コンソールを開くことで、このチュートリアルに従うことができます。これにより、接続のために証明書を Raspberry Pi に直接ダウンロードしやすくなります AWS IoT。

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+  AWS アカウント。アカウントをお持ちではない場合、続行する前に、[セットアップ AWS アカウント](setting-up.md) に記載されている手順を完了してください。このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
+ Raspberry Pi とその必要な付属内容。次が必要になります。
  + [Raspberry Pi 3 モデル B](https://www.raspberrypi.com/products/) 以降の最新のモデル。このチュートリアルは、Raspberry Pi の以前のバージョンでも機能する可能性がありますが、テストはしていません。
  + [Raspberry Pi OS (32 ビット)](https://www.raspberrypi.com/software/operating-systems/)または、それ以降。Raspberry Pi OS の最新バージョンを使用することをお勧めします。以前のバージョンの OS でも動作する可能性がありますが、テストはしていません。
  + イーサネットまたは Wi-Fi 接続。
  + キーボード、マウス、モニタ、ケーブル、および電源。

このチュートリアルの完了には 30 分ほどかかります。

## ステップ 1: Raspberry Pi デバイスをセットアップおよび設定する
<a name="setup-device-shadow"></a>

このセクションでは、 で使用する Raspberry Pi デバイスを設定します AWS IoT。

**重要**  
これらの指示を他のデバイスやオペレーティングシステムに合わせて適用するのが難しい場合があります。これらの指示を解釈してご利用のデバイスに適用するには、そのデバイスを十分に理解する必要があります。問題が発生した場合は、[Amazon EC2 を使用して仮想デバイスを作成する](creating-a-virtual-thing.md) または [Windows または Linux の PC または Mac を AWS IoT デバイスとして使用する](using-laptop-as-device.md) など、他のデバイスオプションのいずれかを代替策として試してください。

Raspberry Pi を設定して、オペレーティングシステム (OS) を起動し、インターネットに接続し、コマンドラインインターフェイスで Raspberry Pi とインタラクションできるようにする必要があります。Raspberry Pi でサポートされているグラフィカルユーザーインターフェイス (GUI) を使用して AWS IoT コンソールを開き、このチュートリアルの残りの部分を実行することもできます。

**Raspberry Pi をセットアップするには**

1. SD カードを Raspberry Pi の MicroSD カードスロットに挿入します。一部の SD カードには、ボードの起動後に OS をインストールするためのメニューを表示するインストールマネージャーがプリロードされています。Raspberry Pi イメージャーを使用して、カードに OS をインストールすることもできます。

1. Raspberry Pi の HDMI ポートに接続する HDMI ケーブルに、HDMI TV またはモニターを接続します。

1. キーボードとマウスを Raspberry Pi の USB ポートに接続し、電源アダプタをつないでボードを起動します。

Raspberry Pi の起動後、SD カードにインストールマネージャーがプリロードされている場合は、オペレーティングシステムをインストールするためのメニューが表示されます。OS のインストールに問題がある場合は、次の手順を試すことができます。Raspberry Pi のセットアップの詳細については、「[Raspberry Pi のセットアップ](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/)」を参照してください。

**Raspberry Pi のセットアップで問題が発生している場合は、以下の操作を実行します。**
+ ボードを起動する前に、SD カードを挿入したかどうかを確認してください。ボードを起動した後に SD カードを差し込むと、インストールメニューが表示されない場合があります。
+ テレビまたはモニタの電源が入っていて、正しい入力が選択されていることを確認してください。
+ Raspberry Pi と互換性のあるソフトウェアを使用していることを確認します。

Raspberry Pi OS をインストールして設定したら、Raspberry Pi のウェブブラウザを開き、 AWS IoT Core コンソールに移動して、このチュートリアルの残りのステップを続行します。

 AWS IoT Core コンソールを開くことができる場合は、Raspberry Pi の準備が整い、 に進むことができます[チュートリアル: でのデバイスのプロビジョニング AWS IoT](shadow-provision-cloud.md)。

問題がある場合や、さらにサポートが必要な場合は、「[Getting help for your Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/5)」を参照してください。

# チュートリアル: でのデバイスのプロビジョニング AWS IoT
<a name="shadow-provision-cloud"></a>

このセクションでは、チュートリアルで使用する AWS IoT Core リソースを作成します。

**Topics**
+ [ステップ 1: Device Shadow の AWS IoT ポリシーを作成する](#create-policy-shadow)
+ [ステップ 2: モノのリソースを作成し、ポリシーをモノにアタッチする](#create-thing-shadow)
+ [ステップ 3: 結果と次のステップを確認する](#resources-shadow-review)

## ステップ 1: Device Shadow の AWS IoT ポリシーを作成する
<a name="create-policy-shadow"></a>

X.509 証明書 AWS IoT Core AWS IoT は、デバイスが Device Shadow サービスで使用される MQTT 予約トピックへのサブスクライブや発行などの AWS IoT オペレーションを実行できるようにする証明書にアタッチされます。デバイスは、接続してメッセージを送信するときに証明書を提示します AWS IoT Core。

この手順では、サンプルプログラムの実行に必要な AWS IoT オペレーションをデバイスが実行できるようにするポリシーを作成します。タスクの実行に必要なアクセス許可のみを付与するポリシーを作成することをお勧めします。最初に AWS IoT ポリシーを作成し、後で作成するデバイス証明書にアタッチします。

**AWS IoT ポリシーを作成するには**

1. 左のメニューで、[**Secure**] (安全性)、[**Policies**] (ポリシー) の順に選択します。アカウントに既存のポリシーがある場合は、**[作成]** を選択します。それ以外の場合は、**[ポリシーがまだありません]** ページで **[ポリシーの作成]** を選択します。

1. [**ポリシーの作成**] ページで、以下の手順を実行します。

   1. **[名前]** フィールドに、ポリシーの名前 (**My\$1Device\$1Shadow\$1policy** など) を入力します。ポリシー名で個人を特定できる情報を使用しないでください。

   1. ポリシードキュメントでは、MQTT 予約トピックを発行およびサブスクライブするアクセス許可をデバイスに付与する接続、サブスクライブ、受信、および発行アクションについて説明します。

      以下のサンプルポリシーをコピーして、ポリシードキュメントに貼り付けます。`thingname` を、作成するモノの名前 ( など`My_light_bulb`)、 をサービスを使用している`region` AWS IoT リージョン、 をお客様の AWS アカウント 番号`account`に置き換えます。 AWS IoT ポリシーの詳細については、「」を参照してください[AWS IoT Core ポリシー](iot-policies.md)。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/get",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/get/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/get/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update/delta"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/get/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/get/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/update/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/update/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/update/delta"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": "iot:Connect",
                  "Resource": "arn:aws:iot:us-east-1:123456789012:client/test-*"
              }
          ]
      }
      ```

## ステップ 2: モノのリソースを作成し、ポリシーをモノにアタッチする
<a name="create-thing-shadow"></a>

に接続されたデバイスは、 AWS IoT レジストリ内の*モノのリソース*で表す AWS IoT ことができます。*モノのリソース*は、このチュートリアルの電球など、特定のデバイスまたは論理エンティティを表します。

でモノを作成する方法については AWS IoT、「」で説明されている手順に従ってください[モノのオブジェクトを作成する](create-iot-resources.md#create-aws-thing)。そのチュートリアルの手順に従うときに注意すべき重要な点がいくつかあります。

1. **[単一のモノを作成する]** を選択し、**[名前]** フィールドに、以前にポリシーを作成したときに指定した `thingname` と同じモノの名前 (例: `My_light_bulb`) を入力します。

   モノを作成した後に名前を変更することはできません。`thingname` 以外の名前を付けた場合は、`thingname` という名前の新しいモノを作成し、古いモノを削除します。
**注記**  
モノの名前で個人を特定できる情報を使用しないでください。モノの名前は、暗号化されていない通信やレポートに表示されることがあります。

1. **[証明書が作成されました\$1]** ページの各証明書ファイルを見つけやすい場所にダウンロードすることをお勧めします。サンプルアプリケーションを実行するには、これらのファイルをインストールする必要があります。

   Raspberry Pi の `home` ディレクトリ内の `certs` サブディレクトリにファイルをダウンロードし、次の表に示されているように、各ファイルに簡素な名前を付けることをお勧めします。  
**証明書ファイル名**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/shadow-provision-cloud.html)

1. 証明書を有効にして接続を有効にしたら AWS IoT、**ポリシーをア**タッチを選択し、以前に作成したポリシー ( など**My\$1Device\$1Shadow\$1policy**) をモノにアタッチしていることを確認します。

   モノを作成したら、モノのリソースが AWS IoT コンソールのモノのリストに表示されます。

## ステップ 3: 結果と次のステップを確認する
<a name="resources-shadow-review"></a>

**このチュートリアルで学習した内容は次のとおりです。**
+ Raspberry Pi デバイスをセットアップおよび設定します。
+ デバイスが サービスとやり取り AWS IoT することを許可する AWS IoT ポリシードキュメントを作成します。
+ モノのリソースと関連する X.509 デバイス証明書を作成し、それにポリシードキュメントをアタッチします。

**次の手順**  
 AWS IoT デバイス SDK for Python をインストールし、`shadow.py`サンプルアプリケーションを実行し、Device Shadows を使用して状態を制御できるようになりました。このチュートリアルの実行方法の詳細については、[チュートリアル: Device SDK のインストールと Device Shadows のサンプルアプリケーションの実行](lightbulb-shadow-application.md) を参照してください。

# チュートリアル: Device SDK のインストールと Device Shadows のサンプルアプリケーションの実行
<a name="lightbulb-shadow-application"></a>

このセクションでは、必要なソフトウェアと AWS IoT Device SDK for Python をインストールし、`shadow.py`サンプルアプリケーションを実行して Shadow ドキュメントを編集し、シャドウの状態を制御する方法について説明します。

**このチュートリアルの学習内容は次のとおりです。**
+ インストールされているソフトウェアと AWS IoT Device SDK for Python を使用して、サンプルアプリケーションを実行します。
+ サンプルアプリケーションを使用して値を入力すると、どのように AWS IoT コンソールで目的の値が発行されるかについて説明します。
+ `shadow.py` サンプルアプリケーションと、MQTT プロトコルを使用してシャドウの状態を更新する方法を確認してください。

**このチュートリアルを実行する前に:**  
をセットアップし AWS アカウント、Raspberry Pi デバイスを設定し、Device Shadow サービスの MQTT 予約済みトピックを発行およびサブスクライブするアクセス許可をデバイスに付与する AWS IoT モノとポリシーを作成しておく必要があります。詳細については、「[チュートリアル: シャドウアプリケーションを実行するための Raspberry Pi の準備](create-resources-shadow.md)」を参照してください。

Git、Python、および AWS IoT Device SDK for Python もインストールされている必要があります。このチュートリアルは、チュートリアル [Raspberry Pi または他のデバイスを接続する](connecting-to-existing-device.md) で提示された概念に基づいています。そのチュートリアルをまだ試していない場合は、そのチュートリアルで説明されている手順に従って証明書ファイルと Device SDK をインストールしてから、このチュートリアルに戻って `shadow.py` サンプルアプリケーションを実行することをお勧めします。

**Topics**
+ [ステップ 1: shadow.py サンプルアプリケーションを実行する](#run-sample-application-shadows)
+ [ステップ 2: shadow.py Device SDK サンプルアプリケーションを確認する](#review-shadow-sample-code)
+ [ステップ 3: `shadow.py` サンプルアプリケーションの問題をトラブルシューティングする](#shadow-sample-app-troubleshoot)
+ [ステップ 4: 結果と次のステップを確認する](#sample-app-shadow-review)

このチュートリアルの完了には 20 分ほどかかります。

## ステップ 1: shadow.py サンプルアプリケーションを実行する
<a name="run-sample-application-shadows"></a>

`shadow.py` サンプルアプリケーションを実行する前に、インストールした証明書ファイルの名前と場所に加えて、次の情報が必要です。


**アプリケーションパラメータ値**  

|  Parameter  |  値がある場所  | 
| --- | --- | 
| your-iot-thing-name |  で前に作成した AWS IoT モノの名前[ステップ 2: モノのリソースを作成し、ポリシーをモノにアタッチする](shadow-provision-cloud.md#create-thing-shadow)。 この値を見つけるには、[AWS IoT コンソール](https://console.aws.amazon.com/iot/home)で [**Manage**] (管理) を選択し、[**Things**] (モノ) を選択します。  | 
| your-iot-endpoint |   *your-iot-endpoint* 値の形式は `endpoint_id-ats.iot.region.amazonaws.com` です (例: `a3qj468EXAMPLE-ats.iot.us-west-2.amazonaws.com`)。この値を検索するには: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/lightbulb-shadow-application.html)  | 

**サンプルアプリケーションをインストールして実行する**

1. サンプルアプリディレクトリに移動します。

   ```
   cd ~/aws-iot-device-sdk-python-v2/samples/service-clients
   ```

1. コマンドラインウィンドウで、示されているように *your-iot-endpoint* と *your-iot-thing-name* を置き換えて、このコマンドを実行します。

   ```
   python3 shadow.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint --thing_name your-iot-thing-name
   ```

1. サンプルアプリケーションが次のようになっていることを観察します。

   1. アカウントの AWS IoT サービスに接続します。

   1. `Delta` イベントと `Update` および `Get` 応答をサブスクライブします。

   1. ターミナルに必要な値を入力するように求められます。

   1. 次のような出力を表示します。

   ```
   Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'...
   Connected!
   Subscribing to Delta events...
   Subscribing to Update responses...
   Subscribing to Get responses...
   Requesting current shadow state...
   Launching thread to read user input...
   Finished getting initial shadow state.
   Shadow contains reported value 'off'.
   Enter desired value:
   ```

**注記**  
`shadow.py` サンプルアプリケーションの実行に問題がある場合は、[ステップ 3: `shadow.py` サンプルアプリケーションの問題をトラブルシューティングする](#shadow-sample-app-troubleshoot) を確認してください。問題の修正に役立つ可能性のある追加情報を取得するには、コマンドラインに `--verbosity debug` パラメータを追加して、サンプルアプリケーションが実行内容に関する詳細メッセージを表示するようにします。

**値を入力し、Shadow ドキュメントの更新を観察する**  
ターミナルに `desired` 値を入力して値を指定すると、`reported` 値も更新されます。ターミナルで色 `yellow` を入力するとします。`reported` 値も色 `yellow` に更新されます。ターミナルに表示されるメッセージを次に示します。

```
Enter desired value:
yellow
Changed local shadow value to 'yellow'.
Updating reported shadow value to 'yellow'...
Update request published.
Finished updating reported shadow value to 'yellow'.
```

この更新リクエストを発行すると、 はモノのリソースのデフォルトのクラシックシャドウ AWS IoT を作成します。 AWS IoT コンソールで `reported`および `desired`値に発行した更新リクエストを確認するには、作成したモノのリソースの Shadow ドキュメントを確認します (例: `My_light_bulb`)。Shadow ドキュメントで更新を表示するには、次の操作を行います。

1.  AWS IoT コンソールで、**管理**を選択し、**モノ**を選択します。

1. 表示されるモノのリストで、作成したモノを選択し、[**Shadows**] (シャドウ) を選択してから、[**Classic Shadow**] (クラシックシャドウ) を選択します。

Shadow ドキュメントは次のようになり、色 `yellow` に設定された `reported` と `desired` の値が表示されます。これらの値は、ドキュメントの **[Shadow の状態]** のセクションに表示されます。

```
{
"desired": {
  "welcome": "aws-iot",
  "color": "yellow"
},
"reported": {
  "welcome": "aws-iot",
  "color": "yellow"
}
}
```

リクエストのタイムスタンプ情報とバージョン番号を含む **[メタデータ]** セクションも表示されます。

状態ドキュメントのバージョンを使用して、デバイスのシャドウのドキュメントの最新バージョンを更新していることを確認できます。別の更新リクエストを送信すると、バージョン番号が 1 ずつ増えます。更新リクエストでバージョンを渡したとき、そのバージョンと状態ドキュメントの現在のバージョンとが一致しない場合、サービスは HTTP 409 conflict レスポンスコードでリクエストを拒否します。

```
{
"metadata": {
  "desired": {
    "welcome": {
      "timestamp": 1620156892
    },
    "color": {
      "timestamp": 1620156893
    }
  },
  "reported": {
    "welcome": {
      "timestamp": 1620156892
    },
    "color": {
      "timestamp": 1620156893
    }
  }
},
"version": 10
}
```

Shadow ドキュメントについてさらに学び、状態情報の変化を観察するには、このチュートリアルの [ステップ 4: 結果と次のステップを確認する](#sample-app-shadow-review) セクションで説明されている次のチュートリアル [チュートリアル: サンプルアプリケーションと MQTT テストクライアントを使用した Device Shadow とのやり取り](interact-lights-device-shadows.md) に進んでください。必要に応じて、次のセクションで `shadow.py` サンプルコードとそれが MQTT プロトコルを使用する方法について学ぶこともできます。

## ステップ 2: shadow.py Device SDK サンプルアプリケーションを確認する
<a name="review-shadow-sample-code"></a>

このセクションでは、このチュートリアルで使用されている **AWS IoT Device SDK v2 for Python** の `shadow.py` サンプルアプリケーションを確認します。ここでは、MQTT および MQTT over WSS プロトコル AWS IoT Core を使用して に接続する方法を確認します。[AWS 共通ランタイム (AWS-CRT)](https://github.com/awslabs/aws-crt-python#aws-crt-python) ライブラリは、低レベルの通信プロトコルサポートを提供し、 AWS IoT Device SDK v2 for Python に含まれています。

このチュートリアルでは MQTT と MQTT over WSS を使用していますが、 は HTTPS リクエストを発行するデバイス AWS IoT をサポートしています。デバイスから HTTP メッセージを送信する Python プログラムの例については、Python の `requests` ライブラリを使用した [HTTPS コード例](http.md#codeexample)を参照してください。

デバイス通信に使用するプロトコルについて十分な情報に基づいた決定を行う方法については、[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection) を確認してください。

**MQTT**  
`shadow.py` サンプルでは、[https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py) の `mtls_from_path` (以下に示されています) を呼び出して、MQTT プロトコルを使用して AWS IoT Core との接続を確立します。`mtls_from_path` では、X.509 証明書と TLS v1.2 を使用してデバイスを認証します。 AWS CRT ライブラリは、その接続の下位の詳細を処理します。

```
mqtt_connection = mqtt_connection_builder.mtls_from_path(
  endpoint=args.endpoint,
  cert_filepath=args.cert,
  pri_key_filepath=args.key,
  ca_filepath=args.ca_file,
  client_bootstrap=client_bootstrap,
  on_connection_interrupted=on_connection_interrupted,
  on_connection_resumed=on_connection_resumed,
  client_id=args.client_id,
  clean_session=False,
  keep_alive_secs=6
)
```
+ `endpoint` は、コマンドラインから渡した AWS IoT エンドポイントであり、 でこのデバイスを一意に識別する ID `client_id`です AWS リージョン。
+ `cert_filepath`、`pri_key_filepath`、および `ca_filepath` は、デバイスの証明書とプライベートキーファイル、およびルート CA ファイルへのパスです。
+ `client_bootstrap` は、ソケット通信アクティビティを処理する共通のランタイムオブジェクトであり、`mqtt_connection_builder.mtls_from_path` の呼び出しの前にインスタンス化されます。
+ `on_connection_interrupted` および `on_connection_resumed` は、デバイスの接続が中断されて再開されるときに呼び出すコールバック関数です。
+ `clean_session` は、新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合) です。`keep_alive_secs` は `CONNECT` リクエストで送信するキープアライブ値 (秒単位) です。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

この `shadow.py` サンプルでは、WSS 経由で MQTT プロトコルを使用して AWS IoT Core との接続を確立するために [https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py) の `websockets_with_default_aws_signing` も呼び出します。MQTT over WSS も MQTT と同じパラメータを使用し、次の追加パラメータを受け取ります。
+ `region` は、 AWS 署名 V4 認証で使用される署名リージョンであり、認証に使用するために提供される AWS 認証情報`credentials_provider`です。リージョンはコマンドラインから渡され、`credentials_provider` オブジェクトは `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの直前にインスタンス化されます。
+ `websocket_proxy_options` は、プロキシホストを使用する場合の HTTP プロキシオプションです。`shadow.py` サンプルアプリケーションでは、この値は `mqtt_connection_builder.websockets_with_default_aws_signing` の呼び出しの直前にインスタンス化されます。

**Shadow トピックとイベントをサブスクライブする**  
`shadow.py` サンプルは接続の確立を試み、完全に接続されるまで待機します。接続されていない場合、コマンドはキューに入れられます。接続されると、サンプルはデルタイベントをサブスクライブし、メッセージを更新および取得し、サービスの品質 (QoS) レベル 1 (`mqtt.QoS.AT_LEAST_ONCE`) でメッセージを発行します。

デバイスが QoS レベル 1 のメッセージをサブスクライブすると、メッセージブローカーは、デバイスに送信できるようになるまで、デバイスがサブスクライブしているメッセージを保存します。メッセージブローカーは、デバイスから `PUBACK` 応答を受信するまでメッセージを再送信します。

MQTT プロトコルの詳細については、[MQTT プロトコルを確認する](sdk-tutorials.md#sdk-tutorials-mqtt-review) および [MQTT](mqtt.md) を参照してください。

このチュートリアルで使用される MQTT、MQTT over WSS、永続セッション、および QoS レベルの詳細については、「[pubsub.py Device SDK サンプルアプリケーションを確認する](sdk-tutorials.md#sdk-tutorials-explore-sample)」を参照してください。

## ステップ 3: `shadow.py` サンプルアプリケーションの問題をトラブルシューティングする
<a name="shadow-sample-app-troubleshoot"></a>

`shadow.py` サンプルアプリケーションを実行すると、ターミナルにいくつかのメッセージが表示され、`desired` 値を入力するように求められます。プログラムがエラーをスローした場合、エラーをデバッグするには、まずシステムに対して正しいコマンドを実行したかどうかを確認します。

場合によっては、エラーメッセージは接続の問題を示し、`Host name was invalid for dns resolution` または `Connection was closed unexpectedly` のようになることがあります。このような場合、次のことを確認してみてください。
+ 

**コマンド内のエンドポイントアドレスを確認する**  
サンプルアプリケーションを実行するために入力したコマンドの `endpoint` 引数 (例: `a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com`) を確認し、**AWS IoT コンソール**でこの値を確認します。

  正しい値を使用したかどうかを確認するには、次の手順に従います。

  1. **AWS IoT コンソール**で、[**Manage**] (管理)、[**Things**] (モノ) の順に選択します。

  1. サンプルアプリケーション用に作成したモノ (例: **My\$1light\$1bulb**) を選択してから、[**Interact**] (操作) を選択します。

  モノの詳細ページで エンドポイントは、[**HTTPS**] セクションに表示されます。また、以下を記載したメッセージも表示されます: `This thing already appears to be connected.`。
+ 

**証明書の有効化を確認する**  
証明書は、 を使用してデバイスを認証します AWS IoT Core。

  証明書がアクティブかどうかを確認するには、次の手順に従います。

  1. **AWS IoT コンソール**で、[**Manage**] (管理)、[**Things**] (モノ) の順に選択します。

  1. サンプルアプリケーション用に作成したモノ (例: **My\$1light\$1bulb**) を選択してから、[**Security**] (セキュリティ) を選択します。

  1. 証明書を選択し、証明書の詳細ページで [証明書の選択] を選択してから、証明書の詳細ページで **[アクション]** を選択します。

  ドロップダウンリストで **[有効化]** が使用できず、**[無効化]** しか選択できない場合、証明書は有効です。そうでない場合は、**[有効化]** を選択し、サンプルプログラムを再実行します。

  それでもプログラムが実行されない場合は、`certs` フォルダ内の証明書ファイル名を確認してください。
+ 

**モノのリソースにアタッチされているポリシーを確認する**  
証明書がデバイスを認証している間、 AWS IoT ポリシーにより、デバイスは MQTT 予約済みトピックへのサブスクライブや発行などの AWS IoT オペレーションを実行できます。

  正しいポリシーがアタッチされているかどうかを確認するには、次の手順に従います。

  1. 前述したとおりに証明書を検索し、**[ポリシー]** を選択します。

  1. 表示されたポリシーを選択し、デバイスに MQTT 予約トピックへ発行およびサブスクライブするためのアクセス許可を付与する `connect`、`subscribe`、`receive`、および `publish` アクションが説明されているかどうかを確認します。

     サンプルポリシーについては、[ステップ 1: Device Shadow の AWS IoT ポリシーを作成する](shadow-provision-cloud.md#create-policy-shadow) を参照してください。

  への接続に問題があることを示すエラーメッセージが表示された場合は AWS IoT、ポリシーに使用しているアクセス許可が原因である可能性があります。その場合は、 AWS IoT リソースへのフルアクセスを提供するポリシーから開始し、サンプルプログラムを再実行することをお勧めします。現在のポリシーを編集するか、現在のポリシーを選択して [**Detach**] (デタッチ) を選択し、フルアクセスを提供する別のポリシーを作成してモノのリソースにアタッチすることができます。後で、プログラムの実行に必要なアクションとポリシーのみにポリシーを制限できます。  
****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*"
            ],
            "Resource": "*"
        }
    ]
  }
  ```
+ 

**Device SDK のインストールを確認する**  
それでもプログラムが実行されない場合は、Device SDK を再インストールして、SDK のインストールが完了していて正しいことを確認できます。

## ステップ 4: 結果と次のステップを確認する
<a name="sample-app-shadow-review"></a>

**このチュートリアルで学習した内容は次のとおりです。**
+ 必要なソフトウェア、ツール、および AWS IoT Device SDK for Python をインストールします。
+ サンプルアプリケーション `shadow.py` が、シャドウの現在の状態を取得および更新するために MQTT プロトコルを使用する方法を理解します。
+ Device Shadows のサンプルアプリケーションを実行し、 AWS IoT コンソールで Shadow ドキュメントの更新を確認します。また、プログラムの実行時に問題をトラブルシューティングし、エラーを修正する方法も学びました。

**次の手順**  
これで、`shadow.py` サンプルアプリケーションを実行し、Device Shadow を使用して状態を制御できます。 AWS IoT コンソールで Shadow ドキュメントの更新を観察し、サンプルアプリケーションが応答するデルタイベントを観察できます。MQTT テストクライアントを使用して、予約済みのシャドウトピックにサブスクライブし、サンプルプログラムの実行時にトピックが受信するメッセージを観察できます。このチュートリアルの実行方法の詳細については、[チュートリアル: サンプルアプリケーションと MQTT テストクライアントを使用した Device Shadow とのやり取り](interact-lights-device-shadows.md) を参照してください。

# チュートリアル: サンプルアプリケーションと MQTT テストクライアントを使用した Device Shadow とのやり取り
<a name="interact-lights-device-shadows"></a>

`shadow.py` サンプルアプリケーションを操作するには、`desired` の値のためにターミナルに値を入力します。たとえば、トラフィックライトに似た色を指定してリクエストに AWS IoT 応答し、報告された値を更新できます。

**このチュートリアルの学習内容は次のとおりです。**
+ `shadow.py` サンプルアプリケーションを使用して、必要な状態を指定し、シャドウの現在の状態を更新します。
+ Shadow ドキュメントを編集して、デルタイベントと、`shadow.py` サンプルアプリケーションがそれにどのように応答するかを観察します。
+ MQTT テストクライアントを使用して、シャドウトピックをサブスクライブし、サンプルプログラムを実行するときに更新を確認します。

**このチュートリアルを実行する前に、以下の条件を満たす必要があります。**  
をセットアップし AWS アカウント、Raspberry Pi デバイスを設定し、モノとポリシーを作成 AWS IoT しました。また、必要なソフトウェア、Device SDK、証明書ファイルをインストールし、ターミナルでサンプルプログラムを実行する必要があります。詳細については、前のチュートリアルの [チュートリアル: シャドウアプリケーションを実行するための Raspberry Pi の準備](create-resources-shadow.md) および [ステップ 1: shadow.py サンプルアプリケーションを実行する](lightbulb-shadow-application.md#run-sample-application-shadows) を参照してください。これらのチュートリアルをまだ完了していない場合は、完了する必要があります。

**Topics**
+ [ステップ 1: `shadow.py` サンプルアプリケーションを使用して、必要な値と報告された値を更新する](#update-desired-shadow-sample)
+ [ステップ 2: MQTT テストクライアントで `shadow.py` サンプルアプリケーションからのメッセージを表示する](#shadow-sample-view-msg)
+ [ステップ 3: Device Shadow インタラクションに関するエラーをトラブルシューティングする](#shadow-observe-messages-troubleshoot)
+ [ステップ 4: 結果と次のステップを確認する](#sample-shadow-review)

このチュートリアルの完了には 45 分ほどかかります。

## ステップ 1: `shadow.py` サンプルアプリケーションを使用して、必要な値と報告された値を更新する
<a name="update-desired-shadow-sample"></a>

前のチュートリアル では[ステップ 1: shadow.py サンプルアプリケーションを実行する](lightbulb-shadow-application.md#run-sample-application-shadows)、セクション で説明されているように目的の値を入力するときに、 AWS IoT コンソールで Shadow ドキュメントに発行されたメッセージを確認する方法を学習しました[チュートリアル: Device SDK のインストールと Device Shadows のサンプルアプリケーションの実行](lightbulb-shadow-application.md)。

前の例では、目的の色を `yellow` に設定しました。各値を入力すると、ターミナルは別の `desired` 値を入力するように求めます。同じ値 (`yellow`) をもう一度入力すると、アプリケーションはこれを認識し、新しい `desired` 値を入力するように求めます。

```
Enter desired value:
yellow
Local value is already 'yellow'.
Enter desired value:
```

ここで、 という色を入力したとします`green`。 AWS IoT はリクエストに対応し、`reported`値を に更新します`green`。これは、`desired` 状態が `reported` 状態と異なる場合に更新が行われる方法であり、デルタが発生します。

**`shadow.py` サンプルアプリケーションが Device Shadow インタラクションをシミュレートする方法:**

1. ターミナルに `desired` 値 (例: `yellow`) を入力して、目的の状態を発行します。

1. `desired` 状態が `reported` 状態 (色 `green` など) と異なるため、デルタが発生し、デルタにサブスクライブしているアプリケーションがこのメッセージを受信します。

1. アプリケーションはメッセージに応答し、その状態を `desired` 値 `yellow` に更新します。

1. その後、アプリケーションはデバイスの状態 `yellow` の新しい報告値を含む更新メッセージを発行します。

以下は、更新リクエストがどのように発行されるかを示す、ターミナルに表示されるメッセージを示しています。

```
Enter desired value:
green
Changed local shadow value to 'green'.
Updating reported shadow value to 'green'...
Update request published.
Finished updating reported shadow value to 'green'.
```

 AWS IoT コンソールでは、Shadow ドキュメントは `reported`フィールドと `desired`フィールド`green`の両方で に更新された値を反映し、バージョン番号は 1 ずつ増加します。例えば、以前のバージョン番号が 10 と表示されていた場合、現在のバージョン番号は 11 と表示されます。

**注記**  
シャドウを削除しても、バージョン番号は 0 にリセットされません。更新リクエストを発行するか、同じ名前で別のシャドウを作成すると、シャドウバージョンが 1 ずつ増加することがわかります。

**Shadow ドキュメントを編集してデルタイベントを観察する**  
`shadow.py` サンプルアプリケーションも `delta` イベントにサブスクライブしており、`desired` 値が変更されると応答します。例えば、`desired` 値を色 `red` に変更できます。これを行うには、 AWS IoT コンソールで、**編集**をクリックして Shadow ドキュメントを編集し、`desired`値を に設定しながら JSON `red`で`reported`値を に設定します`green`。変更を保存する際には Raspberry Pi のターミナルを開いたままにしておきます。変更が発生するとターミナルにメッセージが表示されます。

```
{
"desired": {
  "welcome": "aws-iot",
  "color": "red"
},
"reported": {
  "welcome": "aws-iot",
  "color": "green"
}
}
```

新しい値を保存すると、`shadow.py` サンプルアプリケーションはこの変更に応答し、デルタを示すメッセージをターミナルに表示します。`desired` 値を入力するためのプロンプトの下に、次のメッセージが表示されます。

```
Enter desired value:
Received shadow delta event.
Delta reports that desired value is 'red'. Changing local value...
Changed local shadow value to 'red'.
Updating reported shadow value to 'red'...
Finished updating reported shadow value to 'red'.
Enter desired value:
Update request published.
Finished updating reported shadow value to 'red'.
```

## ステップ 2: MQTT テストクライアントで `shadow.py` サンプルアプリケーションからのメッセージを表示する
<a name="shadow-sample-view-msg"></a>

**AWS IoT コンソール**で** MQTT テストクライアント**を使用して、 AWS アカウントで渡される MQTT メッセージをモニタリングできます。Device Shadow サービスで使用される予約済みの MQTT トピックにサブスクライブすることで、サンプルアプリケーションの実行時にトピックが受信するメッセージを観察できます。

MQTT テストクライアントをまだ使用していない場合は、[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) を確認できます。これは、**AWS IoT コンソール**で **MQTT テストクライアント**を使用して、メッセージブローカーを通過する MQTT メッセージを表示する方法を学ぶのに役立ちます。

1. 

**MQTT テストクライアントを開く**

   [AWS IoT コンソールの新しいウィンドウで MQTT テストクライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。これにより、MQTT テストクライアントの設定を失うことなく、MQTT トピックによって受信されたメッセージを観察できます。MQTT テストクライアントからコンソールの別のページに移動すると、サブスクリプションまたはメッセージログは保持されません。チュートリアルのこのセクションでは、 AWS IoT モノの Shadow ドキュメントと MQTT テストクライアントを別々のウィンドウで開いて、Device Shadows とのやり取りをより簡単に観察できます。

1. 

**MQTT 予約済み Shadow トピックをサブスクライブする**

   MQTT テストクライアントを使用して、Device Shadow の MQTT 予約済みトピックの名前を入力し、サブスクライブして、`shadow.py` サンプルアプリケーションの実行時に更新を受け取ることができます。トピックにサブスクライブするには:

   1. **AWS IoT コンソール**の **MQTT テストクライアント**で、[**Subscribe to a topic**] (トピックへサブスクライブする) を選択します。

   1.  [**Topic filter**] (トピックフィルター) のセクションで、**\$1aws/things/*thingname*/shadow/update/\$1** と入力します。ここで、`thingname` は以前に作成したモノのリソースの名前です (例: `My_light_bulb`)。

   1. 追加の構成設定はデフォルト値のままにして、**[サブスクライブ]** を選択します。

   トピックサブスクリプションで **\$1** ワイルドカードを使用すると、複数の MQTT トピックを同時にサブスクライブし、デバイスとその Shadow の間で交換されるすべてのメッセージを単一のウィンドウで観察できます。ワイルドカード文字とその使用の詳細については、「[MQTT トピック](topics.md)」を参照してください。

1. 

**`shadow.py` サンプルプログラムを実行してメッセージを観察する**

   Raspberry Pi のコマンドラインウィンドウで、プログラムを切断した場合は、サンプルアプリケーションを再度実行し、**AWS IoT コンソール**の **MQTT テストクライアント**のメッセージを確認します。

   1. 次のコマンドを実行して、サンプルプログラムを再起動します。*your-iot-thing-name* と *your-iot-endpoint* を、以前に作成した AWS IoT モノの名前 ( など`My_light_bulb`) と、デバイスを操作するエンドポイントに置き換えます。

      ```
      cd ~/aws-iot-device-sdk-python-v2/samples/service-clients
      python3 shadow.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint --thing_name your-iot-thing-name
      ```

      その後、`shadow.py` サンプルアプリケーションが実行され、現在のシャドウ状態が取得されます。シャドウを削除したか、現在の状態をクリアした場合、プログラムは現在の値を `off` に設定し、`desired` 値を入力するように求めます。

      ```
      Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'...
      Connected!
      Subscribing to Delta events...
      Subscribing to Update responses...
      Subscribing to Get responses...
      Requesting current shadow state...
      Launching thread to read user input...
      Finished getting initial shadow state.
      Shadow document lacks 'color' property. Setting defaults...
      Changed local shadow value to 'off'.
      Updating reported shadow value to 'off'...
      Update request published.
      Finished updating reported shadow value to 'off'...
      Enter desired value:
      ```

      一方、プログラムが実行されていて、それを再起動した場合、ターミナルで最新の色の値が報告されるのを確認できます。MQTT テストクライアントでは、トピック **\$1aws/things/*thingname*/shadow/get** および **\$1aws/things/*thingname*/shadow/get/accepted** の更新が表示されます。

      報告された最新の色が `green` であるとします。以下は、**\$1aws/things/*thingname*/shadow/get/accepted** JSON ファイルの内容を示しています。

      ```
      {
      "state": {
        "desired": {
          "welcome": "aws-iot",
          "color": "green"
        },
        "reported": {
          "welcome": "aws-iot",
          "color": "green"
        }
      },
      "metadata": {
        "desired": {
          "welcome": {
            "timestamp": 1620156892
          },
          "color": {
            "timestamp": 1620161643
          }
        },
        "reported": {
          "welcome": {
            "timestamp": 1620156892
          },
          "color": {
            "timestamp": 1620161643
          }
        }
      },
      "version": 10,
      "timestamp": 1620173908
      }
      ```

   1. `yellow` など、ターミナルに `desired` 値を入力します。`shadow.py` サンプルアプリケーションは応答し、`reported` 値の `yellow` への変更を示す次のメッセージをターミナルに表示します。

      ```
      Enter desired value:
      yellow
      Changed local shadow value to 'yellow'.
      Updating reported shadow value to 'yellow'...
      Update request published.
      Finished updating reported shadow value to 'yellow'.
      ```

      **AWS IoT コンソール**の **[MQTT テストクライアント]** の **[サブスクリプション]** で、次のトピックがメッセージを受信したことがわかります。
      + **\$1aws/things/*thingname*/shadow/update**: `desired` と `updated` 値の両方が色 `yellow` に変化することを示しています。
      + **\$1aws/things/*thingname*/shadow/update/accepted**: `desired` および `reported` 状態の現在の値、およびそれらのメタデータとバージョン情報を表示します。
      + **\$1aws/things/*thingname*/shadow/update/documents**: `desired` および `reported` 状態の以前の値と現在の値、およびそれらのメタデータとバージョン情報を表示します。

      ドキュメント **\$1aws/things/*thingname*/shadow/update/documents** にも他の 2 つのトピックに含まれる情報が含まれているため、これで状態情報を確認できます。以前の状態は、`green` に設定された報告された値、そのメタデータとバージョン情報、および `yellow` に更新された、報告された値を示す現在の状態を示しています。

      ```
      {
      "previous": {
        "state": {
          "desired": {
            "welcome": "aws-iot",
            "color": "green"
          },
          "reported": {
            "welcome": "aws-iot",
            "color": "green"
          }
        },
        "metadata": {
          "desired": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297898
            }
          },
          "reported": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297898
            }
          }
        },
        "version": 10
      },
      "current": {
        "state": {
          "desired": {
            "welcome": "aws-iot",
            "color": "yellow"
          },
          "reported": {
            "welcome": "aws-iot",
            "color": "yellow"
          }
        },
        "metadata": {
          "desired": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297904
            }
          },
          "reported": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297904
            }
          }
        },
        "version": 11
      },
      "timestamp": 1617297904
      }
      ```

   1. ここで、別の `desired` 値を入力すると、`reported` 値のさらなる変更と、これらのトピックで受信したメッセージの更新が表示されます。バージョン番号も 1 ずつ増分します。例えば、値 `green` を入力すると、以前の状態が値 `yellow` を報告し、現在の状態が値 `green` を報告します。

1. 

**Shadow ドキュメントを編集してデルタイベントを観察する**

   デルタトピックへの変更を観察するには、 AWS IoT コンソールで Shadow ドキュメントを編集します。例えば、`desired` 値を色 `red` に変更できます。これを行うには、 AWS IoT コンソールで**編集**を選択し、`desired`値を に設定したまま JSON で`reported`値を赤に設定します`green`。変更を保存する際はターミナルを開いたままにしておいてください。ターミナルに報告されたデルタメッセージが表示されます。

   ```
   {
   "desired": {
     "welcome": "aws-iot",
     "color": "red"
   },
   "reported": {
     "welcome": "aws-iot",
     "color": "green"
   }
   }
   ```

   `shadow.py` サンプルアプリケーションはこの変更に応答し、デルタを示すメッセージをターミナルに表示します。MQTT テストクライアントでは、`update` トピックは、`desired` および `reported` 値の変更を示すメッセージを受け取ります。

   また、トピック **\$1aws/things/*thingname*/shadow/update/delta** がメッセージを受信したこともわかります。メッセージを表示するには、**[サブスクリプション]** の下にリストされているこのトピックを選択します。

   ```
   {
   "version": 13,
   "timestamp": 1617318480,
   "state": {
     "color": "red"
   },
   "metadata": {
     "color": {
       "timestamp": 1617318480
     }
   }
   }
   ```

## ステップ 3: Device Shadow インタラクションに関するエラーをトラブルシューティングする
<a name="shadow-observe-messages-troubleshoot"></a>

Shadow サンプルアプリケーションを実行すると、Device Shadow サービスとのインタラクションの観察に関する問題が発生する場合があります。

プログラムが正常に実行され、`desired` 値を入力するように求められた場合は、前述のように Shadow ドキュメントと MQTT テストクライアントを使用して、Device Shadow のインタラクションを観察できるはずです。ただし、インタラクションが表示されない場合は、次のことを確認できます。
+ 

**AWS IoT コンソールでモノの名前とそのシャドウを確認する**  
Shadow ドキュメントにメッセージが表示されない場合は、コマンドを確認して、**AWS IoT コンソール**のモノの名前と一致していることを確認してください。モノのリソースを選択してから [**Shadows**] (シャドウ) を選択することで、クラシックシャドウがあるかどうかを確認することもできます。このチュートリアルは、主にクラシックシャドウとのインタラクションに焦点を当てています。

   使用したデバイスがインターネットに接続されていることも確認できます。**AWS IoT コンソール**で、以前に作成したモノを選択してから、[**Interact**] (操作) を選択します。モノの詳細ページに、次を記載したメッセージが表示されます: `This thing already appears to be connected.`。
+ 

**サブスクライブした MQTT 予約済みトピックを確認する**  
メッセージが MQTT テストクライアントに表示されない場合は、サブスクライブしたトピックの形式が正しいかどうかを確認してください。MQTT デバイスシャドウトピックの形式は **\$1aws/things/*thingname*/shadow/** であり、シャドウで実行するアクションに応じて、`update`、`get`、または `delete` がそれに続く場合があります。このチュートリアルでは、トピック **\$1aws/things/*thingname*/shadow/\$1** を使用しているため、テストクライアントの [**Topic filter**] (トピックフィルター) セクションでトピックをサブスクライブするときに、正しく入力したことを確認してください。

  トピック名を入力するときは、*モノの名前*が前に作成した AWS IoT モノの名前と同じであることを確認します。追加の MQTT トピックにサブスクライブして、更新が正常に実行されたかどうかを確認することもできます。例えば、接続の問題をデバッグできるように、トピック **\$1aws/things/*thingname*/shadow/update/rejected** にサブスクライブして、更新リクエストが失敗したときにメッセージを受信します。予約されているトピックの詳細については、[シャドウトピック](reserved-topics.md#reserved-topics-shadow) および [Device Shadow MQTT トピック](device-shadow-mqtt.md) を参照してください。

## ステップ 4: 結果と次のステップを確認する
<a name="sample-shadow-review"></a>

**このチュートリアルで学習した内容は次のとおりです。**
+ `shadow.py` サンプルアプリケーションを使用して、必要な状態を指定し、シャドウの現在の状態を更新します。
+ Shadow ドキュメントを編集して、デルタイベントと、`shadow.py` サンプルアプリケーションがそれにどのように応答するかを観察します。
+ MQTT テストクライアントを使用して、シャドウトピックをサブスクライブし、サンプルプログラムを実行するときに更新を確認します。

**次のステップ**  
追加の MQTT 予約トピックにサブスクライブして、シャドウアプリケーションの更新を監視できます。例えば、トピック **\$1aws/things/*thingname*/shadow/update/accepted** のみをサブスクライブする場合、更新が正常に実行されると、現在の状態情報のみが表示されます。

追加のシャドウトピックにサブスクライブして、問題をデバッグしたり、Device Shadow のインタラクションの詳細を確認したり、Device Shadow のインタラクションに関する問題をデバッグしたりすることもできます。詳細については、「[シャドウトピック](reserved-topics.md#reserved-topics-shadow)」および「[Device Shadow MQTT トピック](device-shadow-mqtt.md)」を参照してください。

名前付きシャドウを使用するか、LED 用に Raspberry Pi に接続された追加のハードウェアを使用してアプリケーションを拡張し、ターミナルから送信されたメッセージを使用して状態の変化を観察することもできます。

Device Shadow サービス、デバイスでのサービスの使用、アプリケーションの使用、およびサービスの使用の詳細については、[AWS IoT Device Shadow サービス](iot-device-shadows.md)、[デバイスでのシャドウの使用](device-shadow-comms-device.md)、および [アプリとサービスでのシャドウの使用](device-shadow-comms-app.md) を参照してください。

# チュートリアル: のカスタムオーソライザーの作成 AWS IoT Core
<a name="custom-auth-tutorial"></a>

このチュートリアルでは、 AWS CLIを使用してカスタム認証を作成、検証、使用する手順を示します。オプションで、このチュートリアルを使用して、HTTP Publish API を使用して AWS IoT Core にデータを送信するために Postman を使用できます。

このチュートリアルでは、トークン署名が有効な **create-authorizer** 呼び出しを使用して、認可および認証ロジックとカスタムオーソライザーを実装するサンプル Lambda 関数を作成する方法を示します。その後、オーソライザーは を使用して検証され**test-invoke-authorizer**、最後に HTTP Publish API AWS IoT Core を使用してテスト MQTT トピックにデータを送信できます。サンプルリクエストでは、`x-amz-customauthorizer-name` ヘッダーを使用して呼び出すオーソライザーを指定し、トークンキー名と `x-amz-customauthorizer-signature` をリクエストヘッダーで渡します。

**このチュートリアルでは、次の内容を学習します。**
+ カスタムオーソライザーハンドラーとなる Lambda 関数を作成する方法
+ トークン署名を有効に AWS CLI して を使用してカスタムオーソライザーを作成する方法
+ **test-invoke-authorizer** コマンドを使用してカスタムオーソライザーをテストする方法
+ [Postman](https://www.postman.com/) を使用して MQTT トピックを発行し、カスタムオーソライザーでリクエストを検証する方法

このチュートリアルの完了には 60 分ほどかかります。

**Topics**
+ [ステップ 1: カスタムオーソライザー用の Lambda 関数を作成する](#custom-auth-tutorial-define)
+ [ステップ 2: カスタムオーソライザーのパブリックキーとプライベートキーのペアを作成する](#custom-auth-tutorial-keys)
+ [ステップ 3: カスタムオーソライザーリソースとその承認を作成する](#custom-auth-tutorial-authorizer)
+ [ステップ 4: test-invoke-authorizer を呼び出してオーソライザーをテストする](#custom-auth-tutorial-test)
+ [ステップ 5: Postman を使用して MQTT メッセージの発行をテストする](#custom-auth-tutorial-postman)
+ [ステップ 6: MQTT テストクライアントでメッセージを表示する](#custom-auth-tutorial-testclient)
+ [ステップ 7: 結果と次のステップを確認する](#custom-auth-tutorial-review)
+ [ステップ 8: クリーンアップする](#custom-auth-tutorial-cleanup)

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+ 

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。

  このチュートリアルで使用するアカウントは、少なくとも次の AWS マネージドポリシーが含まれている場合に最適に機能します。
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor)
**重要**  
このチュートリアルで使用される IAM ポリシーは、本稼働環境で従うべきものよりも許容度が高いです。本稼働環境で、アカウントポリシーとリソースポリシーが必要なアクセス許可のみを付与していることを確認します。  
本稼働用の IAM ポリシーを作成する場合は、ユーザーとロールに必要なアクセスを判断し、次にそれらのタスクのみの実行を許可するポリシーを設計します。  
詳細については、[IAM のセキュリティのベストプラクティス](https://docs.aws.amazon.com//IAM/latest/UserGuide/best-practices.html)を参照してください。
+ 

**をインストールしました AWS CLI**  
をインストールする方法については AWS CLI、「 [AWS CLI のインストール](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-install.html)」を参照してください。このチュートリアルには AWS CLI バージョン `aws-cli/2.1.3 Python/3.7.4 Darwin/18.7.0 exe/x86_64` 以降が必要です。
+ 

**OpenSSL ツール**  
このチュートリアルの例では、[LibreSSL 2.6.5](https://www.libressl.org/) を使用しています。このチュートリアルでは、[OpenSSL v1.1.1i](https://www.openssl.org/) ツールを使用することもできます。
+ 

**「[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) の概要」を確認します。**  
 AWS Lambda を初めて使用する場合は、[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)「」と[「Lambda の開始方法](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)」を確認して、その用語と概念を確認してください。
+ 

**Postman でリクエストを作成する方法を見直しました**  
詳細については、「[リクエストのビルド](https://learning.postman.com/docs/sending-requests/requests/)」を参照してください。
+ 

**以前のチュートリアルからカスタムオーソライザーを削除しました**  
では、一度に設定 AWS アカウント できるカスタムオーソライザーの数は限られています。カスタムオーソライザーの削除方法の詳細については、[ステップ 8: クリーンアップする](#custom-auth-tutorial-cleanup) を参照してください。

## ステップ 1: カスタムオーソライザー用の Lambda 関数を作成する
<a name="custom-auth-tutorial-define"></a>

のカスタム認証 AWS IoT Core では、作成した[オーソライザーリソース](https://docs.aws.amazon.com//iot/latest/apireference/API_AuthorizerDescription.html)を使用してクライアントを認証および認可します。このセクションで作成する 関数は、クライアントが AWS IoT リソースに接続してアクセスするときに、クライアントを認証 AWS IoT Core および認可します。

Lambda 関数は以下を実行します。
+ リクエストが **test-invoke-authorizer** からのものである場合、`Deny` アクションを含む IAM ポリシーを返します。
+ リクエストが HTTP を使用して Postman から送信され、`actionToken` パラメータの値が `allow` の場合、`Allow` アクションを使用して IAM ポリシーを返します。それ以外の場合は、`Deny` アクションを含む IAM ポリシーを返します。

**カスタムオーソライザー用の Lambda 関数を作成するには**

1. [Lambda](https://console.aws.amazon.com//lambda/home#) コンソールで、[[関数]](https://console.aws.amazon.com//lambda/home#/functions) を開きます。

1. [**Create function**] を選択します。

1. **[一から作成]** が選択されていることを確認します。

1. [**Basic information**]:

   1. [**関数名**] に **custom-auth-function** と入力します。

   1. **[ランタイム]** で、**[Node.js 18.x]** を確認します 

1. [**Create function**] を選択します。

   Lambda により、Node.js の関数と[実行ロール](https://docs.aws.amazon.com//lambda/latest/dg/lambda-intro-execution-role.html)が作成され、ログをアップロードするためのアクセス許可が関数に付与されます。Lambda 関数は、関数を呼び出すときに実行ロールを引き受け、実行ロールを使用して AWS SDK の認証情報を作成し、イベントソースからデータを読み込みます。

1. [AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) エディタで関数のコードと設定を表示するには、デザイナーウィンドウで **[custom-auth-function]** を選択し、エディタのナビゲーションペインで **[index.js]** を選択します。

   Node.js などのスクリプト言語では、Lambda には成功のレスポンスを返す基本関数が含まれています。ソースコードが 3 MB を超えない限り、[AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) エディタを使用して関数を編集できます。

1. エディタの **index.js** コードを次のコードに置き換えます。

   ```
   // A simple Lambda function for an authorizer. It demonstrates
   // How to parse a CLI and Http password to generate a response.
   
   export const handler = async (event, context, callback) => {
   
       //Http parameter to initiate allow/deny request
       const HTTP_PARAM_NAME='actionToken';
       const ALLOW_ACTION = 'Allow';
       const DENY_ACTION = 'Deny';
   
       //Event data passed to Lambda function
       var event_str = JSON.stringify(event);
       console.log('Complete event :'+ event_str);
   
       //Read protocolData from the event json passed to Lambda function
       var protocolData = event.protocolData;
       console.log('protocolData value---> ' + protocolData);
   
       //Get the dynamic account ID from function's ARN to be used
       // as full resource for IAM policy
       var ACCOUNT_ID = context.invokedFunctionArn.split(":")[4];
       console.log("ACCOUNT_ID---"+ACCOUNT_ID);
   
       //Get the dynamic region from function's ARN to be used
       // as full resource for IAM policy
       var REGION = context.invokedFunctionArn.split(":")[3];
       console.log("REGION---"+REGION);
   
       //protocolData data will be undefined if testing is done via CLI.
       // This will help to test the set up.
       if (protocolData === undefined) {
   
           //If CLI testing, pass deny action as this is for testing purpose only.
           console.log('Using the test-invoke-authorizer cli for testing only');
           callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
       } else{
   
           //Http Testing from Postman
           //Get the query string from the request
           var queryString = event.protocolData.http.queryString;
           console.log('queryString values -- ' + queryString);
           /*         global URLSearchParams       */
           const params = new URLSearchParams(queryString);
           var action = params.get(HTTP_PARAM_NAME);
   
           if(action!=null && action.toLowerCase() === 'allow'){
   
               callback(null, generateAuthResponse(ALLOW_ACTION,ACCOUNT_ID,REGION));
   
           }else{
   
               callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
           }
   
       }
   
   };
   
   // Helper function to generate the authorization IAM response.
   var generateAuthResponse = function(effect,ACCOUNT_ID,REGION) {
   
       var full_resource = "arn:aws:iot:"+ REGION + ":" + ACCOUNT_ID + ":*";
       console.log("full_resource---"+full_resource);
   
       var authResponse = {};
       authResponse.isAuthenticated = true;
       authResponse.principalId = 'principalId';
   
       var policyDocument = {};
       policyDocument.Version = '2012-10-17';		 	 	 
       policyDocument.Statement = [];
       var statement = {};
       statement.Action = 'iot:*';
       statement.Effect = effect;
       statement.Resource = full_resource;
       policyDocument.Statement[0] = statement;
       authResponse.policyDocuments = [policyDocument];
       authResponse.disconnectAfterInSeconds = 3600;
       authResponse.refreshAfterInSeconds = 600;
   
       console.log('custom auth policy function called from http');
       console.log('authResponse --> ' + JSON.stringify(authResponse));
       console.log(authResponse.policyDocuments[0]);
   
       return authResponse;
   }
   ```

1. [**デプロイ**] を選択します。

1. **[変更がデプロイされました]** がエディタの上に表示されたら、次の操作を実行します。

   1. エディタの上にある **[関数の概要]** セクションまでスクロールします。

   1. このチュートリアルの後半で使用するために、**[関数 ARN]** をコピーして保存します。

1.  関数をテストします。

   1. **[テスト]** タブを選択します。

   1. デフォルトのテスト設定を使用して、**[呼び出し]** を選択します。

   1. テストが成功した場合は、**[実行結果]** で **[詳細]** ビューを開きます。関数が返したポリシードキュメントが表示されます。

      テストが失敗した場合、またはポリシードキュメントが表示されない場合は、コードを確認し、エラーを見つけて修正します。

## ステップ 2: カスタムオーソライザーのパブリックキーとプライベートキーのペアを作成する
<a name="custom-auth-tutorial-keys"></a>

カスタムオーソライザーでは、認証にパブリックキーとプライベートキーが必要です。このセクションのコマンドは、OpenSSL ツールを使用してこのキーペアを作成します。

**カスタムオーソライザーのパブリックキーとプライベートキーのペアを作成するには**

1. プライベートキーファイルを作成します。

   ```
   openssl genrsa -out private-key.pem 4096
   ```

1. 先ほど作成したプライベートキーファイルを検証します。

   ```
   openssl rsa -check -in private-key.pem -noout
   ```

   コマンドがエラーを表示しない場合、プライベートキーファイルは有効です。

1. パブリックキーファイルを作成します。

   ```
   openssl rsa -in private-key.pem -pubout -out public-key.pem
   ```

1. パブリックキーファイルを確認します。

   ```
   openssl pkey -inform PEM -pubin -in public-key.pem -noout
   ```

   コマンドがエラーを表示しない場合、パブリックキーファイルは有効です。

## ステップ 3: カスタムオーソライザーリソースとその承認を作成する
<a name="custom-auth-tutorial-authorizer"></a>

 AWS IoT カスタムオーソライザーは、前のステップで作成したすべての要素を結び付けるリソースです。このセクションでは、カスタムオーソライザーリソースを作成し、以前に作成した Lambda 関数を実行するためのアクセス許可を付与します。 AWS IoT コンソール、、または AWS API を使用して AWS CLI、カスタムオーソライザーリソースを作成できます。

このチュートリアルでは、1 つのカスタムオーソライザーを作成するだけで済みます。このセクションでは、 AWS IoT コンソールと を使用して を作成する方法について説明します。これにより AWS CLI、最も便利な メソッドを使用できます。どちらの方法でも作成されたカスタムオーソライザーリソースには違いはありません。

### カスタムオーソライザーリソースを作成する
<a name="custom-auth-tutorial-authorizer-resource"></a>

**オプションを選択してカスタムオーソライザーリソースを作成する**
+ [AWS IoT コンソールを使用してカスタムオーソライザーを作成する](#create-custom-auth-in-console)
+ [を使用してカスタムオーソライザーを作成する AWS CLI](#create-custom-auth-in-cli)

**カスタムオーソライザーを作成するには (コンソール)**

1. [AWS IoT コンソールのカスタムオーソライザーページ](https://console.aws.amazon.com//iot/home#/authorizerhub)を開き、**オーソライザーの作成**を選択します。

1. **[オーソライザーの作成]** で、次のように操作します。

   1. **[オーソライザーの名前]** に、**my-new-authorizer** と入力します。

   1. **[オーソライザーのステータス]** で、**[アクティブ]** にチェックを入れます。

   1. **[オーソライザー関数]** で、前に作成した Lambda 関数を選択します。

   1. **[トークン検証 - オプション]** で次の操作を実行します。

      1. **[トークン検証]** をオンにします。

      1. **[トークンキー名]** に、**tokenKeyName** を入力します。

      1. **[キーの追加]** を選択します。

      1. **[キー名]** で **FirstKey** を入力します。

      1. **[パブリックキー]** で、`public-key.pem` ファイルの内容を入力します。`-----BEGIN PUBLIC KEY-----` と `-----END PUBLIC KEY-----` を含むファイルの行を必ず含め、ラインフィード、キャリッジリターン、またはその他の文字をファイルの内容に追加したり、ファイルの内容から削除したりしないでください。入力する文字列は、この例のように表示されます。

         ```
         -----BEGIN PUBLIC KEY-----
         MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
         sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
         QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
         lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
         oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
         FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
         QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
         KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
         gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
         /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
         8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
         JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
         -----END PUBLIC KEY-----
         ```

1. **[オーソライザーの作成]** を選択します。

1. カスタムオーソライザーリソースが作成された場合は、カスタムオーソライザーのリストが表示され、新しいカスタムオーソライザーがそのリストに表示されます。これで、次のセクションに進んでテストできます。

   エラーが表示された場合は、エラーを確認し、カスタムオーソライザーを再度作成して、エントリを再確認してください。各カスタムオーソライザーリソースには一意の名前が必要であることに注意してください。

**カスタムオーソライザーを作成するには (AWS CLI)**

1. `authorizer-function-arn` と `token-signing-public-keys` の値を置き換えてから、次のコマンドを実行します。

   ```
   aws iot create-authorizer \
   --authorizer-name "my-new-authorizer" \
   --token-key-name "tokenKeyName" \
   --status ACTIVE \
   --no-signing-disabled \
   --authorizer-function-arn "arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function" \
   --token-signing-public-keys FirstKey="-----BEGIN PUBLIC KEY-----
   MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
   sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
   QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
   lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
   oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
   FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
   QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
   KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
   gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
   /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
   8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
   JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
   -----END PUBLIC KEY-----"
   ```

**各パラメータの意味は次のとおりです。**
   + `authorizer-function-arn` 値は、カスタムオーソライザー用に作成した Lambda 関数の Amazon リソースネーム (ARN) です。
   + `token-signing-public-keys` 値には、キーの名前、**FirstKey**、および `public-key.pem` ファイルの内容が含まれます。`-----BEGIN PUBLIC KEY-----` と `-----END PUBLIC KEY-----` を含むファイルの行を必ず含め、ラインフィード、キャリッジリターン、またはその他の文字をファイルの内容に追加したり、ファイルの内容から削除したりしないでください。

     注: パブリックキーの値を変更すると使用できなくなるため、パブリックキーの入力には注意してください。

1. カスタムオーソライザーが作成されている場合、コマンドは次のような新しいリソースの名前と ARN を返します。

   ```
   {
       "authorizerName": "my-new-authorizer",
       "authorizerArn": "arn:aws:iot:Region:57EXAMPLE833:authorizer/my-new-authorizer"
   }
   ```

   次のステップで使用するために `authorizerArn` 値を保存します。

   各カスタムオーソライザーリソースには一意の名前が必要であることに注意してください。

### カスタムオーソライザーリソースを承認する
<a name="custom-auth-tutorial-authorizer-permission"></a>

このセクションでは、作成したカスタムオーソライザーリソースに、Lambda 関数を実行するためのアクセス許可を付与します。アクセス許可を付与するには、[add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI コマンドを使用できます。

**を使用して Lambda 関数にアクセス許可を付与する AWS CLI**

1. 値を挿入したら、次のコマンドを入力します。`statement-id` 値は一意でなければならないことに注意してください。このチュートリアルを以前に実行したことがある場合、または `ResourceConflictException` エラーが発生した場合は、`Id-1234` を別の値に置き換えてください。

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. コマンドが成功すると、この例のようなアクセス許可ステートメントが返されます。次のセクションに進んで、カスタムオーソライザーをテストできます。

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   コマンドが成功しない場合は、この例のようなエラーが返されます。続行する前に、エラーを確認して修正する必要があります。

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

## ステップ 4: test-invoke-authorizer を呼び出してオーソライザーをテストする
<a name="custom-auth-tutorial-test"></a>

すべてのリソースを定義したら、このセクションでは、コマンドラインから test-invoke-authorizer を呼び出して、認可パスをテストします。

コマンドラインからオーソライザーを呼び出す場合、`protocolData` は定義されていないため、オーソライザーは常に DENY ドキュメントを返すことに注意してください。ただし、このテストは、Lambda 関数を完全にテストしなくても、カスタムオーソライザーと Lambda 関数が正しく設定されていることを確認します。

**を使用してカスタムオーソライザーとその Lambda 関数をテストするには AWS CLI**

1. 前の手順で作成した `private-key.pem` ファイルがあるディレクトリで、次のコマンドを実行します。

   ```
   echo -n "tokenKeyValue" | openssl dgst -sha256 -sign private-key.pem | openssl base64 -A
   ```

   このコマンドは、次のステップで使用する署名文字列を作成します。署名文字列は次のようになります。

   ```
   dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mn
   VB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeeh
   bQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjj
   szEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29V
   QJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuX
   f3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+K
   EWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFH
   xRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   この署名文字列をコピーして、次の手順で使用します。余分な文字を含めたり、省略したりしないように注意してください。

1. このコマンドで、`token-signature` 値を前のステップの署名文字列に置き換え、このコマンドを実行してオーソライザーをテストします。

   ```
   aws iot test-invoke-authorizer \
   --authorizer-name my-new-authorizer \
   --token tokenKeyValue \
   --token-signature dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mnVB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeehbQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjjszEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29VQJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuXf3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+KEWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFHxRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   コマンドが成功すると、この例のように、カスタムオーソライザー関数によって生成された情報が返されます。

   ```
   {
       "isAuthenticated": true,
       "principalId": "principalId",
       "policyDocuments": [
           "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Action\":\"iot:*\",\"Effect\":\"Deny\",\"Resource\":\"arn:aws:iot:Region:57EXAMPLE833:*\"}]}"
       ],
       "refreshAfterInSeconds": 600,
       "disconnectAfterInSeconds": 3600
   }
   ```

   コマンドからエラーが返された場合は、エラーを確認し、このセクションで使用したコマンドを再度確認します。

## ステップ 5: Postman を使用して MQTT メッセージの発行をテストする
<a name="custom-auth-tutorial-postman"></a>

1. コマンドラインからデバイスデータエンドポイントを取得するには、ここに示すように [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) を呼び出します

   ```
   aws iot describe-endpoint --output text --endpoint-type iot:Data-ATS
   ```

   このアドレスを保存して、後のステップで *device\$1data\$1endpoint\$1address* として使用します。

1. 新しい Postman ウィンドウを開き、新しい HTTP POST リクエストを作成します。

   1. コンピュータで、Postman アプリケーションを開きます。

   1. Postman の **[ファイル]** メニューで、**[新規]** を選択します。

   1. **[New]** (新規) ダイアログボックスで、**[Request]** (リクエスト) を選択します。

   1. [Save] (保存) リクエストで、

      1. [**Request name**] (リクエスト名) で、**Custom authorizer test request** と入力します。

      1. **[保存先のコレクションまたはフォルダを選択:]** で、このリクエストを保存するコレクションを選択または作成します。

      1. **[*collection\$1name* に保存]** を選択します。

1. カスタムオーソライザーをテストするための POST リクエストを作成します。

   1. URL フィールドの横にあるリクエストメソッドセレクターで、**[POST]** を選択します。

   1. URL フィールドで、前のステップの *describe-endpoint* コマンドの [device\$1data\$1endpoint\$1address](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) とともに次の URL を使用して、リクエスト用の URL を作成します。

      ```
      https://device_data_endpoint_address:443/topics/test/cust-auth/topic?qos=0&actionToken=allow
      ```

      この URL には、 AWS IoTへのアクセスを許可するポリシードキュメントを返すように Lambda 関数に指示する `actionToken=allow` クエリパラメータが含まれていることに注意してください。URL を入力すると、Postman の [**Params**] (パラメータ) タブにもクエリパラメータが表示されます。

   1. **[認証]** タブの **[タイプ]** フィールドで、**[認証なし]** を選択します。

   1. [Headers] (ヘッダー) タブで次の操作を行います。

      1. チェックが入っている **[ホスト]** キーがある場合は、このチェックを解除します。

      1. ヘッダーのリストの一番下に、これらの新しいヘッダーを追加し、チェックが入っていることを確認します。**Host** 値を *device\$1data\$1endpoint\$1address* に置き換え、**x-amz-customauthorizer-signature** 値を前のセクションの **test-invoke-authorize** コマンドで使用した署名文字列に置き換えます。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/custom-auth-tutorial.html)

   1. [Body] (本文) タブで、次の操作を行います。

      1. データ形式オプションボックスで、**[Raw]** を選択します。

      1. データ型リストで、**[JavaScript]** を選択します。

      1. テキストフィールドで、テストメッセージ用の次の JSON メッセージペイロードを入力します。

         ```
         {
             "data_mode": "test",
             "vibration": 200,
             "temperature": 40
         }
         ```

1. **[送信]** を選択してリクエストを送信します。

   リクエストが成功した場合、次を返します。

   ```
   {
       "message": "OK",
       "traceId": "ff35c33f-409a-ea90-b06f-fbEXAMPLE25c"
   }
   ```

   正常なレスポンスは、カスタムオーソライザーが への接続を許可 AWS IoT し、テストメッセージが のブローカーに配信されたことを示します AWS IoT Core。

   エラーが返された場合は、エラーメッセージ、*device\$1data\$1endpoint\$1address*、署名文字列、およびその他のヘッダー値を確認してください。

次のセクションで使用するために、このリクエストを Postman で保持します。

## ステップ 6: MQTT テストクライアントでメッセージを表示する
<a name="custom-auth-tutorial-testclient"></a>

前のステップでは、Postman AWS IoT を使用してシミュレートされたデバイスメッセージを に送信しました。成功した応答は、カスタムオーソライザーが AWS IoT への接続を許可し、テストメッセージが AWS IoT Coreのブローカーに配信されたことを示しました。このセクションでは、 AWS IoT コンソールで MQTT テストクライアントを使用して、他のデバイスやサービスと同様に、そのメッセージからのメッセージの内容を確認します。

**カスタムオーソライザーによって承認されたテストメッセージを表示するには**

1.  AWS IoT コンソールで、[MQTT テストクライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。

1. [**Subscribe to topic**] (トピックへのサブスクライブ) タブの [**Topic filter**] (トピックフィルター) で、前のセクションの Postman の例で使用されているメッセージトピックである **test/cust-auth/topic** を入力します。

1. [**Subscribe**] を選択します。

   次のステップのために、このウィンドウを表示したままにします。

1. Postman で、前のセクションで作成したリクエストで、**[送信]** を選択します。

   応答を確認して、正常に完了したことを確認します。そうでない場合は、前のセクションで説明したようにエラーをトラブルシューティングします。

1. **[MQTT テストクライアント]** に、メッセージトピックを示す新しいエントリが表示され、展開すると、Postman から送信したリクエストからのメッセージペイロードが表示されます。

   **[MQTT テストクライアント]** にメッセージが表示されない場合は、次の点を確認してください。
   + Postman リクエストが正常に返されたことを確認します。が接続 AWS IoT を拒否し、エラーを返した場合、リクエスト内のメッセージはメッセージブローカーに渡されません。
   +  AWS IoT コンソールを開く AWS リージョン ために使用される AWS アカウント と が、Postman URL で使用しているものと同じであることを確認します。
   + カスタムオーソライザーに適切なエンドポイントを使用していることを確認してください。デフォルトの IoT エンドポイントは、Lambda 関数でのカスタムオーソライザーの使用をサポートしていない場合があります。その場合は、ドメイン設定を使用して新しいエンドポイントを定義し、そのエンドポイントをカスタムオーソライザーに指定できます。
   + **MQTT テストクライアント**にトピックを正しく入力したことを確認してください。トピックフィルターでは、大文字と小文字が区別されます。疑わしい場合は、 **\$1**トピックにサブスクライブすることもできます。このトピックは、メッセージブローカーを通過するすべての MQTT メッセージにサブスクライブ AWS アカウント し、 コンソールを開く AWS リージョン AWS IoT ために使用されます。

## ステップ 7: 結果と次のステップを確認する
<a name="custom-auth-tutorial-review"></a>

**このチュートリアルでは、次の作業を行いました。**
+ Lambda 関数をカスタムオーソライザーハンドラーとして作成しました
+ トークン署名を有効にしてカスタムオーソライザーを作成しました
+ **test-invoke-authorizer** コマンドを使用してカスタムオーソライザーをテストしました
+ [Postman](https://www.postman.com/) を使用して MQTT トピックを発行し、カスタムオーソライザーでリクエストを検証しました
+ Postman テストから送信されたメッセージを表示するために **[MQTT テストクライアント]** を使用しました

**次の手順**  
Postman からメッセージを送信してカスタムオーソライザーが機能していることを確認したら、このチュートリアルのさまざまな側面を変更すると結果にどのように影響するかを実験してみてください。手始めにいくつか例を紹介します。
+ 署名文字列を変更して、不正な接続の試みがどのように処理されるかを確認できないようにします。このようなエラー応答が返され、メッセージは **MQTT テストクライアント**に表示されないはずです。

  ```
  {
      "message": "Forbidden",
      "traceId": "15969756-a4a4-917c-b47a-5433e25b1356"
  }
  ```
+  AWS IoT ルールの開発中および使用中に発生する可能性のあるエラーを見つける方法の詳細については、「」を参照してください[モニタリング AWS IoT](monitoring_overview.md)。

## ステップ 8: クリーンアップする
<a name="custom-auth-tutorial-cleanup"></a>

このチュートリアルを繰り返したい場合は、カスタムオーソライザーの一部を削除する必要があります。では、一度に設定 AWS アカウント できるカスタムオーソライザーの数は限られており、既存のカスタムオーソライザーを削除せずに新しいオーソライザーを追加`LimitExceededException`しようとすると、 を取得できます。

**カスタムオーソライザーを削除するには (コンソール)**

1. [AWS IoT コンソールのカスタムオーソライザーページ](https://console.aws.amazon.com//iot/home#/authorizerhub)を開き、カスタムオーソライザーのリストで、削除するカスタムオーソライザーを見つけます。

1. [Custom authorizer details] (カスタムオーソライザーの詳細) ページを開き、[**Actions**] (アクション) メニューから [**Edit**] (編集) を選択します。

1. **[オーソライザーアクティブ化]** のチェックを解除し、**[更新]** を選択します。

   アクティブなカスタムオーソライザーを削除することはできません。

1. [Custom authorizer details] (カスタムオーソライザーの詳細) ページで、[**Actions**] (アクション) メニューを開き、[**Delete**] (削除) を選択します。

**カスタムオーソライザーを削除するには (AWS CLI)**

1. インストールしたカスタムオーソライザーの一覧を表示し、削除するカスタムオーソライザーの名前を見つけます。

   ```
   aws iot list-authorizers 
   ```

1. `Custom_Auth_Name` を、削除するカスタムオーソライザーの `authorizerName` に置き換えた後、このコマンドを実行してカスタムオーソライザーを `inactive` に設定します。

   ```
   aws iot update-authorizer --status INACTIVE --authorizer-name Custom_Auth_Name
   ```

1. `Custom_Auth_Name` を、削除するカスタムオーソライザーの `authorizerName` に置き換えた後、このコマンドを実行してカスタムオーソライザーを削除します。

   ```
   aws iot delete-authorizer --authorizer-name Custom_Auth_Name
   ```

# チュートリアル: AWS IoT と Raspberry Pi を使用した土壌湿度のモニタリング
<a name="iot-moisture-tutorial"></a>

このチュートリアルでは、[Raspberry Pi](https://www.raspberrypi.org/)、湿度センサー、 AWS IoT および を使用して、家の植物または庭の土壌湿度レベルをモニタリングする方法を示します。Raspberry Pi は、センサーから湿度レベルと温度を読み取り、データを送信するコードを実行します AWS IoT。湿度レベル AWS IoT がしきい値を下回ると、Amazon SNS トピックにサブスクライブしているアドレスに E メールを送信するルールを で作成します。

**注記**  
このチュートリアルは最新ではない可能性があります。このトピックの最初の公開以降に、いくつかの参照が置き換えられている可能性があります。

**Contents**
+ [前提条件](#iot-moisture-prereqs)
+ [セットアップ AWS IoT](iot-moisture-setup.md)
  + [ステップ 1: AWS IoT ポリシーを作成する](iot-moisture-policy.md)
  + [ステップ 2: AWS IoT モノ、証明書、プライベートキーを作成する](iot-moisture-create-thing.md)
  + [ステップ 3: Amazon SNS トピックおよびサブスクリプションを作成する](iot-moisture-create-sns-topic.md)
  + [ステップ 4: E メールを送信する AWS IoT ルールを作成する](iot-moisture-create-rule.md)
+ [Raspberry Pi と湿度センサーのセットアップ](iot-moisture-raspi-setup.md)

## 前提条件
<a name="iot-moisture-prereqs"></a>

このチュートリアルを完了するには、以下が必要です。
+  AWS アカウント。
+ 管理者権限を持つ IAM ユーザー。
+ [AWS IoT コンソール](https://console.aws.amazon.com/iot/home)にアクセスするための、Windows、macOS、Linux、または Unix を実行している開発用コンピュータ。
+ 最新の [Raspberry Pi OS](https://www.raspberrypi.com/software/operating-systems/) を実行する [Raspberry Pi 3B または 4B](https://www.raspberrypi.com/products/)。インストール手順については、Raspberry Pi ウェブサイトの「[Install an operating system](https://www.raspberrypi.com/documentation/computers/getting-started.html#installing-the-operating-system)」を参照してください。
+ Raspberry Pi 用のモニター、キーボード、マウス、Wi-Fi ネットワークまたはイーサネット接続。
+ Raspberry Pi 対応の湿度センサー。このチュートリアルで使用するセンサーは、[Adafruit STEMMA I2C 容量性湿度センサー](https://www.adafruit.com/product/4026)で、[JST 4 ピンからメスソケットへのケーブルヘッダー](https://www.adafruit.com/product/3950)を備えています。

# セットアップ AWS IoT
<a name="iot-moisture-setup"></a>

このチュートリアルを完了するには、次のリソースを作成する必要があります。デバイスを に接続するには AWS IoT、IoT モノ、デバイス証明書、および AWS IoT ポリシーを作成します。
+  AWS IoT モノ。

  モノは物理デバイス (この場合は Rasberry Pi) を表し、デバイスに関する静的メタデータを含みます。
+ デバイス証明書。

   AWS IoTに接続して認証するには、すべてのデバイスにデバイス証明書が必要です。
+  AWS IoT ポリシー。

  各デバイス証明書には、1 つ以上の AWS IoT ポリシーが関連付けられています。これらのポリシーは、デバイスがアクセスできる AWS IoT リソースを決定します。
+  AWS IoT ルート CA 証明書。

  デバイスやその他のクライアントは、 AWS IoT ルート CA 証明書を使用して、通信している AWS IoT サーバーを認証します。詳細については、「[サーバー認証](server-authentication.md)」を参照してください。
+  AWS IoT ルール。

  ルールには、クエリと 1 つ以上のルールアクションが含まれます。クエリは、デバイスメッセージからデータを抽出して、メッセージデータを処理する必要があるかどうかを判断します。ルールアクションにより、データがクエリに一致する場合の処理が指定されます。
+ Amazon SNS トピックおよびトピックサブスクリプション。

  このルールでは、Raspberry Pi からの湿度データがリッスンされます。値がしきい値を下回る場合、Amazon SNS トピックにメッセージを送信します。Amazon SNS は、トピックにサブスクライブしているすべての E メールアドレスにそのメッセージを送信します。

 



# ステップ 1: AWS IoT ポリシーを作成する
<a name="iot-moisture-policy"></a>

Raspberry Pi がメッセージを接続および送信できるようにする AWS IoT ポリシーを作成します AWS IoT。

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot)で、[**今すぐ始める**] ボタンが表示された場合はそれをクリックします。それ以外の場合は、ナビゲーションペインで **[Security]** (セキュリティ) を展開し、**[Policies]** (ポリシー) を選択します。

1. [**ポリシーはまだ作成されていません**] ダイアログボックスが表示された場合は、[**ポリシーの作成**] を選択します。それ以外の場合は、[**Create (作成) **] を選択します。

1.  AWS IoT ポリシーの名前を入力します (例: **MoistureSensorPolicy**)。

1. [**Add statements (ステートメントの追加)**] セクションで、既存のポリシーを次の JSON に置き換えます。*region* と *account* を AWS リージョン と AWS アカウント number に置き換えます。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:Connect",
               "Resource": "arn:aws:iot:us-east-1:123456789012:client/RaspberryPi"
           },
           {
               "Effect": "Allow",
               "Action": "iot:Publish",
               "Resource": [
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/update",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/delete",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/get"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Receive",
               "Resource": [
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/update/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/delete/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/get/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/update/rejected",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/delete/rejected"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/update/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/delete/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/get/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/update/rejected",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/delete/rejected"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:GetThingShadow",
                   "iot:UpdateThingShadow",
                   "iot:DeleteThingShadow"
               ],
               "Resource": "arn:aws:iot:us-east-1:123456789012:thing/RaspberryPi"
           }
       ]
   }
   ```

1. **[作成]** を選択します。

# ステップ 2: AWS IoT モノ、証明書、プライベートキーを作成する
<a name="iot-moisture-create-thing"></a>

Raspberry Pi を表すモノを AWS IoT レジストリに作成します。

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/home)のナビゲーションペインで、[**管理**]、[**モノ**] の順に選択します。

1. [**まだモノがありません**] ダイアログボックスが表示された場合は、[**モノの登録**] を選択します。それ以外の場合は、[**Create (作成)**] を選択します。

1. ** AWS IoT モノの作成**ページで、**モノを 1 つ**作成する を選択します。

1. [**Add your device to the device registry (デバイスレジストリへのデバイスの追加)**] ページで、IoT モノの名前 (例: **RaspberryPi**) を入力し、[**次へ**] を選択します。作成後にモノの名前は変更できません。モノの名前を変更するには、新しいモノを作成して、新しい名前を付け、古いモノを削除する必要があります。

1. [**モノに証明書を追加**] ページで、[**証明書の作成**] を選択します。

1. [**ダウンロード**] リンクを選択して、証明書、プライベートキー、ルート CA 証明書をダウンロードします。
**重要**  
これは、証明書とプライベートキーをダウンロードできる唯一の時間です。

1. 証明書を有効にするには、[**Activate**] (有効化) を選択します。デバイスが AWS IoTに接続するには、証明書がアクティブである必要があります。

1. [**ポリシーのアタッチ**] を選択します。

1. [**Add a policy for your thing (モノのポリシーを追加)**] で、[**MoistureSensorPolicy**]、[**Register Thing (モノの登録)**] の順に選択します。

# ステップ 3: Amazon SNS トピックおよびサブスクリプションを作成する
<a name="iot-moisture-create-sns-topic"></a>

Amazon SNS トピックおよびサブスクリプションを作成します。

1. [AWS SNS コンソール](https://console.aws.amazon.com/sns/home)のナビゲーションペインで [**Topics**] (トピック) を選択し、[**Create topic**] (トピックの作成) を選択します。

1. タイプを **[標準]** として選択し、トピックの名前を入力します (例: **MoistureSensorTopic**）。

1. トピックの表示名を入力します (例: **Moisture Sensor Topic**)。これは、Amazon SNS コンソールでトピックに表示される名前です。

1. [**トピックの作成**] を選択します。

1. Amazon SNS トピックの詳細ページで、**[Create subscription]** (サブスクリプションの作成) を選択します。

1. [**Protocol (プロトコル)**] として [**Email (E メール)**] を選択してください。

1. [**エンドポイント**] に E メールアドレスを入力します。

1. [**Create subscription**] を選択します。

1. E メールクライアントを開き、**MoistureSensorTopic** という件名のメッセージを探します。E メールを開き、[**サブスクリプションを確認**] リンクを選択します。
**重要**  
サブスクリプションを確認するまで、この Amazon SNS トピックからの E メールアラートは受信されません。

入力したテキストが記載された E メールメッセージが届きます。

# ステップ 4: E メールを送信する AWS IoT ルールを作成する
<a name="iot-moisture-create-rule"></a>

 AWS IoT ルールは、デバイスからメッセージを受信したときに実行するクエリと 1 つ以上のアクションを定義します。 AWS IoT ルールエンジンは、デバイスによって送信されたメッセージをリッスンし、メッセージ内のデータを使用して何らかのアクションを実行する必要があるかどうかを判断します。詳細については、「[のルール AWS IoT](iot-rules.md)」を参照してください。

このチュートリアルでは、Raspberry Pi が `aws/things/RaspberryPi/shadow/update` にメッセージを発行します。これは、デバイスと Thing Shadow サービスで使用される内部 MQTT トピックです。Raspberry Pi は、次の形式のメッセージを発行します。

```
{
    "reported": {
        "moisture" : moisture-reading,
        "temp" : temperature-reading
    }
}
```

受信メッセージから湿度と温度データを抽出するクエリを作成します。また、湿度の読み取り値がしきい値を下回っている場合、データを受け取り、そのデータを Amazon SNS トピックのサブスクライバーに送信する Amazon SNS アクションも作成します。

**Amazon SNS ルールを作成する**

1. [[AWS IoT コンソール]](https://console.aws.amazon.com/iot/home) で、**[メッセージのルーティング]** を選択し、**[ルール]** を選択します。[**ルールはまだ作成されていません**] ダイアログボックスが表示された場合は、[**ルールの作成**] を選択します。それ以外の場合は、**[ルールを作成]** を選択します。

1. **[ルールプロパティ]** ページで、**MoistureSensorRule** などの **[ルール名]** を入力し、**Sends an alert when soil moisture level readings are too low** などの短い **[ルールの説明]** を入力します。

1. **[次へ]** を選択し、SQL ステートメントを設定します。**SQL バージョン**を **2016-03-23** として選択し、次の AWS IoT SQL クエリステートメントを入力します。

   ```
   SELECT * FROM '$aws/things/RaspberryPi/shadow/update/accepted' WHERE state.reported.moisture < 400
   ```

   このステートメントは、`moisture` の読み取り値が `400` より小さい場合にルールアクションをトリガーします。
**注記**  
別の値の使用が必要になる場合があります。Raspberry Pi でコードを実行したら、センサーに触れたり、水に入れたり、プランター内に置いたりすることで、センサーから取得した値を表示できます。

1. **[次へ]** を選択し、ルールアクションをアタッチします。**[アクション 1]** で、**[Simple Notification Service]** を選択します。このルールアクションの説明は **[SNS プッシュ通知としてメッセージを送信します]** です。

1. **[SNS トピック]** では、[ステップ 3: Amazon SNS トピックおよびサブスクリプションを作成する](iot-moisture-create-sns-topic.md)、、**MoistureSensorTopic** で作成したトピックを選択し、**[メッセージ形式]** を **[RAW]** のままにします。**[IAM role]** (IAM ロール) は、**[Create a new role]** (新しいロールの作成) を選択します。ロールの名前 (例: **LowMoistureTopicRole**) を入力し、**[ロールを作成]** を選択します。

1. **[次へ]** を選択して確認してから、**[作成]** を選択してルールを作成します。

# Raspberry Pi と湿度センサーのセットアップ
<a name="iot-moisture-raspi-setup"></a>



microSD カードを Raspberry Pi に挿入し、モニター、キーボード、マウスを接続し、Wi-Fi を使用していない場合はイーサネットケーブルも接続します。電源ケーブルはまだ接続しないでください。

JST ジャンパーケーブルを湿度センサーに接続します。ジャンパーの反対側には次の 4 本のワイヤがあります。
+ 緑: I2C SCL
+ 白: I2C SDA
+ 赤: 電源 (3.5 V)
+ 黒: アース

右側にあるイーサネットジャックで Raspberry Pi を保持します。この向きでは、上部に 2 列の GPIO ピンがあります。次の順序で、湿度センサーのワイヤをピンの下の列に接続します。左端のピンから、赤 (電源)、白 (SDA)、緑 (SCL) を接続します。1 つのピンをスキップし、黒い (アース) ワイヤを接続します。詳細については、「[Python Computer Wiring](https://learn.adafruit.com/adafruit-stemma-soil-sensor-i2c-capacitive-moisture-sensor/python-circuitpython-test)」を参照してください。

電源ケーブルを Raspberry Pi に接続し、もう一方の端をコンセントに接続して電源を入れます。

**Raspberry Pi を設定します。**

1. [**Welcome to Raspberry Pi**] で、[**Next**] を選択します。

1. 国、言語、タイムゾーン、キーボードレイアウトを選択します。[**Next**] を選択します。

1. Raspberry Pi のパスワードを入力し、[**Next**] を選択します。

1. Wi-Fi ネットワークを選択し、[**Next**] を選択します。Wi-Fi ネットワークを使用していない場合は、[**Skip**] を選択します。

1. [**Next**] を選択して、ソフトウェアの更新を確認します。更新が完了したら、[**Restart**] を選択して Raspberry Pi を再起動します。

Raspberry Pi が起動したら、I2C インターフェイスを有効にします。

1. Raspbian デスクトップの左上隅にある Raspberry アイコンをクリックし、[**Preferences**]、[**Raspberry Pi Configuration**] の順に選択します。

1. [**Interfaces**] タブの [**I2C**] で、[**Enable**] を選択します。

1. [**OK**] を選択します。

Adafruit STEMMA 湿度センサーのライブラリは、CircuitPython 向けに記述されています。それらのライブラリを Raspberry Pi で実行するには、最新バージョンの Python 3 をインストールする必要があります。

1. コマンドプロンプトから次のコマンドを実行して、Raspberry Pi ソフトウェアを更新します。

   `sudo apt-get update`

   `sudo apt-get upgrade`

1. 次のコマンドを実行して、Python 3 のインストールを更新します。

   `sudo pip3 install --upgrade setuptools`

1. 次のコマンドを実行して、Raspberry Pi GPIO ライブラリをインストールします。

   `pip3 install RPI.GPIO`

1. 次のコマンドを実行して、Adafruit Blinka ライブラリをインストールします。

   `pip3 install adafruit-blinka`

   詳細については、「[Installing CircuitPython Libraries on Raspberry Pi](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi)」を参照してください。

1. 次のコマンドを実行して、Adafruit Seesaw ライブラリをインストールします。

   `sudo pip3 install adafruit-circuitpython-seesaw`

1. 次のコマンドを実行して、 AWS IoT Device SDK for Python をインストールします。

   `pip3 install AWSIoTPythonSDK`

これで、必要なすべてのライブラリが Raspberry Pi にインストールされました。**moistureSensor.py** という名前のファイルを作成し、次の Python コードをファイルにコピーします。

```
from adafruit_seesaw.seesaw import Seesaw
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient
from board import SCL, SDA

import logging
import time
import json
import argparse
import busio

# Shadow JSON schema:
#
# {
#   "state": {
#       "desired":{
#           "moisture":<INT VALUE>,
#           "temp":<INT VALUE>            
#       }
#   }
# }

# Function called when a shadow is updated
def customShadowCallback_Update(payload, responseStatus, token):

    # Display status and data from update request
    if responseStatus == "timeout":
        print("Update request " + token + " time out!")

    if responseStatus == "accepted":
        payloadDict = json.loads(payload)
        print("~~~~~~~~~~~~~~~~~~~~~~~")
        print("Update request with token: " + token + " accepted!")
        print("moisture: " + str(payloadDict["state"]["reported"]["moisture"]))
        print("temperature: " + str(payloadDict["state"]["reported"]["temp"]))
        print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")

    if responseStatus == "rejected":
        print("Update request " + token + " rejected!")

# Function called when a shadow is deleted
def customShadowCallback_Delete(payload, responseStatus, token):

     # Display status and data from delete request
    if responseStatus == "timeout":
        print("Delete request " + token + " time out!")

    if responseStatus == "accepted":
        print("~~~~~~~~~~~~~~~~~~~~~~~")
        print("Delete request with token: " + token + " accepted!")
        print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")

    if responseStatus == "rejected":
        print("Delete request " + token + " rejected!")


# Read in command-line parameters
def parseArgs():

    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--endpoint", action="store", required=True, dest="host", help="Your device data endpoint")
    parser.add_argument("-r", "--rootCA", action="store", required=True, dest="rootCAPath", help="Root CA file path")
    parser.add_argument("-c", "--cert", action="store", dest="certificatePath", help="Certificate file path")
    parser.add_argument("-k", "--key", action="store", dest="privateKeyPath", help="Private key file path")
    parser.add_argument("-p", "--port", action="store", dest="port", type=int, help="Port number override")
    parser.add_argument("-n", "--thingName", action="store", dest="thingName", default="Bot", help="Targeted thing name")
    parser.add_argument("-id", "--clientId", action="store", dest="clientId", default="basicShadowUpdater", help="Targeted client id")

    args = parser.parse_args()
    return args


# Configure logging
# AWSIoTMQTTShadowClient writes data to the log
def configureLogging():

    logger = logging.getLogger("AWSIoTPythonSDK.core")
    logger.setLevel(logging.DEBUG)
    streamHandler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    streamHandler.setFormatter(formatter)
    logger.addHandler(streamHandler)


# Parse command line arguments
args = parseArgs()

if not args.certificatePath or not args.privateKeyPath:
    parser.error("Missing credentials for authentication.")
    exit(2)

# If no --port argument is passed, default to 8883
if not args.port: 
    args.port = 8883


# Init AWSIoTMQTTShadowClient
myAWSIoTMQTTShadowClient = None
myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient(args.clientId)
myAWSIoTMQTTShadowClient.configureEndpoint(args.host, args.port)
myAWSIoTMQTTShadowClient.configureCredentials(args.rootCAPath, args.privateKeyPath, args.certificatePath)

# AWSIoTMQTTShadowClient connection configuration
myAWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10) # 10 sec
myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5) # 5 sec

# Initialize Raspberry Pi's I2C interface
i2c_bus = busio.I2C(SCL, SDA)

# Intialize SeeSaw, Adafruit's Circuit Python library
ss = Seesaw(i2c_bus, addr=0x36)

# Connect to AWS IoT
myAWSIoTMQTTShadowClient.connect()

# Create a device shadow handler, use this to update and delete shadow document
deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName(args.thingName, True)

# Delete current shadow JSON doc
deviceShadowHandler.shadowDelete(customShadowCallback_Delete, 5)

# Read data from moisture sensor and update shadow
while True:

    # read moisture level through capacitive touch pad
    moistureLevel = ss.moisture_read()

    # read temperature from the temperature sensor
    temp = ss.get_temp()

    # Display moisture and temp readings
    print("Moisture Level: {}".format(moistureLevel))
    print("Temperature: {}".format(temp))
    
    # Create message payload
    payload = {"state":{"reported":{"moisture":str(moistureLevel),"temp":str(temp)}}}

    # Update shadow
    deviceShadowHandler.shadowUpdate(json.dumps(payload), customShadowCallback_Update, 5)
    time.sleep(1)
```

このファイルを、見つけられる場所に保存します。以下のパラメータを使用して、コマンドラインから `moistureSensor.py` を実行します。

エンドポイント  
カスタム AWS IoT エンドポイント。詳細については、「[Device Shadow の REST API](device-shadow-rest-api.md)」を参照してください。

rootCA  
 AWS IoT ルート CA 証明書へのフルパス。

cert  
 AWS IoT デバイス証明書へのフルパス。

key  
 AWS IoT デバイス証明書のプライベートキーへのフルパス。

thingName  
モノの名前 (この場合は `RaspberryPi`)。

clientId  
MQTT クライアント ID。`RaspberryPi` を使用します。

コマンドラインは次のようになります。

`python3 moistureSensor.py --endpoint your-endpoint --rootCA ~/certs/AmazonRootCA1.pem --cert ~/certs/raspberrypi-certificate.pem.crt --key ~/certs/raspberrypi-private.pem.key --thingName RaspberryPi --clientId RaspberryPi`

センサーに触れたり、プランター内に置いたり、コップの水に入れたりして、センサーがさまざまなレベルの湿気にどのように反応するかを確認します。必要に応じて、`MoistureSensorRule` でしきい値を変更できます。湿度センサーの読み取り値がルールの SQL クエリステートメントで指定された値を下回ると、 は Amazon SNS トピックにメッセージ AWS IoT を発行します。湿度と温度データが含まれた E メールメッセージが届きます。

Amazon SNS からの E メールメッセージの受信を確認したら、**Ctrl\$1C** を押して Python プログラムを停止します。Python プログラムが、料金がかかる量のメッセージを送信することはほとんどありませんが、終了したらプログラムを停止することをお勧めします。