🥗

全国に散らばったラズパイの為に、Node.jsのバージョンを上げるGreengrassコンポーネントを作りました

2022/09/01に公開

AWS IoT GreenGrassを使って、ラズパイ上のNode.jsのバージョンを上げました

経緯

Node.js12のサポートが2022年4月30日で切れました
そして、2022年8月17日にAWSから下記のようなメールが届きました

[要対応] AWS Lambda における Node.js 12 のサポート終了

2022 年 11 月 14 日以降、Lambda は Lambda 関数で使用される Node.js 12 ランタイムにセキュリティパッチやその他アップデートを適用しなくなり、Node.js 12 を使用する関数は、テクニカルサポートの対象外となります。さらに、Node.js 12 ランタイムを使用する新しい Lambda 関数を作成できなくなります。2022 年 12 月 14 日以降、Node.js 12 ランタイムを使用している既存の関数のアップデートはできなくなります。

ということで、早急にAWS Lambdaで使われているNode.jsのバージョンを上げねばなりません

しかし、これには問題がありました

全国に散らばっているRaspberryPi上のGreengrassで動いているAWS Lambdaが存在するのです
それら全てのRaspberryPiのNode.jsのバージョンを上げねばなりません

コレを理由に出張と言う名の全国旅行をしよう!!

というわけにもいかないので、遠隔でできるだけ楽にアップデートすることを考えました

Node.jsをアップデートするためのGreengrassコンポーネントを作る

Greengrass上で動くアプリはコンポーネント化されています
AWSが用意しているものを使ったり、Lambda関数をコンポーネント化して使うことが多いです
一方で、このコンポーネントは自作することも出来ます
つまりNode.jsをバージョンアップするコンポーネントを自作すればよいということです

コンポーネントを作る

AWSのコンソールから作れます
わたしはjsonスキルが低いのでYAMLで書きました

  • AWS IoT Greengrass -> コンポーネント -> コンポーネントを作成 -> YAML

  • レシピ

---
RecipeFormatVersion: '2020-01-25'
ComponentName: shell.update.node.ibaraki # コンポーネントの名前
ComponentVersion: 1.0.0 # バージョン
ComponentDescription: node update shell # 適当な説明
ComponentPublisher: ibaraki # 作った人
ComponentType: aws.greengrass.generic
Manifests:
- Name: Linux
  Platform:
    os: linux
  Lifecycle:
    Bootstrap:
      Script: |
        curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
        sudo apt-get install -y nodejs
        sudo cp -f /usr/bin/node /usr/bin/nodejs14.x
      Timeout: 600

Bootstrapを指定してコマンドを書くと、コンポーネントのインストール時(または更新時)に1回だけ動き処理完了後にGreengrassを再起動させます
ソフトウェア起動前に実行されるInstallとの使い分けに気をつけましょう
また、デフォルト120秒のタイムアウトにインストールが間に合わないことがあったので、タイムアウト時間を伸ばしています

レシピの書き方は公式ドキュメントをご参照ください
https://docs.aws.amazon.com/ja_jp/greengrass/v2/developerguide/component-recipe-reference.html#install-lifecycle-definition

デプロイする

Greengrassで、上記レシピで作成したコンポーネントをデプロイすればOKですので、デプロイの仕方自体はここでは説明しません

1つ注意点として、インストール処理ですので管理権限を持つユーザーでこのコンポーネントを実行する必要があります
デプロイ時にコンポーネントの詳細設定で、ユーザーとグループを指定してください

結果

デプロイ後、1〜2分後に確認したらインストール出来ていました

# nodejs14.x -v
v14.20.0

ここには貼りませんが、ちゃんとログも出てました

やろうと思ってから、調査含めて2時間くらいで出来てしまいました
コンポーネント作るの意外と簡単でした

補足

「なんでNode14なの?またスグに切れるよね?16とか18に上げれば?」と思われる方も多いと思いますが、GreengrassのLambdaが未だに14までしか対応してないんですよね。。。
https://docs.aws.amazon.com/ja_jp/greengrass/v2/developerguide/run-lambda-functions.html

独り言

こんなに簡単に独自のコンポーネントを作れるなら、
もしかしてLambdaを使う必要はないのでは?

NCDCエンジニアブログ

Discussion