kenichiro246’s blog

主にC#での仕事をしてます。今はAWSに関わり始めました。

Lambda関数からLayerのコードを呼び出す方法(ZIPファイルアーカイブ版)

概要

ZIP化したPythonのコードをLayerへデプロイし、別のLambda関数から呼び出します。
必要最小限の構成で作れるようにしており、WindowsPowerShell を使い、AWS CLI で構築できる手順としています。
また、AWSでは、Lambda関数のコードは「コンテナイメージ」と「ZIPファイルアーカイブ」の2種類のデプロイパッケージをサポートしており、今回は「ZIPファイルアーカイブ」で構築します。

前提条件

  • AWS CLI がインストールされている。
  • 今回は Windows で構築します。

デプロイパッケージの構成

最終的にはこんなイメージの構成となります。

/test1Lambda
 ├ lambda_function.py
 └ Layer
   └ test1Layer(test1_function.py)

全体の流れ

以下の流れで作業を進めます。

  1. PythonでLambda関数を作成する
  2. ZIPファイルアーカイブを作成する
  3. Layerにデプロイする
  4. Layerを呼び出すLambda関数を作成する
  5. Lambda関数を実行する

PythonでLambda関数を作成する

以下のとおりLambda関数のファイルを作成します。 この時、フォルダは「python」にする必要があります。
もしフォルダ名を変えてしまうと、このLambda関数が参照できない状態になります。
※安易にフォルダ名を変更してしまい、Lambda関数が参照できない事象が発生し、解決するまで地味にハマりました。
参考:https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-import-module-error-python/

> 重要:Python 用にインポートするライブラリを /python フォルダ内に配置します。
mkdir python
New-Item -ItemType file python/test1_function.py
Invoke-Item python/test1_function.py

test1_function.py

def func1():
    return 'Hello test1_function.func1 !!'

ZIPファイルアーカイブを作成する

PowerShell で以下を実行して、ZIPファイルアーカイブを作成します。
ZIPファイルの中身は、「python」フォルダとその配下に「test1_function.py」が含まれていればOKとなります。

Compress-Archive -Path python/ -DestinationPath test1-package.zip

Layerにデプロイする

  • S3 へアップロードする
    ※S3のバケット名は全世界で一意にする必要がありますので、適宜変更してください。
aws s3 mb s3://test1-bucket
aws s3 cp test1-package.zip s3://test1-bucket/ --acl public-read
  • S3 から Lambda のレイヤーへデプロイする。
aws lambda publish-layer-version --layer-name test1Layer --description "test1 Lambda" --license-info "MIT" --content S3Bucket=test1-bucket,S3Key=test1-package.zip --compatible-runtimes python3.9 --compatible-architectures "x86_64"

Layerを呼び出すLambda関数を作成する

  • 以下の内容でLambda関数を新規作成する

    プロパティ
    関数名 test1Lambda
    ランタイム Python 3.9
    アーキテクチャ x86_64
    実行ロール 基本的な Lambda アクセス権限で新しいロールを作成
  • 作成した関数の「Layer」セクションで、「レイヤーの追加」をクリックする。

  • 「レイヤーを選択」セクションで「カスタムレイヤー」を選択し、ZIPファイルアーカイブのLambda関数を選択する。この時、バージョンも指定する。

  • 「追加」をクリックする

Lambda関数を実行する

  • Lambda関数「test1Lambda」の lambda_function.py を以下のとおり変更する。
import test1_function

def lambda_handler(event, context):
    return test1_function.func1()
  • デプロイ後、「Test」をクリックして以下のとおり表示されれば成功です!
 Response
 "Hello test1_function.func1 !!"

こんな感じで簡単にできますね。