shou.com
JP / EN

AWS Lambdaのlayerをserverless frameworkでつくる(node.js)

Sat May 9, 2020
Sat May 9, 2020

node.jsでlambdaで開発に欠かせないのがnpm packageです。

しかし、このlambda全ての関数にnode_modulesがあって重い。そして、その結果、コンソールからlambdaのコードが見れない!

どうすればいいのだろうかと思ってググったら。AWS Lambda レイヤーという仕組みがあって、これを使えば、ライブラリをLayerとしてアップロードしておくことができ、ここのlambdaは、このアップロードされたLayerを使えるというもの。

Layerはコンソール上からも使えますが、実際の開発でコンソールを使うのはあまりないので、今回は、僕もよく使っているserverless frameworkの方法をメモっときます。

環境

  • macOS Catalina
    • 10.15.4
  • serverless framework
    • Framework Core: 1.67.3 (standalone)
    • Plugin: 3.6.6
    • SDK: 2.3.0
  • node.js
    • v12.15.0
  • 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が追加されています。

AWS Lambdaのlayerをserverless frameworkでつくる(node.js)

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

AWS Lambdaのlayerをserverless frameworkでつくる(node.js)

See Also