AWS Lambda Layersでnode_modulesを使う

Node.jsを使用していると必ずといっていいほどnpmコマンドでライブラリをダウンロードしてくると思います。

npmでダウンロードしたライブラリをLambda Layersへ登録しておけば、Lambda本体はかなり軽く作成することができます。

今回はAmazon Echoのask-sdkを例にLayersへ登録して使ってみます。

 

npmでダウンロード

ローカルPC上で"nodejs"フォルダを作ります。
最後に説明しますが"nodejs"という名前には意味があります。

npmでダウンロード

 

"nodejs"フォルダ内でnpmコマンドを実行します。

 

cd nodejs
npm install ask-sdk

 

 

 

"nodejs"をzipファイルへ圧縮します。
中身ではなく"nodejs"フォルダごと圧縮するのを注意してください。

 

 

Layersへ登録

 

AWS の管理コンソールからLambda>Layersを開いて"レイヤーの作成"ボタンを押します。

 

 

先ほど作成したzipファイルをアップロードします。

"互換性のあるランタイム"は"Node.js 8.10"を選択します。

 

zipファイルをアップロード

"作成"を押して押してLayerの作成は完了です。

 

Layerの作成

 

Lambda関数の作成

Lambda関数を作成します。

 

Lambda関数の作成

 

内容は何でも大丈夫ですので"Node.js 8.10"で作成します。

 

Lambda関数の作成  

関数ができたらLayerの追加をします。

 

Layerの追加

 

先ほど作成したレイヤーを選択します。

 

作成したレイヤーを選択

 

ask-sdk

 

あとはLambdaのソースを書くだけです。
ここではask-sdkが使えるかを確認したいだけなので簡単なコードにしておきます。

 

const Alexa = require('ask-sdk-core');

const LaunchRequestHandler = {
  canHandle(handlerInput) {
    return true;
  },
  handle(handlerInput) {
    return handlerInput.responseBuilder
      .speak('hello')
      .getResponse();
  }
};

exports.handler = Alexa.SkillBuilders.custom()
  .addRequestHandlers(LaunchRequestHandler)
  .lambda();

 

コードエントリタイプ

 

保存してテストしてみましょう。

 

ask-sdk  

ちゃんと"ask-sdk"を使用できていますね。

 

おわりに

 

感のいい人なら疑問に思うかもしれません。
Layerのzipファイルは"/opt"配下に展開されるので、
"/opt/nodejs/node_modules/xxxxx"のような構成になります。
なのに、なぜ"const Alexa = require('ask-sdk-core');"で参照できるのか。

 

実はいくつかのフォルダはLambdaが環境変数に読み込んでいるので、そのまま使えるのです。
詳細はAWS Lambda レイヤーのドキュメントを参照してください。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html

docs.aws.amazon.com

 

 

 

AWS相談会