メニュー
AWS Greengrass
開発者ガイド

チュートリアル: AWS Greengrass を Raspberry Pi にデプロイする

このチュートリアルでは、AWS Greengrass グループ の作成、AWS Greengrass コア の追加、および AWS Greengrass コア ソフトウェアの Raspberry Pi へのデプロイを行います。そして、Lambda 機能を AWS Greengrass コア デバイスで実行して、デプロイをテストします。

このチュートリアルは、できるだけ少ないステップで AWS Greengrass での作業を開始できることを目的としています。このために、チュートリアルではハードウェアに関するいくつかの前提を用い、また Raspberry Pi の設定において主観による解釈を行います。このチュートリアルの完了までの所要時間は 1~2 時間です。

注記

このチュートリアルは、Mac 用に作成されています。

要件

このチュートリアルを完了するには、以下を行ってください。

  • Mac

  • Raspberry Pi (このチュートリアルでは Raspberry Pi 3 モデル 3 を使用しますが、すべての Pi で作動するはずです。)

  • AWS アカウント

  • AWS コマンドラインインターフェース (インストールに関する説明は、AWS Command Line Interface ユーザーガイド を参照)

AWS アカウントがない場合は、「AWS 無料アカウント作成方法」の手順で作成できます。

Raspberry Pi のセットアップ

Raspberry Pi をセットアップするには

  1. SD メモリーカードフォーマッタを使用して、SD カードをフォーマットします。SD フォーマッタアプリの Mac バージョンは、Mac ダウンロードページからダウンロードできます。クイックフォーマットオプションを使用できます。

  2. Pi の最新 Raspbian オペレーティングシステムをインストールします。

    1. 最新の Raspberry オペレーティングシステムを Raspberry Pi ダウンロードページからダウンロードします。このチュートリアルには、Lite バージョンをダウンロードできます。

    2. SD カードをマウントする場所を決定します (サイズによってディスクの検索ができます)。

      $diskutil リスト

    3. 次のコマンドを実行します。ここでは、N は前のステップで検出したディスクの番号が該当します。

      $ diskutil unmountDisk /dev/diskN

    4. Raspberry Pi からダウンロードした OS をインストールします (このプロセスは完了に数分かかる場合があります)。

      $ sudo dd bs=1m if=file_name.img of=/dev/diskN

  3. SSH ファイルを作成します (これは、Pi で SSH を有効にする環境です)。

    $ cd /Volumes/boot

    $ touch ssh

    この時点で、SD カードが Rasbperry Pi にインストールできる準備が整っていることが必要です。

  4. Mac に Raspberry Pi を接続します。まず、Mac にワイヤレスインターネット接続があり、インターネット共有が該当するポートで有効であることを確認します。次に、次のステップを実行します。

    1. Raspberry Pi に SD カードを挿入します。

    2. イーサーネットケーブルで Raspberry Pi を Mac に接続します。

    3. Raspberry Pi を電源に接続します。

    この時点で、Raspberry Pi が独自の IP アドレスを保持していることが必要です。

  5. Raspberry Pi の IP アドレスを決定します。IP アドレスを検索する最も簡単は方法としては、ping raspberrypi あるいは ping raspi を実行します。Ping で作動しない場合には、次の方法から 1 つを試行します。

  6. Raspberry Pi を SSH を介して接続し、例の IP アドレスを Raspberry Pi のアドレスに置き換えます。

    ssh pi@192.168.1.154

    初期パスワードは raspberry になります。ベストプラクティスとしては、より安全なパスワードに変更する必要があります。

  7. Raspbian ディストリビューションにソフトウェアのアップグレードをインストールします。

    $ sudo apt-get update

    $ sudo apt-get upgrade

  8. タイムゾーンを設定します。

    $ sudo dpkg-reconfigure tzdata

  9. Raspbian 構成ツールを実行し、オペレーティングシステムを設定します。

    $ sudo raspi-config

    1. raspi-config tool ツールを更新するには [更新] を選択します。

    2. Hostname を選択し、Raspberry Pi のホット名を設定します。

    3. Choose [詳細オプション] > [Expand Filesystem] を選択して、すべての SD カードストレージが利用可能であることを確認します。

    4. 必要な変更が完了したら、Raspberry Pi を再起動します。

      raspi-config の詳細については、オフィシャルドキュメントを参照してください。

Greengrass 用に Raspberry Pi を準備する

以下のステップに従って、AWS Greengrass コア ソフトウェアの実行用に Raspberry Pi を準備します。

AWS Greengrass コア ソフトウェアを実行するには

  1. 次のコマンドを使用して、ggc_user というユーザーと ggc_group というグループを追加します。

    sudo adduser --system ggc_user

    sudo addgroup --system ggc_group

  2. 次のコマンドを使用して sqlite3 をインストールします。

    sudo apt-get install sqlite3

AWS Greengrass コア ソフトウェアは、起動時にオペレーティングシステムでハードリンク/ソフトリンクの保護が有効かどうかを確認します。デバイスのセキュリティを向上させるために、この保護を有効にすることをお勧めします。以下の手順に従ってください.

  1. 次の 2 つの行を /etc/sysctl.d/98-rpi.conf に追加してシステム変数を設定します。

    Copy
    fs.protected_hardlinks = 1 fs.protected_symlinks = 1

    ファイル /etc/sysctl.d/98-rpi.conf が存在しない場合は、/etc/sysctl.d/README.sysctl の手順に従います。

  2. システムを再起動します。

    sudo reboot

  3. 以下を実行して変更を検証します。

    sudo sysctl -a | grep fs

    システム変数が正常に設定されると、次のような設定が表示されます。

    fs.protected_hardlinks = 1

    fs.protected_symlinks = 1

AWS Greengrass グループおよび AWS Greengrass コアを作成する

AWS Greengrass グループ は、AWS Greengrass コア デバイスを通じて相互に通信するようプログラムできる、ローカルデバイスと Lambda 関数のクラウドで設定されるマネージド型のコレクションです。AWS Greengrass グループ と AWS Greengrass コア を作成するには、AWS IoT コンソールにログインし、次の手順を実行します。

  1. ナビゲーションペインで、[Greengrass] を選択します。

  2. AWS Greengrass ページで、[Get Started] を選択します。

Greengrass グループを作成する

AWS Greengrass アプリケーションでは、デバイスは AWS Greengrass グループ に配置されます。AWS Greengrass グループ には、デバイスに関する情報と、AWS Greengrass グループ でのメッセージの処理方法に関する情報が含まれます。各 AWS Greengrass グループ では、グループ内で送信されたメッセージを処理する AWS Greengrass コア が必要です。AWS Greengrass コア では、AWS Greengrass と AWS IoT クラウドサービスにアクセスするために証明書と AWS IoT ポリシーが必要です。[Set up your Greengrass group] ページで、[Use easy creation] を選択します。

  1. グループの名前を入力し、[Next] を選択します。

  2. AWS Greengrass コア のデフォルト名を使用し、[Next] を選択します。

  3. [Create Group and Core] を選択します。

  4. リンクをクリックして、プライベートキー、パブリックキー、および AWS Greengrass コア の証明書をダウンロードします。

  5. AWS Greengrass コア で実行する CPU アーキテクチャ (今回は ARMv7l) を選択し、[Download Greengrass] を選択して Greengrass ソフトウェアパッケージをダウンロードします。ダウンロードが完了したら、[Finish] を選択します。

AWS Greengrass コアのプロビジョン

AWS Greengrass コア をプロビジョンするには、AWS Greengrass コア デバイスに AWS Greengrass コア ソフトウェアと証明書をインストールする必要があります。

AWS Greengrass コアソフトウェアのインストール

  1. AWS Greengrass コア ソフトウェアは、AWS Greengrass からダウンロードした greengrass-platform-version.tar.gz ファイルにあります。Mac で scp ユーティリティを使用すると、ダウンロードした AWS Greengrass コア ソフトウェアを Pi にコピーできます。

    Copy
    scp greengrass-platform-version.tar.gz pi@ip_address:/path/to/desired/dir

    次に、Pi で次のコマンドを使用して greengrass-platform-version.tar.gz を抽出します。

    Copy
    sudo tar -zxf greengrass-platform-version.tar.gz -C /

    これにより、配布可能な AWS Greengrass がデバイスのルートディレクトリの greengrass ディレクトリに抽出されます。

  2. Lambda の cgroup を自動的に設定するには、cgroup /sys/fs/cgroup cgroup defaults 0 0 をデバイスの /etc/fstab ファイルに追加し、デバイスを再起動します。

    注記

    Linux コントロールグループ (cgroups) は、AWS Greengrass コア デバイス上で実行される Lambda 関数からアクセスできるリソースを制限するために使用します。cgroups が AWS Greengrass コア デバイスのオペレーティングシステム上で有効になっていない場合は、こちらのスクリプトを実行します。

AWS Greengrass コアデバイスへの証明書のインストール

AWS Greengrass コア デバイスは、MQTT over TLS を使用して AWS IoT への安全な接続を確立する必要があります。これを有効にするには、証明書、プライベートキー、AWS IoT を /greengrass/certs ディレクトリのルート CA 証明書に置く必要があります。証明書とプライベートキーは、AWS Greengrass グループ を作成したときにすでにダウンロードしてあります。以下のステップに従ってルート CA 証明書を取得し、すべての証明書を Raspberry Pi の適切な場所にコピーします。

  1. Verisign から AWS IoT ルート CA 証明書をコピーして、ファイルに保存します。

  2. Mac では、ルート CA 証明書を Pi のホームディレクトリにコピーします。

    Copy
    scp root-ca-cert.pem pi@ip_address:/home/pi

    注記

    ルート CA 証明書には任意のファイル名を使用できます。後のステップでファイルを Greengrass に指定できます。今回は、root-ca-cert.pem という名前のファイルに証明書を保存しました。

    Pi でルート証明書を Greengrass 証明書ディレクトリにコピーします。

    Copy
    sudo cp root-ca-cert.pem /greengrass/certs/
  3. Mac では、プライベートキーを Pi のホームディレクトリにコピーします。

    Copy
    scp GUID-private.pem.key pi@ip_address:/home/pi

    次に、Pi でプライベートキーを Greengrass 証明書ディレクトリにコピーします。

    Copy
    sudo cp GUID-private.pem.key /greengrass/certs/
  4. Mac では、証明書を Pi のホームディレクトリにコピーします。

    Copy
    scp GUID-certificate.pem.crt pi@ip_address:/home/pi

    次に、Pi で証明書を Greengrass 証明書ディレクトリにコピーします。

    Copy
    sudo cp GUID-certificate.pem.crt /greengrass/certs/

完了したら、証明書、プライベートキー、ルート CA 証明書のすべてが /greengrass/certs/ にインストールされているはずです。

AWS に接続する

以下の手順では、AWS Greengrass を設定してクラウドに保存し、変更内容を AWS Greengrass コア にプッシュする方法を示します。以下は AWS Greengrass を操作するための推奨される方法です。

Greengrass サービスロールの作成

AWS Greengrass は、AWS Lambda と AWS IoT データにアクセスする必要があります。

IAM ロールを作成するには、IAM コンソール (https://console.aws.amazon.com/iam/) を使用します。

  1. IAM コンソールで [ロール] > [ロールの作成] を選択します。

  2. [ロールタイプ] で [AWS サービス] > [Greengrass] を選択します。続いて、[Next: Permissions] を選択します。

  3. アクセス許可では、[AWSGreengrassResourceAccessPolicy]、[次へ: レビュー] の順に選択します。

  4. ロールの名前を入力し、[ロールの作成] を選択します。

  5. ロールを作成後、そのロールを選択し、ロールの ARN を書き留めます。これは次のステップで必要になります。

Greengrass サービスロールをアカウントに関連付ける

まだ行っていない場合には、AWS Command Line Interface ユーザーガイド の説明に従って AWS コマンドラインインターフェースを Mac にインストールします。次に、次のコマンドを実行して、ロールの ARN を前のステップで書き留めたロール ARN に置き換えます。

Copy
aws greengrass associate-service-role-to-account --role-arn arn:aws:iam::123451234510:role/GreengrassRole

AWS Greengrass コアの設定

Pi で 設定ファイルを編集、または /greengrass/config/config.json で新規作成します。

Copy
{ "coreThing": { "caPath": "[ROOT_CA_PEM_HERE]", "certPath": "[CLOUD_PEM_CRT_HERE]", "keyPath": "[CLOUD_PEM_KEY_HERE]", "thingArn": "[THING_ARN_HERE]", "iotHost": "[HOST_PREFIX_HERE].iot.[AWS_REGION_HERE].amazonaws.com", "ggHost": "greengrass.iot.[AWS_REGION_HERE].amazonaws.com", "keepAlive": 600 }, "runtime": { "cgroup": { "useSystemd": "[yes|no]" } } }

フィールド 説明 コメント

caPath

AWS IoT のルート CA 証明書のファイル名。

ファイルを /greengrass/certs に保存します。

certPath

AWS Greengrass コア 証明書のファイル名。

ファイルを /greengrass/certs に保存します。

keyPath

AWS Greengrass コア プライベートキーのファイル名。

ファイルを /greengrass/certs に保存します。

thingArn

AWS Greengrass コア を表すモノの ARN。

これは、AWS IoT コンソールで [Greengrass] > [グループ] にアクセスし、[コア] を選択してから使用する Greengrass コアを選ぶことで検索できます。

iotHost

AWS IoT エンドポイント。

CLI コマンドの aws iot describe-endpointを使用するか、AWS IoT コンソールの [Settings] セクションを使用して取得できます。

ggHost

AWS Greengrass エンドポイント。

エンドポイントの構築時に、接続する AWS リージョンを追加します。

keepAlive

MQTT KeepAlive 期間 (秒単位)。

オプション。デフォルト値は 600 秒 (10 分) です。

useSystemd

systemd を使用して cgroup を管理します。

システムの init システムが systemd である場合は、systemd を使用して cgroup を管理することを強くお勧めします。

有効な値は、yes および no です。yes を指定します。

無効な値を指定すると、次のエラーメッセージが返されます.

AWS Greengrass コアを起動してクラウドに接続する

/greengrass/ggc/packages/version ディレクトリから次のコマンドを実行してコアを起動し、AWS IoT へのクラウド接続を有効にします。

Copy
sudo ./greengrassd start

Greengrass デーモンが正常に実行された場合は、次に類似する出力が表示されます。

Copy
sudo /greengrass/greengrassd start Setting up greengrass daemon Validating execution environment ggc_group:x:119: Found cgroup subsystem: cpu Found cgroup subsystem: cpuacct Found cgroup subsystem: blkio Found cgroup subsystem: memory Found cgroup subsystem: devices Found cgroup subsystem: freezer Found cgroup subsystem: net_cls Starting greengrass daemon PID: 1306 Greengrass daemon started

以下のエラーが表示された場合は、

Copy
The cgroup subsystem is not mounted: cpuset

このスクリプトを実行して、有効な cgroups をマウントします。

Copy
# used script from: https://raw.githubusercontent.com/tianon/cgroupfs-mount/master/cgroupfs-mount sudo bash ./script.sh

注記

Linux コントロールグループ (cgroups) は、AWS Greengrass コア デバイス上で実行される Lambda 関数からアクセスできるリソースを制限するために使用します。

AWS Greengrass コア デバイス上の /etc/fstab ファイルに cgroup /sys/fs/cgroup cgroup defaults 0 0 を追加して、AWS Greengrass コア デバイスを再起動するときに Lambda cgroup を自動的に再設定できます。

「Hello World」Lambda 関数を作成する

AWS Greengrass コア は、デバイス (または他の Lambda 関数) によって送信されたメッセージに応じて Lambda 関数を実行できます。ここでは、AWS Greengrass グループ に追加し、続いて AWS Greengrass コア にデプロイする Lambda 関数を作成します。

  1. [Service] ドロップダウンメニューから、AWS Lambda コンソールに移動します。

  2. Lambda コンソールで、[関数の作成] を選択します。

  3. [Filter] テキストボックスに「Greengrass」と入力し、greengrass-hello-world Lambda 設計図を選択します。

  4. [Next] を選択します。

  5. [Name] に、「HelloWorld」と入力します。[Runtime] で [Python 2.7] を選択します。

  6. [Lambda function handler and role] が表示されるまで下へスクロールします。[Role] で、[Choose an existing role] を選択します。[既存のロール] で、1 つのロールを選択します。ロールがない場合は、[Create a new role from template(s)] を選択し、[Policy templates] ドロップダウンリストからいずれかのテンプレートを選択します。[Next] を選択します。

    注記

    アカウントでこれまでに Lambda 関数ハンドラおよびロールをまだ作成していない場合には、[テンプレートから新しいロールを作成] し、[1 つを選択] する必要があります。

  7. [Review] ページで、[Create function] を選択します。

  8. ここで、Hello World Lambda 関数の新しいバージョンを発行する必要があります。[Actions] メニューから、[Publish new version] を選択します。

  9. [Version description] に「Test」と入力し、[Publish] を選択します。

Lambda 関数をグループの定義に追加する

次に、Hello World Lambda 関数をグループの定義に追加します。ローカルにデプロイされた後、関数は AWS IoT プラットフォームにデータを送信し、機能するコアがデプロイされたことを表示します。

  1. AWS IoT コンソールで、[Greengrass]、[Groups] の順に選択します。

  2. グループのタイルを選択します。

  3. ナビゲーションペインで [Lambdas]、[Add your first Lambda] の順に選択します。

  4. [Use existing Lambda] を選択します。

  5. 前に作成した Hello World Lambda 関数を選択し、[Next] を選択します。

  6. 使用する Hello World Lambda 関数のバージョンを選択し、[Finish] を選択します。

HelloWorld Lambda 関数の設定

長期実行となるように HelloWorld 関数を設定します。

  1. Lambda 関数の右上隅にある省略記号を選択し、[設定の編集] を選択します。

  2. [Lambda lifecycle] で、[Make this function long-lived and keep it running indefinitely] を選択してから [Update] を選択します。

サブスクリプションをグループの定義に追加する

AWS Greengrass コア はデバイス、Lambda 関数、および AWS 間で、MQTT プロトコルを使用してメッセージを渡すことができます。AWS Greengrass グループ は、よりセキュアで予測可能なやり取りを可能にするサブスクリプションを使用して、これらのコンポーネントのやり取りを制御できます。サブスクリプションはソース、ターゲット、およびトピックで構成されます。ソースはメッセージの送信元です。ターゲットはメッセージの送信先です。このトピックでは、ソースからターゲットに送信されるデータをフィルタリングできます。

  1. AWS Greengrass コンソールで、グループを探して選択します。

  2. グループの詳細ページで、[Subscriptions] を選択します。

  3. [Add your first Subscription] を選択します。

  4. [Select a source] で、HelloWorld Lambda 関数を選択します。

  5. [Select a target] で、[IoT Cloud] を選択します。

  6. [Next] を選択します。

  7. トピックフィルタを使用すると、ターゲットに対して利用可能にするデータを制御できます。デフォルトでは、サブスクリプションはワイルドカードトピック (#) を使用し、ソースからターゲットにすべての情報を渡します。ここで、hello/world をこのサブスクリプションのトピックフィルタとして追加します。[Optional topic filter] で「hello/world」と入力し、[Next] を選択します。

  8. [Finish] を選択してサブスクリプションを確認して保存します。

グループのデプロイ

グループとコア定義を作成しましたが、この情報はクラウド内にのみ存在します。グループのデプロイではこの設定情報を使用し、それを AWS Greengrass コア デバイスにコピーします。

  1. AWS Greengrass コンソールで、[Groups] を選択し、グループを選択して、[Deployments] を選択します。

  2. [Actions] メニューから、[Deploy] を選択します。

  3. [Configure how Devices discover your Core] ページで、[Automatic detection] を選択します。

  4. [Grant permission to access other services] ページで、[Grant permission] を選択します。(このステップは、特定のアカウントに対して 1 回のみ必要となります)。

デプロイには数分かかる場合があります。グループの詳細ページに Deployment successfully completed メッセージが表示されたら、デプロイが成功したことがわかります。

Lambda 関数がコアデバイスで実行されていることを確認する

AWS IoT コンソールで、[Test] を選択します。

[Subscribe to topic] で「hello/world」と入力し、[Subscription topic] を選択して hello/world トピックにサブスクライブします。

hello world Lambda 関数が AWS Greengrass コア デバイスで実行されている場合、hello/world トピックにメッセージを発行できます。

以上です。これで、AWS Greengrass グループ と AWS Greengrass コア の設定を完了し、Raspberry Pi にコアのソフトウェアをインストールし、Lambda 関数を作成してグループ定義に追加し、Greengrass グループにサブスクリプションを追加し、グループをデプロイし、Lambda 関数を Pi で実行しました。