🥬

ラズパイにAWS Greengrassをインストールする作業を、なるべく自動化した

2022/09/07に公開

ラズパイにAWS Greengrassをインストールする時に、ラズパイ側からインストールコマンドを実行する必要があります。
インストール用のシェルスクリプトを程度の効率化はしていたのですが、スクリプトを実行することすら面倒くさいので、systemdのserviceを使った自動化を進めてみました。

方針

/boot/に設定ファイルが置かれていれば、起動時に読み込んで自動でGreengrassをインストールする。仕組みを作る
(ラズパイの初期設定時に、Wi-Fi接続の設定をwpa_supplicant.confを/boot/に置くだけで後は自動でやってくれる処理を参考にしました)

(※)/boot/はPCにSDカードを差した時に中身を操作できるので、ここにファイルを置く操作は比較的ラク

  • セットアップ時の手順

AWS Greengrassのインストール手順のおさらい

自動化する前に、ラズパイにGreengrassをインストールする方法を改めて確認しましょう。
これは、AWSコンソールからデバイスを追加しようとすると教えてくれます。
https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/greengrass/v2/cores/create

  • 1.デバイス名(モノの名前)を決める
  • 2.デバイスが所属するグループ名をを決める
  • 3.Greengrassのインストール
    • 3.1.Javaのインストール
    • 3.2.AWS認証情報を設定
    • 3.3.インストーラを実行する
      • 3.3.1.ダウンロードする
      • 3.3.2.実行する

事前に固定しておけるものと、インストール毎に設定するものを決める

  • 1のデバイス名は、当然デバイス毎に違うので毎回指定させる必要があります
  • 2のグループ名は、システムによっては固定できるかもしれませんが、1とセットで毎回指定するのが無難でしょう
  • 3.1のJavaは事前にインストールしておけば良いです
  • 3.2はセキュリティ情報なのでsdに入れておくのは危険です。毎回設定しましょう。
  • 3.3.1は事前にSDカードに入れておいてもよいですが、できれば最新版が望ましいので都度最新版でやりたいです。
    • ただし、都度ラズパイからダウンロードするのは通信量が増えてイマイチ嬉しくないです。
  • 3.3.2は1のデバイス名と2のグループ名を引数で指定してあげる必要があるのでデバイス毎に実行が必要です

ということを踏まえると、、、

インストール毎にラズパイに渡す必要が必要なもの

これらは、デバイス毎に外部から投入します。

  • 設定ファイル
    • モノの名前
    • モノのグループ名
    • AWS認証情報
  • 最新のインストーラー本体

自動インストール処理の内容

こちらは、シェルスクリプトを書いて事前にラズパイに配置しておきます。

  1. 設定ファイルを読み取る
  2. インストールする
  3. AWS認証情報を消す
  4. サービスを自壊させる

4は稼働中のデバイスに対して、再度インストールをしないための処理です。
要件次第では、なくても良いかもしれません。

自動インストールを起動する仕組み

systemdを使って、下記処理を実施するサービスを作ります。

  1. ラズパイ起動時に、sdカードの/boot/直下に必要な設定ファイルとインストーラーがあるかチェックする
  2. 必要なファイルがあるときのみ、インストール処理を動かしてGreengrassをインストールする

自動セットアップサービスを作る

事前にラズパイに設定

以下の設定をした状態のSDカードのイメージを作っておく。

Javaをインストール

やり方は省略。Greengrassのドキュメントを参照してください。

自動インストール用のシェルスクリプトを書く

ラズパイ内の/greengrass_setup/に置くことにします。

/greengrass_setup/greengrass_setup.sh
#!/bin/bash

# Path
cd `dirname $0`

# Read Env
source greengrass_setup.env

# set AWS keys
export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
export AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN

# install greengrass
unzip ./greengrass-nucleus-latest.zip -d ./GreengrassCore
sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE -jar ./GreengrassCore/lib/Greengrass.jar --aws-region ap-northeast-1 --thing-name ${THING_NAME} --thing-group-name ${GROUP_NAME} --component-default-user ggc_user:ggc_group --provision true --setup-system-service true
rm -rf ./GreengrassCore

# delete AWS keys
rm -f ./greengrass_setup.env
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_SESSION_TOKEN=

# disable service
systemctl disable greengrass_setup.service

自動インストールを実行するsystemdのサービスを作る

サービスを定義する

/lib/systemd/system/にサービスの定義ファイル(greengrass_setup.service)を置きます

/lib/systemd/system/greengrass_setup.service
[Unit]
Description=Greengrass Setup
ConditionPathExists=/boot/greengrass_setup.env
ConditionPathExists=/boot/greengrass-nucleus-latest.zip
ConditionPathExists=/greengrass_setup/greengrass_setup.sh
After=syslog.target network.target local-fs.target nss-lookup.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mv -f /boot/greengrass_setup.env /greengrass_setup/greengrass_setup.env
ExecStartPost=/bin/mv -f /boot/greengrass-nucleus-latest.zip /greengrass_setup/greengrass-nucleus-latest.zip
ExecStartPost=/bin/bash /greengrass_setup/greengrass_setup.sh

[Install]
WantedBy=multi-user.target

サービスを有効化する

systemctl enable greengrass_setup

外部から渡す設定ファイルを用意する

こちらはPCで作成して、個別にSDカードのboot直下に入れる

設定ファイル(greengrass_setup.env)

必要な情報を装置毎に設定する

greengrass_setup.env
## GreenGrassのGroup Name
GROUP_NAME=SampleGroup
## GreenGrassのThing Name
THING_NAME=SampleThing

# AWSのアクセスキー
AWS_ACCESS_KEY_ID=(アクセスキー)
AWS_SECRET_ACCESS_KEY=(シークレットアクセスキー)
AWS_SESSION_TOKEN=(セッショントークン)

インストーラー(greengrass-nucleus-latest.zip)

ここからダウンロード : https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip

ラズパイセットアップ時にやること

  • 事前に作ったイメージファイルをSDカードに書き込む
  • PCから設定ファイルとインストーラーをSDカードに置く
  • ラズパイにSDカードを差して起動すると自動でAWS Greengrassがインストールされる

セットアップが、とても簡単になりました。

課題

今回、エラー処理を全然していません。
一方で最後に自らを起動するサービスを無効化しているので、エラーが発生しても自動設定の処理が動かなります。その場合は手動でインストールするか、手動でサービスを有効化する必要があります。
エラー処理を頑張っていれば、もっと使い勝手が良くなるはずです。

どなたか改善版作ったら、ください!!

NCDCエンジニアブログ

Discussion