3
1

Lambda Layersを使用して共通ライブラリを作成してみた

Last updated at Posted at 2023-12-18

はじめに

この記事は、ミロゴス Advent Calendar 2023 18日目の投稿です。
AWS Lambdaは、サーバーレスコンピューティングを実現するための重要なコンポーネントです。
この記事では、Pythonを使用してAWS Cloud Development Kit (CDK) を活用し、Lambda Layerを作成し、Lambda関数から共通処理を呼び出す方法を簡単に紹介します。

Lambda Layersとは

Lambda Layersは、AWS Lambdaで提供されている機能の一つです。
共通のコードやリソースを複数のLambda関数で共有し、アプリケーションの効率性と保守性を向上させるための有用なツールです。
特に、多くのLambda関数で同じコードやライブラリを使用する場合や、コードサイズの制約に直面する場合に役立ちます。

内容

環境

  • 使用する環境の情報です。
npm -v
10.2.0

python -V               
Python 3.9.6

aws-cdk version
2.96.2

Lambda Layerの準備

インポート

必要なライブラリやモジュールをインポートしています。

cdk_stack.py
from aws_cdk import RemovalPolicy, Stack
from aws_cdk import aws_lambda as _lambda
from aws_cdk import aws_lambda_python_alpha as python_lambda

Layerの作成

cdk_stack.py
layer = _lambda.LayerVersion(
    self,
    "MyLayer",
    removal_policy=RemovalPolicy.DESTROY,
    code=_lambda.Code.from_asset("tmp"),
    compatible_architectures=[_lambda.Architecture.X86_64, _lambda.Architecture.ARM_64],
)
  • removal_policy=RemovalPolicy.DESTROY
    • Layerの削除ポリシーを設定しています。
    • RemovalPolicy.DESTROYを設定すると、CloudFormationスタックが削除された際にLayerも削除されます。
  • code=lambda_.Code.from_asset("tmp")
    • Layerの本体であるコードやファイルをどのように提供するかを指定します。
    • ローカルディレクトリのtmpディレクトリからコードを読み込むように指定しています。
  • compatible_architectures=[lambda_.Architecture.X86_64, lambda_.Architecture.ARM_64]
    • Lambda Layerと互換性のあるアーキテクチャを指定しています。
    • X86_64(x86_64アーキテクチャ)およびARM_64(ARM_64アーキテクチャ)の両方に対応しています。つまり、このLayerはこれらのアーキテクチャで実行されるLambda関数に使用できます。

Layerのパラメータに関する詳しい説明は以下のリンクからご確認ください。

Lambda Layerのコードをセットアップ

Layerに含めたいコードやファイルを適切な場所に準備します。

app.py
if os.path.isdir("tmp"):
    shutil.rmtree("tmp")
shutil.copytree("src/common", "tmp/python/src/common")

この処理は、デプロイ時にsrc/commonディレクトリのコンテンツをtmp/python/src/commonディレクトリにコピーします。
Pythonの場合、共通処理はpythonディレクトリ以下に格納されることを想定しています。

パッケージングの詳細については、以下のリンクからご確認ください。

Lambdaの作成

Lambdaを2つ作成して、Layerを呼び出せるようにします。

cdk_stack.py
self.first_lambda = python_lambda.PythonFunction(
    self,
    "first-lambda",
    entry=os.path.join(os.getcwd(), "src/first_lambda"),
    runtime=_lambda.Runtime.PYTHON_3_9,
    index="main.py",
    handler="lambda_handler",
    function_name="first-lambda",
    layers=[layer],
)
self.second_lambda = python_lambda.PythonFunction(
    self,
    "second-lambda",
    entry=os.path.join(os.getcwd(), "src/second_lambda"),
    runtime=_lambda.Runtime.PYTHON_3_9,
    index="main.py",
    handler="lambda_handler",
    function_name="second-lambda",
    layers=[layer],
)
  • entry=os.path.join(os.getcwd(), f"src/{entry_name}")
    • Lambda関数のコードが含まれるディレクトリまたはZIPファイルの場所を指定します。
  • runtime=_lambda.Runtime.PYTHON_3_9
    • Lambda関数のランタイムを指定します。この場合、Python 3.9が使用されています。
  • index="main.py および handler="lambda_handler"
    • Lambda関数のエントリーポイントとハンドラー関数を指定します。
    • main.py内のlambda_handler関数がエントリーポイントとして指定されます。
  • layers=[layer]
    • Lambda関数に適用するLambda Layerを指定します。

Lambdaのパラメータに関する詳しい説明は以下のリンクからご確認ください。

Layerで提供するコードの作成

共通処理などをまとめます。
今回は確認のための例で、connect_checkメソッドを入れており、値をLambdaから表示します。

common_class.py
class CommonClass:
    # テスト用
    def connect_check() -> str:
        return "CommonClass loading completed"

ディレクトリ構成

最終的なディレクトリ構成は以下になります。

.
├── README.md
├── app.py
├── cdk
│   └── cdk_stack
│       ├── __init__.py
│       ├── __pycache__
│       └── cdk_stack.py
├── cdk.json
├── package-lock.json
├── package.json
├── poetry.lock
├── pyproject.toml
├── src
│   ├── common
│   │   └── common_class.py
│   ├── first_lambda
│   │   ├── main.py
│   │   └── requirements.txt
│   └── second_lambda
│       ├── main.py
│       └── requirements.txt
└── tmp
    └── python
        └── src
            └── common
                └── common_class.py

確認

Lambdaの手動実行

コンソール上から2つのLambdaのテストを実行してLayerのCommonClassから必要なデータを出力できればOKです。
例では、connect_checkメソッドを使用して"CommonClass loading completed"を出力しています。

image.png

image.png

さいごに

Lambda Layersを使用することで、共通のコードやリソースを複数のLambda関数で共有し、コードの再利用性を高めることができます。
AWS CDKなどのツールを使用してLambda Layerを簡単に作成できるため、ぜひ実際に試してみてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1