AWS Greengrass CoreをEC2でセットアップする
ども、大瀧です。
本日一般利用可能になったAWS Greengrassは、IoTデバイス/ゲートウェイとAWSクラウドを連携させるサービスです。
- AWS Greengrass – AWS Lambdaをネットワーク接続性のあるデバイス上で動かす | Amazon Web Services ブログ
- 【新サービス】AWS GreengrassがGA(一般利用開始)になりました! | Developers.IO
デバイス側で実行するソフトウェアは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を実行するための事前準備として以下を行います。
- cmake-3.8.0のインストール
- openssl-1.0.2kのインストール
- カーネルパラメータの調整
- 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]ボタンをクリックします。
Greengrassでは、GGCを実行するデバイスをグループ化するGreengrassグループを定義します。今回はグループの作成とそれに付随する作業をまとめて行える、Easy Group creationを利用します。[Use easy creation]をクリックします。
任意のグループ名を入力し、[Next]ボタンをクリックします。
続いて、Greengrass側で管理するGGC名を入力します。既定では「<グループ名>_Core」となるので、今回は変更せず[Next]をクリックします。
Easy Group creationで実行される各処理の確認画面が表示されるので、[Create Group and Core]ボタンをクリックして実行します。
作成が完了すると、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実行ファイル一式
[Finish]ボタンをクリックすると、作成したグループのページに遷移します。このあとのGGCのセットアップのためにプロパティを確認します。[Cores]から作成したGGC(今回は「group1_Core」)をクリックします。
以下2点をコピーしておきましょう。
- thingArn : [Details]の[Thing ARN]にある、GGCに割り当てられるAWS IoT ThingのARN
- iotHost : [Interact]の[HTTPS]にある、AWS IoTのエンドポイント
最後に、GreengrassからAWS IoTおよびAWS Lambdaにアクセスするためのサービスロールを作成、割り当てます。
Management ConsoleのIAM管理画面のメニューから[ロール]を選択し、[ロールの作成]ボタンをクリックします。
[AWSサービスロール]から「AWS Greengrass Role」の右にある「選択」ボタンをクリックします。
ロールに割り当てるポリシー一覧から「greengrass」などで検索し、「AWSGreengrassResourceAccessPolicy」を選択、[次のステップ]をクリックします。
「GreengrassServiceRole」など適当なロール名を入力し、IAMロールを作成します。作成したロールのプロパティを表示し、ARNをコピーします。
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の設定値(thingArn
とiotHost
)に合わせます。
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の相互接続)はぜひ試してみたいですね。