やろうとしたこと
Serverless Frameworkを使用するとlambdaのlayerを簡単にデプロイできる。 layerは複数のプロジェクトで同じライブラリを使いたい時等に非常に役に立つが、たまに一緒にデプロイしたlambda関数にlayerを設定したい場合がある。 今回はそのケースのYAMLファイルの書き方について説明する。
設定する内容
ざっくり以下2つ
serviceへのレイヤ定義
functionへのレイヤ紐づけ
まずはlayerのみの設定
service: test-layer provider: name: aws runtime: python3.7 stage: ${opt:stage,'dev'} region: ${opt:region,'ap-northeast-1'} profile: ${env:AWS_PROFILE,'default'} memorySize: 256 role: arn:aws:iam::**********:role/service-role/test-role layers: pylayer: path: ./layer/ name: experiment-layer description: test layer packages: include: - lib.tar.gz compatibleRuntimes: - python3.7 retain: true
なお今回の上の設定についていくつか補足すると…
pathにはローカルのアップロードするディレクトリを記載
nameはlambdaに登録される際の名前
retainはlayerのバージョンを保持するかどうか(trueの場合は保持する、デフォルトはfalse)
packageをlayer内で定義してやれば必要なもののみアップロードできる。
なお、パッケージはgzip圧縮しなければいけない(tar -cvzf ****.tar.gz ****
)
lambda関数を作成するにはfunction
ブロックを記載する必要がある。
上記のyamlに追記することを考えると、次のようにlayerを指定できる。
functions: testfunction: layers: - {Ref: PylayerLambdaLayer}
結論
上記の{Ref: PylayerLambdaLayer}
が今回デプロイしたlayerをそのままこのlambda関数のlayerとして使用することを意味している。
Ref:ってなに?
これはCloudFormationで使用する組み込み関数。
余談だがServerless Framework自体(というか多くのデプロイシステムが)CloudFomationをラップしたようなツールなので、こんな事になっている。
このRef関数に引数としてlayer名を渡すとLayerのARNが戻り値として返却される、といった仕組み。
じゃあ今回引数に渡しているPylayerLambdaLayer
はどうすればわかるのか?
これはYAML内で設定している、layerの名前を使用している。
layers: pylayer:
結論以下の様な命名規則となる
layerの名前(titled case)+ LambdaLayer