

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

# 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 リソースとオブジェクトを削除したら、チュートリアルを最初からやり直すことができます。