35歳からの中二病エンジニア

社寺・鉄道・アニメを愛でるウェブ技術者の呟き

LambdaのNode更新でAmazon Linux 2と闘う

AWS Lambdaにおいて、Node.js 8.10のランタイムが2020年2月3日で廃止され更新できなくなるのは既報の通り

Lambdaのランタイムとしては長らくNode.js 8.10が最新の時代が続いていたので、今回の廃止で慌てている方も多いのではないだろうか。今回はその中でハマったあるケースについての話を紹介する。

Node.js 10.x以降はAmazon Linux 2

今回頭痛の種となるのは、LambdaのNode.jsランタイムは10.xからAmazon Linux 2になっているという点だ。

実際に起動してみるとわかるのだけれども、多くのパッケージのバージョンが上がっていて、そしてここが重要なのだけれども、結構なパッケージやコマンドが消えている。社で使用しているImageMagickは無いし、curlやfileのような普通にありそうなコマンドまで入っていない。普通にJSのコードを書くだけならば後方互換性をちょっと気にするだけで済む所が、外部コマンドを使用していたりすると途端に大変なことになるというのが今回の大問題だったりする。

強い味方、yumda

まさか自分でcurlをソースからビルドする日が来るなんて思ってもみなかった…。と戦慄しつつも、同じ苦しみを抱えている人は多いだろうと思い色々検索していたら、まさに求めていたものを発見した。

github.com

これ、僕達がやることは本当に簡単で、Dockerコマンドのワンライナーで yum install コマンドを叩くだけ。

docker run lambci/yumda:2 yum install -y curl

これだけで、指定したパッケージのLambda Layer用ZIPファイルが生成されるというスグレモノだ。

yumのリポジトリーは amzn2-coreamazon-linux-extras が対象で、それ以外についてはリクエストを受け付けているとのこと。amazon-linux-extras には epel も含まれているので、現状でもかなりのパッケージが網羅されているかと思う。

ちなみに仕組みも非常に明快で、実際にAmazon Linux 2のDockerコンテナーの中で yum install を行い、インストール結果をLayerのディレクトリー構造に最適化していることがわかる。

おわりに

既にLambda Layerを活用しているのであれば、ソースコードをビルドしてハマる手間が省けて非常に有用だろう。Layer自体初めてだと少し面食らうかもしれないけれども、よく使うものはいずれにせよLayerで共有するのが効率的なので、この機会に習得すると良いのではないだろうか。

シンプルな仕組みながら、GitHubのStarを100個くらい送りたいと思った。日本語での紹介は今の所見当たらないので、同じように苦しんでいる方々に届けば幸いだ。