1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Lambda でカスタムレイヤーを追加する方法

Last updated at Posted at 2024-03-30

概要

  • 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)
    スクリーンショット 2024-03-30 22.42.27.png
  • 入力項目
    • 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)
    スクリーンショット 2024-03-30 22.51.04.png

  • 先ほど追加したレイヤーを選ぶ

スクリーンショット 2024-03-30 22.51.55.png

  • 入力項目
    • Layer source: Custom layersを選ぶ
    • Custom layers: 正しくCompatibleなRuntimeとArchitectureでレイヤーを作成できていれば、ドロップダウンのリストで自分の作成したレイヤーを選べる
    • Addする
1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?