LoginSignup
8
4

More than 5 years have passed since last update.

Lambda Layersにnode.jsの自作関数を追加する

Posted at

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の中身は以下の通り

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');

で動くようにするために以下の手順を実施する。
1. hoge_functionディレクトリでnpm installを実施
2. nodejsディレクトリのpackage.jsonのdependenciesにhoge_functionを追記
3. nodejsディレクトリでnpm installを実施
4. デプロイ

これでrequire('hoge')で動くようになった

動くようにはなった、が・・・

結論から言うと自作のローカルモジュールをLayersに入れるのはあまり便利ではなさそうらしい。
ローカル環境で開発する際に結局そのモジュールがないと動かないから。
共通モジュールならローカルにも入ってるはずなのでパスを切り替えれば動くらしいので、
Layers自体が使えないってわけではないけどちょっと思惑とは違った結果になった。
(この辺は聞いた話なのであんまりわかってない)

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4