aws-cdk の aws-lambda-nodejs で puppeteer を動かす
2020/09/07 04:30:00 +00:00
- 作ったものはこれ
- fourside/meigaza
- 映画の情報をスクレイプして、 Slack や IFTTT 経由 でモバイル通知する Lambda Function
- aws-cdk で Lambda とその周辺の リソースを定義した
- fourside/meigaza
aws-cdk
- AWSのリソースをコードで表現できるフレームワーク
- TypeScript で書ける
- コード補完が効いてうれしい
- パーミッションなどデフォで設定されるので細々定義しなくてよい
- CloudFormation で yaml 書くのはつらかった…
- What is the AWS CDK? - AWS Cloud Development Kit (AWS CDK)
Getting started
とか読んだ
- aws-lambda-nodejs module が便利
- まだ experimental な状態で、さらに semver を採用してない
- Lambda のソースコードが TypeScript で書ける
- aws-lambda module だと、CDK 部分は ts、Lambda 本体は common js になって、eslint しにくかったりコンテキストスイッチが発生したりで体験がよくない(eslint はディレクトリ毎に設定ファイルを置いても vs code が認識してくれなかった)
- なので experimental でも使う…
puppeteer を動かす
- chrome-aws-lambda を Lambda Layer に含める
- cdk deploy 時に layer のアセットを作るには以下を参考にした
- AWS CDK を使って node_modules を AWS Lambda Layers にデプロイするサンプル | Developers.IO
- 簡単にいうと、
bin/{appName}.ts
がスタックを作る前に Layer のアセットとなる資材を作っておく
cdk deploy
,cdk synth
の度に Layer の元を作るのもコストが大きいので(具体的にはnpm install
)、もとになる package-lock.json のハッシュ値を比較して作る作らないを制御するようにした
aws-lambda-nodejs でローカルでビルドするときのコツ
- aws-lambda-nodejs - Local bundling
- parcel を install してると、バンドル時にそれを使ってくれる
- ただし Windows だと無視されるので WSL を使う
- そうでなければ Docker が使われる
- parcel を install してると、バンドル時にそれを使ってくれる
- Lambda を複数定義するときは、parcelのキャッシュディレクトリは分ける
- Layerに含める npm モジュールをバンドルしないようにする
externalModules
オプションに指定した npm は、parcel の targets のincludeNodeModules
オプションに追加される
misc
- cdk synth, cdk deploy 中は、package.json が汚れる
- Ctrl-Cなどで中断すると残ってしまう
- 具体的には parcel のビルドターゲット
includeNodeModules
には{npmName}: false
という形で設定される- parcelのドキュメントに記載されてない形なので、正しく動かないのではと思ってしまったけど、そんなことはなかった
- 現状、
externalModules
とnodeModules
どちらに指定しても結果は同じ
- WSLでWindows側のディレクトリを使ってビルドすると遅い
- WSL側のファイルシステムを使う
- vs code は wsl extension を使う