4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

AWS IoT Greengrass 2.0が出たので早速試してみた

re:InventでGreengassのバージョンアップが発表されました〜!!!

AWS IoT Greengrass 2.0 を発表 — オープンソースエッジランタイムと新しい開発者向け機能

ちょっと試してみたのですが、1.0とは別物です(笑)

環境

ハード:Raspberry Pi 4
OS:Raspberry Pi OS(32bit)

OSは新規インストール、SSH接続ができる状態でスタートしました。

インストール

Cgroupsを有効化

いつものcgroup_enable=memory cgroup_memory=1を末尾に足します。
※いつもの過ぎて公式ドキュメントに載ってなさそう

/boot/cmdline.txt
- console=serial0,115200 console=tty1 root=PARTUUID=a1849cf9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
+ console=serial0,115200 console=tty1 root=PARTUUID=a1849cf9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1

Javaのインストール

Greengrass 2.0はなんとJavaでできております。Open JDKをインストールします。

RaspberryPi4
sudo apt install openjdk-8-jdk

AWS認証情報の取得

Greengrassの動作にはAWS CLIやAWSの認証情報は不要ですが、インストール作業には必要です。
(インストール時にモノの登録とかIAMロール、ポリシーの作成を行うからです)

インストール時だけ必要な認証情報なので、最近提供されたばかりの AWS CloudShellを使ってみます

  • IAMロール、ポリシーの作成
CloudShell
ACCOUNT_ID=`aws sts get-caller-identity | jq -r '.Account'`

cat << EOF > GreengrassV2InstallAssumeRolePolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${ACCOUNT_ID}:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
EOF

cat << EOF > GreengrassV2InstallPolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "greengrass:CreateDeployment",
        "iot:AddThingToThingGroup",
        "iot:AttachPolicy",
        "iot:AttachThingPrincipal",
        "iot:CreateJob",
        "iot:CreateKeysAndCertificate",
        "iot:CreatePolicy",
        "iot:CreateRoleAlias",
        "iot:CreateThing",
        "iot:CreateThingGroup",
        "iot:DescribeEndpoint",
        "iot:DescribeRoleAlias",
        "iot:DescribeThingGroup",
        "iot:GetPolicy",
        "iam:GetRole",
        "iam:GetPolicy",
        "iam:CreateRole",
        "iam:PassRole",
        "iam:CreatePolicy",
        "iam:AttachRolePolicy"
      ],
      "Resource": "*"
    }
  ]
}
EOF

aws iam create-policy --policy-name GreengrassV2InstallPolicy --policy-document file://GreengrassV2InstallPolicy.json
aws iam create-role --role-name GreengrassV2InstallRole --assume-role-policy-document file://GreengrassV2InstallAssumeRolePolicy.json
aws iam attach-role-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/GreengrassV2InstallPolicy --role-name GreengrassV2InstallRole

  • 認証情報の生成
CloudShell
aws sts assume-role --role-arn arn:aws:iam::${ACCOUNT_ID}:role/GreengrassV2InstallRole --role-session-name session1

こんな感じで出力されます

{
    "Credentials": {
        "AccessKeyId": "XXXXXXXXXX",
        "SecretAccessKey": "XXXXXXXXXX",
        "SessionToken": "XXXXXXXXXX",
        "Expiration": "XXXX-XX-XXTXX:XX:XX+XX:XX"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "XXXXXXXXXX",
        "Arn": "XXXXXXXXXX"
    }
}

インストール

  • Greengrassモジュールのダウンロードと展開
RaspberryPi4
cd ~
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
unzip greengrass-nucleus-latest.zip -d GreengrassCore
  • 認証情報の設定

先程取得した認証情報を環境変数にセットします。

RaspberryPi4
export AWS_ACCESS_KEY_ID=XXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXX
export AWS_SESSION_TOKEN=XXXXXXXXXX
  • インストール
RaspberryPi4
sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
    -jar ./GreengrassCore/lib/Greengrass.jar \
    --aws-region ap-northeast-1 \
    --thing-name GreengrassCore-1767ad88a82 \
    --thing-group-name GreengrassGroup \
    --component-default-user ggc_user:ggc_group \
    --provision true \
    --setup-system-service true \
    --deploy-dev-tools true

かんたん!!!
サービス登録もされており、起動もしてます。

RaspberryPi4
sudo systemctl status greengrass
● greengrass.service - Greengrass Core
   Loaded: loaded (/etc/systemd/system/greengrass.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-12-19 13:21:07 GMT; 4s ago
 Main PID: 9148 (sh)
    Tasks: 12 (limit: 4915)
   Memory: 33.4M
   CGroup: /system.slice/greengrass.service
           ├─9148 /bin/sh /greengrass/v2/alts/current/distro/bin/loader
           └─9152 java -Dlog.store=FILE -Droot=/greengrass/v2 -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar --setup-syst

Dec 19 13:21:07 raspberrypi systemd[1]: Started Greengrass Core.
Dec 19 13:21:07 raspberrypi sh[9148]: Greengrass root: /greengrass/v2
Dec 19 13:21:07 raspberrypi sh[9148]: JVM options:  -Droot=/greengrass/v2
Dec 19 13:21:07 raspberrypi sh[9148]: Nucleus options: --setup-system-service false
Dec 19 13:21:11 raspberrypi sh[9148]: Added ggc_user to ggc_group

使ってみた

Greengrass 2.0は、「レシピでコンポーネントを作ってデプロイする」という考え方になっているようです。

image.png

Greengrass 1.0は「Lambdaをエッジで」という感じでしたが、Greengrass 2.0はLambdaにとらわれず、「クラウドから任意のプログラムをデプロイできる仕組み」にバージョンアップしたイメージです。
サンプルがこんな感じなので、その気になれば何でもOK的な感じですよね。もちろんLambdaもデプロイできます。

image.png

Lambdaをデプロイしてみた

超簡単なLambdaをデプロイしてみました。

lambda_function.py
import json

def lambda_handler(event, context):
    # TODO implement
    print (json.dumps(event))
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

print (json.dumps('start lambda'))

コンポーネントの作成

イベントソースを設定したり、タイムアウト、ロングライブ設定など、表現は変わってますが、旧バージョンと大体同じことができそうです。

image.png

ボリュームやデバイスの設定も、Lambdaに対して行うので、旧バージョンよりわかりやすい感じになりました。

image.png

デプロイ

まずはデプロイ対象を指定します。モノのグループを選ぶと、グループに追加になったコアに対しても自動で適用されるようです。

image.png

次に、デプロイするコンポーネントを選択します。自分で作ったコンポーネントの他に、AWSが提供するコンポーネントも沢山あります。もともとコネクタで提供されていた機能もここに統合されているような気がします。

image.png

コンポーネントごとの個別設定を行います。

image.png

これがNucleus(Greengrassコアのことと思います)の個別設定です。MQTTの接続ポートを替えたりできそうです。jvmOptionsまで変えれます。

image.png

最後にデプロイの設定です。タイムアウトや失敗時のロールバック設定ができます。

image.png

これでデプロイが実行されます。

動作確認

マネジメントコンソールのテストで、hello/worldトピックにメッセージを投げて、ログが出力されることを確認。

RaspberryPi(piユーザーでは権限がなくログが見れないのでrootで確認)
root@raspberrypi:~# tail /greengrass/v2/logs/gg_sample.log -n 1
2020-12-19T13:53:36.759Z [INFO] (pool-2-thread-22) gg_sample: lambda_function.py:5,{"message": "Hello from AWS IoT console"}. {serviceInstance=0, serviceName=gg_sample, currentState=RUNNING}
root@raspberrypi:~# 

Lambda間の通信や、IoT CoreへのPublishはこちらの方法を使うようです。勉強中です

Interprocess communication
https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
4
Help us understand the problem. What are the problem?