エッジコンピューティングのさらなる進化!AWS IoT Greengrass2.0がリリースされました #reinvent
CX事業本部@大阪の岩田です。
現在開催中のre:Invent 2020にてAWS IoT Greengrass2.0が発表されました。
Greengrassとは?
まずGreengrassについてのおさらいです。GreengrassとはAWSの機能をローカルデバイスに拡張し、エッジコンピューティングを実現するためのソフトウェア及びAWSサービスです。ローカルのIoTデバイス上でGreengrass Coreというソフトウェアを稼働させてクラウドと連携させることで、デバイスにLambda関数をデプロイ&実行したり、機械学習モデルを動かして推論結果のデータをクラウドにアップしたり...といったことが可能です。Developers.IOでも色々とブログが公開されています。
https://dev.classmethod.jp/tags/aws-iot-greengrass/
これまでGreengrass Coreの最新バージョンは1.11.0だったのですが、今回の発表によって一気にバージョン2.0までメジャーアップデートされる運びとなりました。
これまでのGreengrassからどう変わるのか?
2.0にメジャーアップデートされたことで、これまでの1系からどのように変わるのでしょうか?前述のAWSからの発表では以下のような特徴が紹介されています。
- オープンソース
- エッジ側のランタイムはApache 2.0ライセンスで配布されます。オープンソースなので、GitHub上でソースを見ることもできますし、コントリビュートすることも可能です。
- モジュール化
- 多くの機能を有するGreengrassですが、2.0からはモジュール化が進み、自身のユースケースに必要なコンポーネントのみをデプロイできるようになりました。例えばですが、デバイス上でLambdaを動かしたいけど、機械学習モデルは不要。といったケースではLambdaのコンポーネントだけをデプロイすることが可能になりました。
- 開発生産性の向上
- 新たにGreengrass CLIというコンポーネントが追加されました。Greengrass CLIを利用することでテスト用デバイス上で高速にコードを開発&デバッグできるとのことです。
- より柔軟なデプロイ制御
- AWS IoTのモノのグループと統合されたデプロイが可能になり、ロールアウトレート、タイムアウト、ロールバックといった細かな制御が可能になりました。
このようにパワーアップしたGreengrass2.0ですが、なんと2021年12月31日までの期間限定で、1,000台までのデバイスを無料で利用可能です。※AWS IoTのようにGreengrassが利用するAWSサービスに関する課金は発生します。
やってみる
試しにGreengrass2.0をEC2にインストールしてみます。
今回は以下の環境を利用しました
- インスタンスタイプ t3.small
- OS:Amazon Linux2
- カーネル:4.14.203-156.332.amzn2
Javaのインストール
Greengrass2.0のインストールにはJavaを利用します。まずはJavaをインストールしましょう。
$ sudo yum install java $ java -version openjdk version "11.0.9.1" 2020-11-04 LTS OpenJDK Runtime Environment Corretto-11.0.9.12.1 (build 11.0.9.1+12-LTS) OpenJDK 64-Bit Server VM Corretto-11.0.9.12.1 (build 11.0.9.1+12-LTS, mixed mode)
EC2にIAMロールをアタッチ
後ほどインストーラを実行する際にIAMロールやAWS IoTのモノなどAWSリソースを作成するので、各種AWSリソースを作成できるようEC2にIAMロールをアタッチしつつ権限を設定します。今回は
- AWSGreengrassFullAccess
- AWSIoTFullAccess
- IAMFullAccess
の3つをアタッチしました
Greengrass用のロールを作成
続いてGreengrass用のロールを作成します。まず以下の内容でGreengrassV2TokenExchangeRoleAccess
という名前のIAMのポリシーを作成
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DescribeCertificate", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams", "iot:Connect", "iot:Publish", "iot:Subscribe", "iot:Receive", "s3:GetBucketLocation" ], "Resource": "*" } ] }
GreengrassV2TokenExchangeRole
という名前のIAMロールを作成し、先程作成したポリシーGreengrassV2TokenExchangeRoleAccess
を紐付けます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
後ほど実行するインストール処理でこのロールを指定します。
マネコンからセットアップ準備
マネコンからグループ/コアデバイスのセットアップ準備を行います。今回は
- コアデバイス:MyGreengrassCore20
- グループ:MyGreengrassCoreGroup20
としました
インストーラのダウンロードと実行
マネコンから準備ができたら、再度EC2上の作業に戻ります。まずインストーラをダウンロードして解凍
$ curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip $ unzip greengrass-nucleus-latest.zip -d GreengrassCore && rm greengrass-nucleus-latest.zip
インストーラを実行します
$ sudo -E java -Dlog.store=FILE \ -jar ./GreengrassCore/lib/Greengrass.jar \ --aws-region ap-northeast-1 \ --root /greengrass/v2 \ --thing-name MyGreengrassCore20 \ --thing-group-name MyGreengrassCoreGroup20 \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service true
指定しているオプションの意味は以下の通りです
- --aws-region
- リージョンを指定
- --root
- Greengrass Coreをインストールするルートディレクトリを指定
- --thing-name
- コアデバイスに設定するAWS IoTのモノの名前を指定
- --thing-group-name
- コアデバイスを紐付けるAWS IoTのモノのグループを指定
- --tes-role-name
- コアデバイスからAWSのクレデンシャル情報を取得するのに利用するIAMロール
- --tes-role-alias-name
- --tes-role-nameで指定したIAMロールのロールエイリアスを指定
- --component-default-user
- Greengrass Coreのコンポーネントを実行するのに利用するLinuxユーザー、グループを指定
- --provision
- IAMロール、AWS IoTのモノ、グループ、ロールエイリアスといったAWSリソースをプロジョニングするか
- --setup-system-service
- GreengrassCoreをサービスとしてインストールするか
こんな感じで出力されてインストール完了です。※IAMの権限周りで何度かやり直したのでいくつかの処理はスキップされています
Added ggc_user to ggc_group Provisioning AWS IoT resources for the device with IoT Thing Name: [MyGreengrassCore20]... Found IoT policy "GreengrassV2IoTThingPolicy", reusing it Creating keys and certificate... Attaching policy to certificate... Creating IoT Thing "MyGreengrassCore20"... Attaching certificate to IoT thing... Successfully provisioned AWS IoT resources for the device with IoT Thing Name: [MyGreengrassCore20]! Adding IoT Thing [MyGreengrassCore20] into Thing Group: [MyGreengrassCoreGroup20]... IoT Thing Group "MyGreengrassCoreGroup20" already existed, reusing it Successfully added Thing into Thing Group: [MyGreengrassCoreGroup20] Setting up resources for aws.greengrass.TokenExchangeService ... TES role alias "GreengrassCoreTokenExchangeRoleAlias" does not exist, creating new alias... IoT role policy "GreengrassTESCertificatePolicyGreengrassCoreTokenExchangeRoleAlias" for TES Role alias not exist, creating policy... Attaching TES role policy to IoT thing... IAM policy named "GreengrassV2TokenExchangeRoleAccess" already exists. Please attach it to the IAM role if not already Configuring Nucleus with provisioned resource details... Downloading Root CA from "https://www.amazontrust.com/repository/AmazonRootCA1.pem" Created device configuration Successfully configured Nucleus with provisioned resource details! Successfully set up Nucleus as a system service
インストールが完了したらマネコンから確認してみましょう
Greengrass CLIをデプロイしてみる
Greengrass Coreがインストールできたので、試しに何かデプロイします。今回はGreengrss CLIで試してみます。
まずはコンポーネントからGreengrass CLIを選択して「デプロイ」を選択
新しいデプロイを作成します
デプロイターゲットとして先程作成したコアデバイスが所属するモノのグループを選択
コンポーネントにGreengrass CLIを選択
設定はデフォルトのまま進めます
詳細設定はデフォルトのままで...
確認してデプロイ
しばらく待ってデプロイが完了したらEC2上でGreengrass CLIを叩いてみましょう
$ sudo /greengrass/v2/bin/greengrass-cli help Usage: greengrass-cli [-hV] [--ggcRootPath=<ggcRootPath>] [COMMAND] Greengrass command line interface --ggcRootPath=<ggcRootPath> The AWS IoT Greengrass V2 root directory. -h, --help Show this help message and exit. -V, --version Print version information and exit. Commands: help Show help information for a command. component Retrieve component information and stop or restart components. deployment Create local deployments and retrieve deployment status. logs Analyze Greengrass logs. get-debug-password Generate a password for use with the HTTP debug view component.
デプロイされていることが確認できました。
まとめ
まずはGreengrass2.0のインストールと簡単なデプロイを試してみました。Greengrass2.0ではカスタムコンポーネントの独自開発なども可能なようですので、このあたりの新機能にも今後挑戦していきたいと思います。