今から始めるLambda③「Layersを使う」
はじめに
前回の記事ではLambda
のローカルでの実行やAWS CLI
からのデプロイ方法について紹介しました。
その中でnode_modules
を絡めたコードをデプロイすることにも言及しました。
今回はそのあたりを掘り下げつつ、Lambda Layers
の扱い方を紹介していきたいと思います。
AWS Lambda Layers
とは
公式には以下のような説明があります。
Lambda レイヤーは、追加のコードやデータを含めることができる .zip ファイルアーカイブです。
要するにLambda
の関数本体とは別に用意することができるコード、データのことです。
どういう時に使うのか
主には異なるLambda
関数間で、同じ処理を使いたい場合に利用します。
例えば自作関数のfuncHoge
をLambda
関数であるlambdaFunc1
とlambdaFunc2
の両方で使いたい場合、funcHoge
をLambda Layers
にすることで共有することができます。
自作関数でなくとも、node_modules
の中のライブラリのように、Lambda
を横断して使いたいものがある場合はLayers
に含めます。
Layers
の作成
lambda-layer-sample
というディレクトリを作成し、Axios
を用いて郵便番号から住所検索を行うコードを作成します。
その際にnode_modules
やpackage.json
などを含めたコード群はnodejs
、自作のコードはlib
という階層を作ってまとめます。
mkdir lambda-layer-sample
cd lambda-layer-sample
mkdir nodejs
cd nodejs
nodejs
配下でaxios
をnpm install
します。
npm install axios
さらにaxios
を使って郵便番号検索を行うコードを作成します。
名前はgetAddressFromZipCode.js
とします。
注意点として、作成する階層はlib
以下とします。
const axios = require("axios");
module.exports = async (zipcode) => {
try {
return await axios(`https://api.zipaddress.net/?zipcode=${zipcode}`);
} catch (e) {
throw e;
}
};
ここまでできたらZIP
ファイルに固めます。
注意点としては、固めるのはnodejs
ディレクトリごとなので、lambda-layer-sample
配下で以下コマンドを実行します。
zip -r9 layer.zip .
これでlayer.zip
がlambda-layer-sample
直下に作成されました。
Layers
のデプロイ
早速デプロイしていきます。
デプロイはpublish-layer-version
で行います。
ランタイムやレイヤー名などをオプションで指定した上で実行します。
aws lambda publish-layer-version --layer-name sample-layer --description "create layer" --zip-file fileb://layer.zip --compatible-runtimes nodejs10.x nodejs12.x nodejs14.x
レスポンスとしてJSON
が返り、AWS
のLambda
のコンソールから【レイヤー】を選択すると、以下のように反映されていることが分かります。
Layers
をLambda
に紐づける
さっそくLayers
とLambda
の紐付けを行いたいと思います。
今回はtestFunction3
という名称でLambda
は作成済みとします。
中身は以下とします。
const getAddressFromZipCode = require("getAddressFromZipCode");
exports.handler = async function (event, context) {
const res = await getAddressFromZipCode(9071801);
console.log(res);
return context.logStreamName;
};
先ほど作成したgetAddressFromZipCode
をrequire
していますが、当然このLambda
単体では動作しません。
先のLayers
と紐づけて初めて動作するLambda
です。
Layers
のARNを確認
紐付けを行うにあたってLayers
のARNを確認する必要があります。
確認は以下コマンドで行います。
aws lambda list-layer-versions --layer-name sample-layer --query "LayerVersions[*].LayerVersionArn"
Layers
はpublish-layer-version
を行う度にバージョンが上がっていきますが、このコマンドで全てのバージョンのARNが確認できます。
紐付け
では紐付けを行いましょう。
紐付けはlambda update-function-configuration
で行います。
オプションで先のLayers
のARNの値などを付けます。
aws lambda update-function-configuration --function-name testFunction3 --layers "【LayersのARN】"
確認
AWS
のコンソールからtestFunction3
を実行してみましょう。
紐付け前はgetAddressFromZipCode
が見つからなくて動作しなかった関数が正常に動作するようになったかと思います。
/lib
なのか
補足:なぜLayers
を作成した際に、自作のスクリプトをnodejs/lib
の中に含めました。
実はそれには意味があり、AWS
におけるLambda
とLayers
の紐付け方が挙げられます。
実はLambda
と紐付けたLayers
は、すべて/opt
というディレクトリ配下に格納されています。
AWS
側で、この/opt
以下の特定のパスを環境変数として持っています(以下リンク参照)。
その中にnodejs/node_modules
があります。
ここへのパスが通っているため、Lamda
の関数からLayers
で使用しているモジュールが参照できます。
さらに注目すべきはlib
にもパスが通っている点です。
実運用的にはソース管理を行うかと思いますが、その際にnode_modules
はignore
されてしまうケースがほとんどです。
なので自作分のコードに関してはlib
に配置した上で使用しています。
まとめ
今回はLayers
とLambda
の関数の紐付けについて紹介しました。
API Gateway
やDB
のトリガーと絡めたり、一通りの処理をLambda
で作ると、依存するライブラリの数もそれなりに多くなります。
それらを包括的に管理する意味でもLayers
は非常に便利な機能なので、ぜひマスターしておきましょう。
今回の内容が役立てば幸いです。
Discussion