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

Sat May 9, 2020 - serverless
Mon May 11, 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が追加されています。

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

Tags: lambda