re:Invent 2018で発表されたAWSのLambda Layersを触ってみたので備忘録兼ねての投稿です。
まだLayers + node.jsの話が詳しくまとまってるところがあんまりなかったのでちょっとでも参考になれば幸いです。(pythonはちょいちょいあった)
なお、筆者は普段Androidエンジニアで実際のところ門外漢なので、用語とか理解とか間違ってたらマサカリ投げてください。
泣きながら直します。
Lambda Layersとは
ざっくりいうと共通のモジュールをまとめといて複数のLambdaで使い回せるよって機能。
Layers + node.jsのディレクトリ構成
こんな感じ
hoge-layer
├── layer
│ └── nodejs
│ ├── node_modules
│ │ └── (入れたいモジュールたち)
│ ├── package.json
├── serverless.yml
serverless.ymlの中身は以下の通り
service: hoge-layer
frameworkVersion: ">=1.34.0"
provider:
name: aws
runtime: nodejs8.10
layers:
hogeLayer:
path: layer
compatibleRuntimes:
- nodejs8.10
注意点としてはserverlessのバージョンを1.34.0以上にしないとLayers対応してないので、
古いバージョンを使ってる人は更新しよう。
ローカルモジュールを追加したい
上記で既存のモジュール(momentとか)は入れられたので自作の関数を入れてみようと構成を以下のように変更した。
hoge-layer
├── layer
│ └── nodejs
│ ├── node_modules
│ │ └── (入れたいモジュールたち)
│ ├── package.json
│ └── hoge_function <- 追加
│ └── hoge.js
└── serverless.yml
ただし、これだとLambda側でrequireするときに
const hoge = require('/opt/nodejs/hoge_function/hoge');
みたいな書き方をすると動くには動くけど開発環境だと実行できないとのこと。
そこで
const hoge = require('hoge');
で動くようにするために以下の手順を実施する。
- hoge_functionディレクトリでnpm installを実施
- nodejsディレクトリのpackage.jsonのdependenciesにhoge_functionを追記
- nodejsディレクトリでnpm installを実施
- デプロイ
これでrequire('hoge')で動くようになった
動くようにはなった、が・・・
結論から言うと自作のローカルモジュールをLayersに入れるのはあまり便利ではなさそうらしい。
ローカル環境で開発する際に結局そのモジュールがないと動かないから。
共通モジュールならローカルにも入ってるはずなのでパスを切り替えれば動くらしいので、
Layers自体が使えないってわけではないけどちょっと思惑とは違った結果になった。
(この辺は聞いた話なのであんまりわかってない)