この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ども、大瀧です。
本日一般利用可能になった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
ファイルの末尾に以下を追記します。
/etc/sysctl.d/00-defaults.conf
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
4は、/etc/cgconfig.conf
ファイルの27〜29行目に以下を挿入し、無効になっているcgconfigサービスを有効化します。(ドキュメントにはcgroupsについての記載がなかったので、後で実行するgreengrassdのエラーメッセージから今回の対応方法を検証しました)
/etc/cgconfig.conf
:
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
/greengrass/configuration/config.json
{
"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の相互接続)はぜひ試してみたいですね。