AWS Greengrass CoreをEC2でセットアップする

ども、大瀧です。
本日一般利用可能になったAWS Greengrassは、IoTデバイス/ゲートウェイとAWSクラウドを連携させるサービスです。

デバイス側で実行するソフトウェアはGreengrass Core(以下GGC)と呼び本来はRaspberry Piなどで実行するところなのですが、Greengrassの動作確認をするのであれば手軽に利用できるコンピュートリソースとしてEC2で実行するのもいいかな?ということで、ドキュメントに記載されている手順に従いつつ、ひっかかったところを補足しながらレポートします。

動作確認環境

  • AWSリージョン : オレゴン(us-west-2)リージョン
  • EC2のAMI : amzn-ami-hvm-2016.03.3.x86_64-gp2 (ami-7172b611)

1. Amazon Linux 2016.03のセットアップ

まずはAmazon LinuxでGGCを実行するための事前準備として以下を行います。

  1. cmake-3.8.0のインストール
  2. openssl-1.0.2kのインストール
  3. カーネルパラメータの調整
  4. cgroupsの調整

1,2については、ec2-userユーザーでSSH接続し、以下のコマンドラインをコピペで実行すればOKです。

sudo yum groupinstall -y "Development Tools"
wget https://cmake.org/files/v3.8/cmake-3.8.0.tar.gz
tar -zxf cmake-3.8.0.tar.gz
cd cmake-3.8.0
./configure
make
sudo make install
cd
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar -xvzf openssl-1.0.2k.tar.gz 
cd openssl-1.0.2k
./config --prefix=/usr/
make
sudo make install

3は、/etc/sysctl.d/00-defaults.confファイルの末尾に以下を追記します。

fs.protected_hardlinks = 1
fs.protected_symlinks = 1

4は、/etc/cgconfig.confファイルの27〜29行目に以下を挿入し、無効になっているcgconfigサービスを有効化します。(ドキュメントにはcgroupsについての記載がなかったので、後で実行するgreengrassdのエラーメッセージから今回の対応方法を検証しました)

      :
    perf_event = /cgroup/perf_event;
    net_cls    = /cgroup/net_cls;
    net_prio   = /cgroup/net_prio;
    pids       = /cgroup/pids;
}
$ sudo chkconfig cgconfig on

1〜4の作業が完了したら、一度再起動します。

$ sudo reboot

これでOKです。

2. Greengrassのセットアップ

続いて、AWS Management ConsoleとAWS CLIを用いてGGCからGreengrassに接続するためのセットアップを行います。Management ConsoleのGreengrass管理画面にアクセスし、Welcomeページ左側の[Define a Greengrass Group] - [Get Started]ボタンをクリックします。

ggc-ec201

Greengrassでは、GGCを実行するデバイスをグループ化するGreengrassグループを定義します。今回はグループの作成とそれに付随する作業をまとめて行える、Easy Group creationを利用します。[Use easy creation]をクリックします。

ggc-ec202

任意のグループ名を入力し、[Next]ボタンをクリックします。

ggc-ec203

続いて、Greengrass側で管理するGGC名を入力します。既定では「<グループ名>_Core」となるので、今回は変更せず[Next]をクリックします。

ggc-ec204

Easy Group creationで実行される各処理の確認画面が表示されるので、[Create Group and Core]ボタンをクリックして実行します。

ggc-ec205

作成が完了すると、GGCで使用する証明書とGGCの実行ファイル一式として以下のダウンロードリンクが表示されるので、それぞれダウンロードします(XXXXXXXXXはCoreごとに一意なIDです)。

  • XXXXXXXXXX-certificate.pem.crt : 証明書ファイル(Management Consoleに表示されるファイル名とは異なります)
  • XXXXXXXXXX-private.pem.key : 秘密鍵ファイル(Management Consoleに表示されるファイル名とは異なります)
  • greengrass-linux-x86-64-1.0.0.tar.gz : GGC実行ファイル一式

ggc-ec206

[Finish]ボタンをクリックすると、作成したグループのページに遷移します。このあとのGGCのセットアップのためにプロパティを確認します。[Cores]から作成したGGC(今回は「group1_Core」)をクリックします。

ggc-ec207

以下2点をコピーしておきましょう。

  • thingArn : [Details]の[Thing ARN]にある、GGCに割り当てられるAWS IoT ThingのARN ggc-ec208
  • iotHost : [Interact]の[HTTPS]にある、AWS IoTのエンドポイント ggc-ec209

最後に、GreengrassからAWS IoTおよびAWS Lambdaにアクセスするためのサービスロールを作成、割り当てます。

Management ConsoleのIAM管理画面のメニューから[ロール]を選択し、[ロールの作成]ボタンをクリックします。

ggc-ec210

[AWSサービスロール]から「AWS Greengrass Role」の右にある「選択」ボタンをクリックします。

ggc-ec211

ロールに割り当てるポリシー一覧から「greengrass」などで検索し、「AWSGreengrassResourceAccessPolicy」を選択、[次のステップ]をクリックします。

ggc-ec212

「GreengrassServiceRole」など適当なロール名を入力し、IAMロールを作成します。作成したロールのプロパティを表示し、ARNをコピーします。

ggc-ec213

AWS CLIで、作成したロールをアカウントのGreengrassサービスに紐付けます。

$ aws greengrass associate-service-role-to-account --region us-west-2 --role-arn arn:aws:iam::XXXXXXXXXXXX:role/GreengrassServiceRole
2017-06-08T01:37:27Z
$

これでOKです。

3. Greengrass Coreのセットアップ

手順1で準備したEC2インスタンスに手順2でダウンロードした証明書、実行ファイルをscpなどでコピーします。

$ scp XXXXXXXXXX-* ec2-user@XX.XX.XX.XX:/home/ec2-user
$ scp greengrass-linux-x86-64-1.0.0.tar.gz ec2-user@XX.XX.XX.XX:/home/ec2-user

改めてSSH接続し、コピーした実行ファイルのアーカイブを/以下に展開します。

[ec2-user@ip-XX-XX-XX-XX ~]$ sudo tar -zxf greengrass-linux-x86-64-1.0.0.tar.gz -C /

展開されたファイルのうち、GGCの構成ファイルは以下です。

  • /greengrass/configuration/config.json : 構成ファイル(このあと編集します)
  • /greengrass/configuration/certs/ : 証明書ファイルの配置ディレクトリ(構成ファイルから相対パスで指定)
  • /greengrass/greengrassd : 実行ファイル(中身はシェルスクリプト)
  • /greengrass/var/log/system/ : GGCの実行ログの配置ディレクトリ(greengrassd実行時に作成されます)
  • /greengrass/crash.log : エラーログファイル(greengrassd実行時に作成されます)

コピーした証明書ファイルを移動、リネームします。

[ec2-user@ip-XX-XX-XX-XX ~]$ sudo mv XXXXXXXXXXXX-certificate.pem.crt /greengrass/configuration/certs/certificate.pem.crt
[ec2-user@ip-XX-XX-XX-XX ~]$ sudo mv XXXXXXXXXXXX-private.pem.key /greengrass/configuration/certs/private.pem.key

CA証明書は例に拠ってVerisignのものをダウンロードします。

[ec2-user@ip-XX-XX-XX-XX ~]$ sudo wget http://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -O /greengrass/configuration/certs/cacert.pem

構成ファイルを編集し、以下2点と証明書のファイル名の修正、手順2の設定値(thingArniotHost)に合わせます。

  • coreThing::ggHostはリージョン名のみ編集
  • runtime::cgroup::useSystemdはAmazon Linuxがsystemdに対応しないのでno
{
    "coreThing": {
        "caPath": "cacert.pem",
        "certPath": "certificate.pem.crt",
        "keyPath": "private.pem.key",
        "thingArn": "arn:aws:iot:us-west-2:XXXXXXXXXXXX:thing/group1_Core",
        "iotHost": "XXXXXXXXXXXX.iot.us-west-2.amazonaws.com",
        "ggHost": "greengrass.iot.us-west-2.amazonaws.com"
    },
    "runtime": {
        "cgroup": {
            "useSystemd": "no"
        }
    }
}

これでOKです。以下のコマンドでGGCを実行します。

[ec2-user@ip-XX-XX-XX-XX ~]$ cd /greengrass/
[ec2-user@ip-XX-XX-XX-XX ~]$ sudo ./greengrassd start
Setting up greengrass daemon
Validating execution environment
Found cgroup subsystem: cpuset
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
Found cgroup subsystem: perf_event
Found cgroup subsystem: net_prio
Found cgroup subsystem: hugetlb
Found cgroup subsystem: pids

Starting greengrass daemon.....
Greengrass daemon started with PID: 3234
[ec2-user@ip-XX-XX-XX-XX ~]$

動いたようです。実行ログを確認してみると...

[ec2-user@ip-XX-XX-XX-XX ~]$ sudo tailf /greengrass/var/log/system/runtime.log
[2017-06-08T02:04:58.757Z][INFO]-Starting worker arn:aws:lambda:::function:GGRouter
[2017-06-08T02:04:58.757Z][INFO]-Starting worker arn:aws:lambda:::function:GGShadowService
[2017-06-08T02:04:58.757Z][INFO]-Started all system components
[2017-06-08T02:04:58.975Z][INFO]-Started Deployment Agent and listening for updates
[2017-06-08T02:04:58.975Z][INFO]-Started Deployment Agent and listening for updates
[2017-06-08T02:04:58.975Z][INFO]-Deployment agent connected to cloud
[2017-06-08T02:04:58.975Z][INFO]-Trying to subscribe to topic $aws/things/group1_Core-gda/shadow/update/delta
[2017-06-08T02:04:59.031Z][INFO]-Subscribed to : $aws/things/group1_Core-gda/shadow/update/delta
[2017-06-08T02:04:59.031Z][INFO]-Trying to subscribe to topic $aws/things/group1_Core-gda/shadow/get/accepted
[2017-06-08T02:04:59.058Z][INFO]-Subscribed to : $aws/things/group1_Core-gda/shadow/get/accepted

Greengrassへの接続に成功しているメッセージが確認できました。

まとめ

AWS Greengrass CoreをEC2(Amazon Linux)で実行する様子をご紹介しました。Greengrassは非常に多機能なので、今回のセットアップを土台として、様々な機能を評価いただければと思います。Lambdaの実行とCore endpoints(Coreの相互接続)はぜひ試してみたいですね。

参考URL