Tsubatoの発信記録

主に機械学習やデータサイエンス関連で学んだことを書いています。

(AWS CDK)LambdaのLayerでコードを再利用する

0. この投稿の概要

  • AWS Lambdaの異なるFunction間でコードを再利用をするための仕組みであるLayerをAWS CDKでdeployします。
  • 元となるLambda Functionは以前の投稿で実装した図書館アラートシステムです。aburaku.hatenablog.com

1. Layerとは?

  • AWS Lambdaはコードをアップロードすることで、サーバの細かい設定をせずに周期実行やトリガー実行できるアプリを簡単に作成できるサービスです。
  • Lambdaの実行単位であるFunctionは基本的に独立しており、また外部ライブラリを使う場合はそれを丸ごとアップロードする必要があります。
  • Layerは異なるFunction間でコードを再利用する仕組みです。特に外部ライブラリは重くなりがちですが頻繁に更新しないので、自分のコードと切り離すことでdeployの時間を短縮することもできます。
  • 以下のgifはAWSのブログからの引用ですが理解しやすいかと思います。

2. CDKによるdeploy

  • コードはgithubに上げています。

github.com

layer = _lambda.LayerVersion(
    self,
    "Packages",
    code=_lambda.Code.from_asset(LAYER_PATH),
    description="requests module",
)

library_alert_lambda = _lambda.Function(
    self,
    "LibraryAlert",
    code=_lambda.Code.from_asset(API_PATH),
    handler="library_alert.lambda_handler",
    memory_size=512,
    timeout=core.Duration.seconds(120),
    role=lambda_role,
    layers=[layer],   # <- 追加
    **common_params,
)
  • CDKのLayerVesionの必須引数はcodeだけです。pip install requests -t ./packages/pythonのようにtargetオプションをつけてパッケージを指定した場所にインストールをして、その場所をcodeに指定します。
  • この際気をつけるのはpythonというフォルダの下に配置することです。こうしておくとパスが通るのでLambda側で特にパスを追加しなくてもimportが可能になります。

参考:Lambda レイヤーの作成と共有 - AWS Lambda

  • Function側の変更はlayers引数に追加したいlayerをリストで渡してやるだけです。

3. 結果

  • 動作自体は元のコードと変化はしませんが、GUIでLayerを追加したFunctionを見に行くと、確かに追加されていることが確認できます。