取りあえず何か創る

ソフトウェアエンジニアだけど仕事以外でも何か作りたくなったので、主にその記録のためにブログを開設しました。

(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を見に行くと、確かに追加されていることが確認できます。