Node.jsを使用していると必ずといっていいほどnpmコマンドでライブラリをダウンロードしてくると思います。
npmでダウンロードしたライブラリをLambda Layersへ登録しておけば、Lambda本体はかなり軽く作成することができます。
今回はAmazon Echoのask-sdkを例にLayersへ登録して使ってみます。
npmでダウンロード
ローカルPC上で"nodejs"フォルダを作ります。 最後に説明しますが"nodejs"という名前には意味があります。
"nodejs"フォルダ内でnpmコマンドを実行します。
cd nodejs npm install ask-sdk
"nodejs"をzipファイルへ圧縮します。 中身ではなく"nodejs"フォルダごと圧縮するのを注意してください。
Layersへ登録
AWS の管理コンソールからLambda>Layersを開いて"レイヤーの作成"ボタンを押します。
先ほど作成したzipファイルをアップロードします。
"互換性のあるランタイム"は"Node.js 8.10"を選択します。
"作成"を押して押してLayerの作成は完了です。
Lambda関数の作成
Lambda関数を作成します。
内容は何でも大丈夫ですので"Node.js 8.10"で作成します。
関数ができたらLayerの追加をします。
先ほど作成したレイヤーを選択します。
あとは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"を使用できていますね。
おわりに
感のいい人なら疑問に思うかもしれません。 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