概要
2018年の11月末に、AWS Lambdaに新しい機能 Lambda Layers
が追加されましたが、
SAMで使うにはどうすればいいのということで、その方法を書いていきます。
SAM内にLayersを定義することの利点ですが、
LayersをSAMで管理することによって、他のLambda関数と同時にAWSにデプロイすることができるようになります。
また、ローカルでのSAMのテスト等で、開発中のLayerを使用することができるようになります。
ファイル構成・記述内容
##ファイル構成
構成はこのようにします。
XXXXXX(任意のフォルダ名)
├ template.yaml → SAMテンプレート
├ regist_record → Lambda関数用フォルダ
│ └ app.py → Lambda関数用のPythonソース
└ layer → レイヤー格納用フォルダ
└ python → Python言語のレイヤーであることを示すフォルダ(名前は必ずpythonにすること)
├ XXXX_util.py → python用の共通処理
└ XXXX_settings.py → 同上
記述内容
SAM Template
SAMテンプレートは以下のように記述します。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
A serverless application of XXXXXXX
Resources:
RegistRecord:
Type: AWS::Serverless::Function
Properties:
CodeUri: regist_record/
Handler: app.lambda_handler
Runtime: python3.7
FunctionName: regist-record
Role: arn:aws:iam::(アカウント名):role/(ロール名)
Environment:
Variables:
ENV: dev
XXXXXX_TABLE_NAME: xxxx_record_t
XXXXX_URL: https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/YYYYYYYYYY
Events:
(省略)
Layers:
- !Ref CommonLayer
CommonLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: XXXX_common-layer
Description: Common Application Resource Layer
ContentUri: layer
続いて解説です。
RegistRecord
の中に、Layers
という項目がありますが、そこにLayerの情報を定義することによってLambdaFunctionからLayerを参照させることが可能になります。
!Ref
の値はLayerのリソース名(ここではCommonLayer
)に合わせてください。
また、ContentUriには、実際にLayerを格納しているフォルダ名(layer
)に合わせてください。
Events
はLambdaの呼び出し元に応じて設定してください。
Pythonファイルからの呼び出し方
結論からですが、同じディレクトリ階層にあるものとして、Pythonソース内からimportします。
以下のような感じです。
from XXXX_util import XXXX_util
from XXXX_settings import XXXX_settings