この記事は Nikkei Advent Calendar 2020 23日目の記事です。
青海珈琲
1杯100円のテイクアウト専門コーヒーショップが神保町にあり、オフィスで働いている時代には昼食のついでによく買いに行っていました。春から在宅勤務で、しばらくはコーヒーも家の近くのものを飲んでいましたが、いよいよあの酸味の少ない神保町のコーヒーが飲みたくなって、先日ついにその店の通販で豆の定期購入を始めました。椅子を買ったり、豆を買ったり、働く環境が変わるといろいろと対応が必要になるものです。
Lambdaにコンテナイメージがきた
環境が変わるといえば、今月からAWS Lambdaでコンテナイメージが動かせるようになりました。
そして自分は偶然にもLambdaで動かすnodeのアプリケーションを先月引き継いだばかりでした。これはまだ開発途中で、LambdaへのデプロイにはServerlessを採用しているようでしたが、途中から依存ライブラリにバイナリのパッケージが追加されており、開発用の端末でビルドしてデプロイしてもLambdaでは動かないという問題がありました。
Serverlessのままデプロイの仕組みを構築するよりも手っ取り早そうだったので、コンテナイメージに切り替えることにしました。AWSが提供しているDockerイメージを利用したDockerfileさえ用意すれば、そのまま持っていけるはずです。
import { S3Handler } from "aws-lambda";
import { foo } from "./bar";
export const handler: S3Handler = async (event, context) => {
//
}
FROM public.ecr.aws/lambda/nodejs:12
#
CMD["index.handler"]
Serverless webpackがバグを見えなくしていた
ところがこれでは動きませんでした。実際には何時間かの試行錯誤がありましたが、バグの原因だけ先にお伝えすると、nodeのプロジェクトなのにtsconfig.jsonからmoduleの指定が抜けていたのです。
これが大事。
{
"compilerOptions": {
+ "module": "commonjs",
ではなぜServerlessの頃は動いていたのかというと、webpackプラグインが導入されていたため、すべてのファイルがひとつにバンドルされビルド後のコードにはexportが存在しなかったのです。
切り分けが大事
気付いてしまえばなんだそんなことか、というバグでしたが、コンテナイメージのLambdaというリリースされたばかりの新しい機能を利用していたばかりに、Lambdaを疑ったりAWSのDockerイメージを疑ったりで問題解決までにいくらか遠回りをしました。
しかしこれに懲りることなく、これからも新しいものには手を出していきたいと思います。変化を恐れないエンジニアの皆様、一緒に働きましょう。