Serverless Framework で Lambda Layers のバージョンを指定せずにデプロイする方法

記事タイトルとURLをコピーする

はじめに

こんにちは、技術一課の山中です。

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 のデプロイ時は以下をよく参照してデプロイしてください。

AWS Lambda の制限 - AWS Lambda