概要
- Lambdaで何かしらの処理を行いたい時、デフォルトだとインストールされていないパッケージを使う場合は、レイヤーをアタッチする必要がある
- Lambdaを使うとき、基本的に必要になる作業なので、自分のやり方を備忘として残す
手順
1. ローカルで必要なパッケージをまとめる
- レイヤーに含めたいパッケージを仮想環境にインストール
python3 -m venv venv
source venv/bin/activate
pip install package-name
- 「pythonという名前」のディレクトリにパッケージを詰めてzipファイルにする
- pythonという名前である必要がある(任意ではないことに注意)
- 仮想環境の具体的なpathはそのときのローカルの状況次第
mkdir -p layer/python
cp -r venv/lib/python3.10/site-packages/* layer/python/
cd layer
zip -r my_layer.zip python
※ 原因をきちんと調べていないが、カスタムレイヤーにboto3を含めてしまうとlambda側で呼び出した時にError: Runtime exited with error: signal: segmentation fault"
が起きて失敗する場合があるのでboto3を抜いたバージョンのレイヤーを作った方が良い(lambdaではデフォルトでboto3を使うことができる)
2. S3にzipファイルを送る
- 個人内で再利用する際に、色々と便利なので、S3を使う方法が気に入っている
- S3への送信方法は手動、AWS CLI等々、色々とあり得るが、下記のようなboto3を使ったpythonスクリプトで送れる
- 環境変数にAWS認証情報等が含まれている前提
# send_file_to_s3.py
import argparse
import boto3
import os
def upload_file_to_s3(local_file_path: str, object_name: str) -> None:
"""Upload file to S3"""
s3_client = boto3.client(
"s3",
aws_access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),
aws_secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),
)
s3_client.upload_file(local_file_path, os.getenv("BUCKET_NAME"), object_name)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("local_file_path")
parser.add_argument("object_name")
args = parser.parse_args()
upload_file_to_s3(args.local_file_path, args.object_name)
- 下記の要領で実行し、指定したバケットにzipを送る
python send_file_to_s3.py your-local-path/my_layer.zip my_layer.zip
3. カスタムレイヤーを作る
- S3に送ったzipファイルを用いてカスタムレイヤーを作る
- マネジメントコンソールにおいて、簡単に作成できる(Lambda > Layers > Create layer)
- 入力項目
- Name: 適当に
- Description: 適当に
- 「Upload a file from Amazon S3」を選択
- Amazon S3 link URL: アップロードしたS3バケットのzipファイルを見にいくとObject URLを見つけることができる(S3 URIではないことに注意)
- Compatible architectures: アタッチしたいLambda関数を作成する際に選んだものと同じものである必要がある
- Compatible runtimes: アタッチしたいLambda関数を作成する際に選んだものと同じものである必要がある
4. レイヤーをアタッチする
-
そのレイヤーをアタッチしたいLambda関数のページにて、レイヤーを追加する(Lambda > Functions > your-function-name > Layer > Add a layer)
-
先ほど追加したレイヤーを選ぶ
- 入力項目
- Layer source: Custom layersを選ぶ
- Custom layers: 正しくCompatibleなRuntimeとArchitectureでレイヤーを作成できていれば、ドロップダウンのリストで自分の作成したレイヤーを選べる
- Addする