全国に散らばったラズパイの為に、Node.jsのバージョンを上げるGreengrassコンポーネントを作りました
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秒のタイムアウトにインストールが間に合わないことがあったので、タイムアウト時間を伸ばしています
レシピの書き方は公式ドキュメントをご参照ください
デプロイする
Greengrassで、上記レシピで作成したコンポーネントをデプロイすればOKですので、デプロイの仕方自体はここでは説明しません
1つ注意点として、インストール処理ですので管理権限を持つユーザーでこのコンポーネントを実行する必要があります
デプロイ時にコンポーネントの詳細設定で、ユーザーとグループを指定してください
結果
デプロイ後、1〜2分後に確認したらインストール出来ていました
# nodejs14.x -v
v14.20.0
ここには貼りませんが、ちゃんとログも出てました
やろうと思ってから、調査含めて2時間くらいで出来てしまいました
コンポーネント作るの意外と簡単でした
補足
「なんでNode14なの?またスグに切れるよね?16とか18に上げれば?」と思われる方も多いと思いますが、GreengrassのLambdaが未だに14までしか対応してないんですよね。。。
独り言
こんなに簡単に独自のコンポーネントを作れるなら、
もしかしてLambdaを使う必要はないのでは?
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion