node.js
でlambdaで開発に欠かせないのがnpm package
です。
しかし、このlambda全ての関数にnode_modules
があって重い。そして、その結果、コンソールからlambdaのコードが見れない!
どうすればいいのだろうかと思ってググったら。AWS Lambda レイヤーという仕組みがあって、これを使えば、ライブラリをLayerとしてアップロードしておくことができ、ここのlambdaは、このアップロードされたLayerを使えるというもの。
Layerはコンソール上からも使えますが、実際の開発でコンソールを使うのはあまりないので、今回は、僕もよく使っているserverless frameworkの方法をメモっときます。
node.jsなのでaws-nodejsテンプレートを使います。
% sls create --template aws-nodejs --path sls-layer
ディレクトリ直下にlayerフォルダを作ります。構成はこんな感じ。
├── handler.js
├── my-layer ← layerを格納するディレクトリ
│ └── nodejs
│
└── serverless.yml
nodejs
フォルダに移動します。npmパッケージをインストールします。ここでは、試しにhello-world-npmを使います。
nodejs% npm init -y
nodejs% npm i hello-world-npm
ここまで終わったらフォルダ構成は以下のようになっていると思います。
├── handler.js
├── my-layer ← layerを格納するディレクトリ
│ └── nodejs
│ └── node_modules
│ └── package-lock.json
│ └── package.json
│
│
└── serverless.yml
service: sls-layer
provider:
name: aws
runtime: nodejs12.x
functions:
hello:
handler: handler.hello
layers:
- {Ref: MylayerLambdaLayer}
layers:
mylayer:
path: my-layer
設定は割と簡単ですね。組み込み関数Refを使って、指定したパラメータまたはリソースを返すだけ。
あとは、lambdaでhello-world-npmを読んであげればいいだけ。
'use strict';
const helloWorld = require('hello-world-npm')
module.exports.hello = async event => {
return {
statusCode: 200,
body: JSON.stringify(
{
message: helloWorld(),
input: event,
},
null,
2
),
};
};
これで終わりです。試しにちゃんと動くはチェック。問題なく動いてます。
% sls invoke -f hello
{
"statusCode": 200,
"body": "{\n \"message\": \"Hello World NPM\",\n \"input\": {}\n}"
}
ついでにAWS コンソール側も確認しておきます。
ちゃんとlayersが追加されています。
関数コード側もnode_modules
やpackage.json
やらがなくなって、スッキリしました。