のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

Serverless Frameworkでlayerをデプロイ&そのままデプロイしたlambda関数でも使用する

やろうとしたこと

Serverless Frameworkを使用するとlambdaのlayerを簡単にデプロイできる。 layerは複数のプロジェクトで同じライブラリを使いたい時等に非常に役に立つが、たまに一緒にデプロイしたlambda関数にlayerを設定したい場合がある。 今回はそのケースのYAMLファイルの書き方について説明する。

設定する内容

ざっくり以下2つ

  1. serviceへのレイヤ定義

  2. 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

参考

docs.aws.amazon.com