はじめに
こんにちは、技術一課の山中です。
Lambda Layers を AWS Lambda で利用する場合に、デプロイ時の最新の Layer を常に利用したいことがあったので、どのようにすればよいのか考えたことを以下に記します。
Lambda Layers のデプロイ
現在、Lambda Layers にデプロイするディレクトリの構成は以下の通りです。
.
├── package-lock.json
├── package.json
├── sample
│ └── python
│ └── sample.py
└── serverless.yml
デプロイする Python コードの中身は以下のようになっています。
say
メソッドに引数を渡すことで say [引数] from layer
を print してくれるという優れものです。
$ cat sample/python/sample.py
def say(message):
print('say {} from layer'.format(message))
今回は Serverless Framework を利用してデプロイしますので、 serverless.yml を以下のように定義します。
$ cat serverless.yml
service: sample
provider:
name: aws
stage: dev
region: ap-northeast-1
layers:
sampleLayers:
path: sample
description: sample layer
compatibleRuntimes:
- python3.7
ここまで準備できたら serverless deploy
コマンドでデプロイしてください。
Lambda Layers を利用するファンクションのデプロイ
通常であれば、以下のように serverless.yml で Lambda Layers の ARN をバージョンまで指定して定義しなければなりません。
service: sample-layers
provider:
name: aws
runtime: python3.7
region: ap-northeast-1
functions:
sample_function:
handler: lambda_function.lambda_handler
layers:
- arn:aws:lambda:ap-northeast-1:000000000000:layer:sample:1
バージョン番号を指定せず常にデプロイ時に最新の Layers を指定したい場合はどのようにすればよいのでしょうか。 Serverless Framework では CloudFormation を利用して生成されたリソースを以下の形で参照し、利用することができます。
cf:[スタック名].[出力キー]
先ほどデプロイした Lambda Layers の出力キーは以下となっているので、これを利用してこれからデプロイする Lambda から参照するように serverless.yml を修正してみましょう。
service: sample-lambda
provider:
name: aws
runtime: python3.7
region: ap-northeast-1
functions:
sample_function:
handler: lambda_function.lambda_handler
layers:
- ${cf:sample-layers-dev.SampleLayersLambdaLayerQualifiedArn}
${cf:sample-layers-dev.SampleLayersLambdaLayerQualifiedArn}
の sample-layers-dev
が Lambda Layers デプロイ時のスタック名、 SampleLayersLambdaLayerQualifiedArn
が出力キーとなっています。
また、今回デプロイする lambda_function.py は以下です。
from sample import say
def lambda_handler(event=None, context=None):
say('this is sample')
ここまで準備できたら Lambda ファンクションもデプロイしてみてください。
$ serverless deploy
Service Information
service: sample-lambda
stage: dev
region: ap-northeast-1
stack: sample-lambda-dev
resources: 4
api keys:
None
endpoints:
None
functions:
sample_function: sample-lambda-dev-sample_function
layers:
None
Stack Outputs
SampleUnderscorefunctionLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-1:000000000000:function:sample-lambda-dev-sample_function:1
ServerlessDeploymentBucketName: sample_bucket
実行してみる
デプロイした Lambda ファンクションを実行してみましょう。
$ serverless invoke -f sample_function -l
--(省略)--
say this is sample from layer
--(省略)--
きちんと Lambda Layers のメソッドを利用できています。
おわりに
先日デプロイパッケージの制限に引っかかりデプロイできない事案があったので、 Lambda のデプロイ時は以下をよく参照してデプロイしてください。