Greengrass ユーザー必見!AWS IoT Greengrass の新しいインストール方法を試す
先日、久しぶりに AWS IoT Greengrass で コアアプリケーションをデバイスにインストールしたとき、新しいインストール方法がマネジメントコンソールに表示されていることに気付きました。
公式ドキュメントを確認しましたが、新しいインストール方法については特に紹介されていなかったので、本記事では試してみた内容をご紹介したいと思います。
これまでのインストール方法
これまでは、以下の 4 種類のインストール方法がありました。
- クイックインストール
- インストールに必要な AWS IoT や IAM リソースをインストーラが作成
- インストーラに AWS 認証情報を渡す必要がある
- 手動インストール
- 手動でデバイス証明書・秘密鍵や IAM リソースを作成
- インストーラに AWS 認証情報を渡す必要が無い
- フリートプロビジョニング
- デバイスが初めて AWS IoT に接続時にデバイス証明書と秘密鍵をデバイスに配信できる
- 主にデバイスの大量生産時などを想定
- カスタムプロビジョニング
- 複雑なプロビジョニングを実現する Java プラグインを自前で実装してインストールできる
大規模に利用する場合を除けば、一番良く使うのは「クイックインストール」になると思います。本記事では「クイックインストールを従来のインストール方法」として、新しい方法との比較を行っていきたいと思います。
新しいインストール方法は何が違う?
実際の手順は後ほど紹介しますが、一番気になるのは 「従来のインストール方法と何が違うのか?(何が嬉しいのか)」、「注意点は何か?」 という点です。
試した中で分かった点は次のとおりです。
- メリット: インストールに必要な IAM の認証情報をデバイスにセットする手間が無くなった
- 注意点: 自動で作られるリソースの一部をユーザーが制御できない
特に、IAM情報をデバイスにセットする手間が省略できる点が嬉しいポイントです。
これまでは、IAM User のアクセスキーか、一時的なクレデンシャルをデバイス環境にセットする必要があり、この作業が地味に面倒でした。
プロダクション利用を想定するならフリートプロビジョニングという方法がありますが、検証目的などで手軽に触ってみたいだけの場合、毎回この作業が億劫に感じていました。
インストールに必要な IAM 認証情報の扱いはどう変わったのか?
従来の方法では、デバイス上で実行される Greengrass Core のインストーラーが、自身に付与された権限を元に IAM Role や IoT Policy の作成などを行っていました。
しかし、新しいインストール方法ではデバイス(インストーラー)に IAM の認証情報が付与されません。 その代わりに Greengrass のマネジメントコンソール上から 必要な IAM Role や IoT Policy などを作成する形になりました。
新しいインストール方法の注意点
新しいインストール方法では、マネジメントコンソール上のボタンをクリックすることでコンソールの裏側で処理が走り、各種リソースが自動的に作られます。しかし、自動化されたことで一部のリソースの ARN が固定されることになりました。
ARN の固定について確認できた範囲では、Greengrass デバイスのコンポーネントが AWS サービスと連携するための IAM Role の ARN 形式は決まった内容で作成されました。
これにより、複数デバイスに対して同じ方法でインストール作業を行うと、それらが参照する AWS リソース(上記の IAM Role など)がデバイス間で共用されることになり、厳密な権限管理が難しくなります。
従来の方法では、インストーラーのオプションで指定することでリソースを分けて作成できるので、各デバイスに必要最小限の権限だけ付与できるので細かい権限管理が可能です。
このような背景から、新しいインストール方法は開発用途での利用が想定されたものである点に注意が必要です。
このようなデメリットがある一方で、新しいインストール方法ではマネジメントコンソール上で 「モノを作成」 ボタンをクリックするだけで Greengrass に必要な各種リソースを自動で作成できるので、従来の方法に比べると、わざわざ AWS の認証情報をデバイスに渡す必要がなくなり作業が楽になっています。
ここまでの説明を図にしてみました。従来のインストール方法では次のようなイメージになります。見るからにゴチャゴチャして複雑に見えます。
新しいインストール方法は、次のようなイメージになります。
先程よりはスッキリして分かりやすい印象です。(個人的な観測比です…)
新しいインストール方法を試してみる
最初に Greengrass のマネジメントコンソールから「コアデバイス」の画面を開きます。
「コアデバイスをセットアップ」→「開発用 1つの Core デバイスをセットアップ」 をクリックします。
「ステップ 1」 では Greengrass コアデバイスを AWS IoT に登録します。デフォルトでは「コアデバイス名」が次のように GreengrassQuickStartCore-[ランダム英数字]
という名前が自動でセットされます。
今回は分かりやすいように GreengrassQuickStartCore-test
としました。
また「ステップ 2」で指定するグループ名も新規に GreengrassQuickStartGroupTest
というグループを作成することにしました。
ここで指定した名前の「モノ」 及び「モノのグループ」が AWS IoT 上に作成されます。
「ステップ3」 の「Greengrass Core ソフトウェアランタイム」の選択は、「Nucleus Classic」 を選択します。今回の対象デバイスは Ubuntu(on EC2)でテストするので「Linux」を選択しています。
「デバイスのセットアップ方法」には 3 種類の選択肢がありますが、新しく増えた選択肢は 「インストーラのダウンロードでデバイスをセットアップ」 です。
次の 「ステップ3.1」 で Java をデバイスにインストールします。
今回はテスト目的なので、物理デバイスの代わりに「Ubuntu 24.04」を EC2 で用意しました。
$ uname -a
Linux ip-10-60-4-229 6.8.0-1021-aws #23-Ubuntu SMP Mon Dec 9 23:59:34 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.1 LTS
Release: 24.04
Codename: noble
この EC2 インスタンスに Java をインストールします。
$ sudo apt-get update
$ sudo apt install default-jdk
インストールできました。
$ java -version
openjdk version "21.0.5" 2024-10-15
OpenJDK Runtime Environment (build 21.0.5+11-Ubuntu-1ubuntu124.04)
OpenJDK 64-Bit Server VM (build 21.0.5+11-Ubuntu-1ubuntu124.04, mixed mode, sharing)
「ステップ3.2」 で、Greengrass デバイスを AWS IoT に「モノ」として登録します。
「モノを作成」 をクリックすると「ステップ 1」「ステップ 2」で指定した「モノ」と「グループ」が作成されます。
作成されたら「作成済み」と表示されます。
実際に AWS IoT の 「モノ」 の画面で確認すると、指定した内容(GreengrassQuickStartCore-test
)で「モノ」が作成されています。
さらに、証明書も自動で作成されており、この「モノ」にアタッチされています。
証明書には、IoT ポリシーも作成されており証明書にアタッチされています。
アタッチされている 2 つのポリシーの内、GreengrassV2TokenExchangeCoreDeviceRoleAliasPolicy
の内容は次のとおりです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:AssumeRoleWithCertificate",
"Resource": "arn:aws:iot:ap-northeast-1:[YOUR_AWS_ACCOUNT_ID]:rolealias/GreengrassV2TokenExchangeCoreDeviceRoleAlias"
}
]
}
もう一方の GreengrassV2IoTThingPolicy
のポリシー内容は次のとおりです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Receive",
"iot:Connect",
"greengrass:*"
],
"Resource": [
"*"
]
}
]
}
「ステップ 3.2」 で「モノを作成」すると、ロールエイリアスも作成されます。
該当のロールエイリアスの画面上で、エイリアスとなっている元の IAM Role のリソースも表示されています。
IAM Role のリンクになっている GreengrassV2CoreDeviceRole
をクリックすると IAM のコンソール画面が開き、対象の IAM Role を確認することができます。
Greengrass コアデバイスは以後、この IAM Role を使ってデバイス上のコンポーネントが AWS の各種リソースにアクセスするための IAM のクレデンシャルを取得できるようになります。
(この IAM Role の権限を変更しながらユースケースに応じて付与して運用します)
次の作業は 「接続キット」 と 「インストーラ」 のダウンロードです。
ボタンをクリックすると、zip ファイルがダウンロードできるので手元に保存しておきます。
接続キットは GreengrassQuickStartCore-test-connectionKit.zip
というファイルがダウンロードされます。中身は AWS IoT とデバイスが通信するためのデバイス認証用の証明書関連のファイルです。
.
├── AmazonRootCA1.pem
├── config.yaml
├── device.pem.crt
└── private.pem.key
config.yaml
の中身は次のような内容です。「ステップ 1」で指定した「コアデバイス名」が thingName
にセットされていますね。
ここでダウンロードされるファイルは、この画面でしか取得できないのでダウンロードする前にページを閉じたりしないように注意が必要です。
---
system:
certificateFilePath: "{{config_dir}}/device.pem.crt"
privateKeyPath: "{{config_dir}}/private.pem.key"
rootCaPath: "{{config_dir}}/AmazonRootCA1.pem"
thingName: "GreengrassQuickStartCore-test"
services:
{{nucleus_component}}:
componentType: "NUCLEUS"
configuration:
awsRegion: "ap-northeast-1"
iotRoleAlias: "GreengrassV2TokenExchangeCoreDeviceRoleAlias"
iotDataEndpoint: "xxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com"
iotCredEndpoint: "xxxxxxxxxx.credentials.iot.ap-northeast-1.amazonaws.com"
ダウンロードしたインストーラの中身は次のとおりです。
.
├── LICENSE
├── META-INF
│ ├── MANIFEST.MF
│ ├── SIGNER.RSA
│ └── SIGNER.SF
├── NOTICE
├── README.md
├── THIRD-PARTY-LICENSES
├── bin
│ ├── greengrass.exe
│ ├── greengrass.service.procd.template
│ ├── greengrass.service.template
│ ├── greengrass.xml.template
│ ├── loader
│ └── loader.cmd
├── conf
│ └── recipe.yaml
└── lib
└── Greengrass.jar
この 2 つの ZIP ファイルをデバイス側に転送します。
$ scp -i ~/.ssh/my.pem ./GreengrassQuickStartCore-test-connectionKit.zip ubuntu@x.x.x.x:/home/ubuntu/
$ scp -i ~/.ssh/my.pem ./greengrass-nucleus-latest.zip ubuntu@x.x.x.x:/home/ubuntu/
インストーラ(greengrass-nucleus-latest.zip
)は、デバイス側のカレントディレクトリ配下の ./GreengrassInstaller
ディレクトリに解凍します。
$ unzip greengrass-nucleus-latest.zip -d ./GreengrassInstaller`
接続キットは /greengrass/v2
に解凍する必要があるので、root 権限で作業を行います。
$ sudo mkdir -p /greengrass/v2
$ sudo unzip GreengrassQuickStartCore-test-connectionKit.zip -d /greengrass/v2
最後にインストール用のコマンドを実行します。実行するコマンドはマネジメントコンソールからコピペしておきます。
(実際には、/greengrass/v2
以下に対するアクセス権限が必要なので root ユーザーになるか sudo
で実行します。
$ sudo sed -i 's|{{config_dir}}|/greengrass/v2|g; s|{{nucleus_component}}|aws.greengrass.Nucleus|g' /greengrass/v2/config.yaml && sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE -jar ./GreengrassInstaller/lib/Greengrass.jar --init-config /greengrass/v2/config.yaml --component-default-user ggc_user:ggc_group --setup-system-service true
成功すれば次のようなメッセージが表示されます。
Creating user ggc_user
ggc_user created
Creating group ggc_group
ggc_group created
Added ggc_user to ggc_group
Successfully set up Nucleus as a system service
インストールが成功すれば、AWS コンソール上でコアデバイスを確認してみます。GreengrassQuickStartCore-test
という Greengrass コアデバイスが新たに確認できると思います。
動作検証:Greengrass コンポーネントをデプロイしてみる
Greengrass コアソフトウェアのインストールが成功したので、動作テストを行います。
今回は、事前に作成していたカスタムコンポーネント(com.example.MyTest
)をデプロイしてみます。
まずはこのままコンポーネントをデプロイしてみます。すると失敗しました。
理由は、デバイスが利用する IAM Role の権限不足で S3 にあるアーティファクトをダウンロードできなかったためです。(詳細はデバイス側のログから確認します。)
そのため、Greengrass コアデバイスが利用する IAM Role である GreengrassV2CoreDeviceRole
に該当の S3 バケットに対するアクセス許可を追加します。
この状態で再度デプロイしてみると、ステータスが「正常」になりデプロイできたことが分かります。
このコンポーネントは、「/tmp
に現在時刻 を 5 秒間隔でログを出力する」ので、次のようなログも確認できました。
# tail -F /tmp/Greengrass_GDKTest.log
Hello, GDK! Current time: 2025-02-04 09:19:34.299151.
Hello, GDK! Current time: 2025-02-04 09:19:39.300614.
Hello, GDK! Current time: 2025-02-04 09:19:44.300876.
Hello, GDK! Current time: 2025-02-04 09:19:49.301153.
Hello, GDK! Current time: 2025-02-04 09:19:54.301438.
最後に
これまで、Greengrass を新しい環境で試そうと思うと、IAM の認証情報をデバイスに渡すのが面倒で、Greengrass コアデバイスのセットアップだけで時間を取られてしまうのが煩わしく感じていました。
新しいインストール方法では、この作業がなくなったので少し楽になったと思います。
一方で、細やかなアクセス制御ができないデメリットもあるので、個人的には従来の方法をもう少し省力化する手順を考えて(従来の方法を)使っていこうかなと思います。
もちろん、初めて Greengrass を使う場合は、デバイスのセットアップを新しいインストール方法で簡単に済ませてしまった方が良いユーザー体験になると感じました。
以上です。