Lambda関数からLayerのコードを呼び出す方法(ZIPファイルアーカイブ版)
概要
ZIP化したPythonのコードをLayerへデプロイし、別のLambda関数から呼び出します。
必要最小限の構成で作れるようにしており、Windows の PowerShell を使い、AWS CLI で構築できる手順としています。
また、AWSでは、Lambda関数のコードは「コンテナイメージ」と「ZIPファイルアーカイブ」の2種類のデプロイパッケージをサポートしており、今回は「ZIPファイルアーカイブ」で構築します。
前提条件
デプロイパッケージの構成
最終的にはこんなイメージの構成となります。
/test1Lambda ├ lambda_function.py └ Layer └ test1Layer(test1_function.py)
全体の流れ
以下の流れで作業を進めます。
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 !!"
こんな感じで簡単にできますね。