はじめに
こんにちは、技術一課の山中です。
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 のデプロイ時は以下をよく参照してデプロイしてください。