node.js
でlambdaで開発に欠かせないのがnpm package
です。
しかし、このlambda全ての関数にnode_modules
があって重い。そして、その結果、コンソールからlambdaのコードが見れない!
どうすればいいのだろうかと思ってググったら。AWS Lambda レイヤーという仕組みがあって、これを使えば、ライブラリをLayerとしてアップロードしておくことができ、ここのlambdaは、このアップロードされたLayerを使えるというもの。
Layerはコンソール上からも使えますが、実際の開発でコンソールを使うのはあまりないので、今回は、僕もよく使っているserverless frameworkの方法をメモっときます。
環境
- macOS Catalina
- serverless framework
- Framework Core: 1.67.3 (standalone)
- Plugin: 3.6.6
- SDK: 2.3.0
- node.js
- aws
- aws-cli/1.18.0 Python/3.7.3 Darwin/19.4.0 botocore/1.15.0
serverless frameworkを使ってサービスの作成
node.jsなのでaws-nodejsテンプレートを使います。
1
|
% sls create --template aws-nodejs --path sls-layer
|
npm パッケージをインストール
ディレクトリ直下にlayerフォルダを作ります。構成はこんな感じ。
1
2
3
4
5
|
├── handler.js
├── my-layer ← layerを格納するディレクトリ
│ └── nodejs
│
└── serverless.yml
|
nodejs
フォルダに移動します。npmパッケージをインストールします。ここでは、試しにhello-world-npmを使います。
1
2
|
nodejs% npm init -y
nodejs% npm i hello-world-npm
|
ここまで終わったらフォルダ構成は以下のようになっていると思います。
1
2
3
4
5
6
7
8
9
|
├── handler.js
├── my-layer ← layerを格納するディレクトリ
│ └── nodejs
│ └── node_modules
│ └── package-lock.json
│ └── package.json
│
│
└── serverless.yml
|
serverless.ymlの設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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を読んであげればいいだけ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
'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
),
};
};
|
これで終わりです。試しにちゃんと動くはチェック。問題なく動いてます。
1
2
3
4
5
|
% sls invoke -f hello
{
"statusCode": 200,
"body": "{\n \"message\": \"Hello World NPM\",\n \"input\": {}\n}"
}
|
ついでにAWS コンソール側も確認しておきます。
ちゃんとlayersが追加されています。

関数コード側もnode_modules
やpackage.json
やらがなくなって、スッキリしました。

See Also