エッジコンピューティングのさらなる進化!AWS IoT Greengrass2.0がリリースされました #reinvent

Greengrassがガッツリアップデートされました
2020.12.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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ではカスタムコンポーネントの独自開発なども可能なようですので、このあたりの新機能にも今後挑戦していきたいと思います。