0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Dockerを使用してAWS Lambda Layerを作成するシェルスクリプト作ったよ

Posted at

Dockerを使用してAWS Lambda Layerを作成する方法
AWS Lambdaで使用するライブラリを簡単にLayerとして作成する方法をご紹介します。この手順では、Dockerを使用してPythonライブラリをインストールし、それをLayerとしてパッケージ化します。

前提条件

そもそも自作しなくてもlayerがAWS公式から準備されてないか確認します。
また有志の方がまとめてくれてる
https://github.com/keithrozario/Klayers/tree/master
このリポジトリで自分の環境にあったlayerがあればそれを使うのが手っ取り早いです。

上記でもないマイナーなライブラリなどをlayerにしたい時、以下の手順で簡単にできるように
シェルスクリプトを作りました。
※pythonにしか対応してません。

Dockerがインストールされていることが前提です!

手順

1. 必要なフォルダとファイルの準備

まず、任意のフォルダに移動し、Layerに含めたいライブラリ名をrequirements.txtファイルに記述します。

requirements.txt
requests_toolbelt

次に、以下のシェルスクリプトをcreate_layer.shとして保存します。
pythonバージョンは各自の環境に合わせて編集してください。

create_layer.sh
#!/bin/bash

# シェルスクリプトの実行を中止するためのエラーハンドリング
set -e

# Pythonバージョンを変数として定義
PYTHON_VERSION="3.12"

# 必要なフォルダ構成を作成
mkdir -p python/lib/python${PYTHON_VERSION}/site-packages

# Dockerコンテナを使用してライブラリをインストール
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python${PYTHON_VERSION}" /bin/sh -c "pip install -r requirements.txt -t python/lib/python${PYTHON_VERSION}/site-packages/; exit"

# ライブラリを含むフォルダをZIPアーカイブに圧縮
zip -r lambda_layer.zip python > /dev/null

# pythonフォルダを消去
rm -rf python

# 完了メッセージ
echo "Lambda Layer ZIP file has been created successfully: lambda_layer.zip"

2. シェルスクリプトに実行権限を付与

次に、ターミナルで以下を実行しシェルスクリプトに実行権限を付与します。

chmod +x create_layer.sh

3. シェルスクリプトを実行

シェルスクリプトを実行して、Layerを作成します。

./create_layer.sh

実行が成功すると、現在のディレクトリにlambda_layer.zipファイルが作成されます。これをAWS LambdaのLayerとしてアップロードして使用します。

ちなみにrequests_toolbeltライブラリの動作確認用のlambda関数は以下みたいな感じです。

requests_toolbelt確認
from requests_toolbelt.multipart import decoder
import json


def lambda_handler(event, context):
    try:
        # デコーダを使用してみる(例として空のバイト列を渡す)
        multipart_data = decoder.MultipartDecoder(b'', 'multipart/form-data; boundary=---BOUNDARY')
        
        # インポートとデコーダの使用が成功した場合
        return {
            'statusCode': 200,
            'body': json.dumps('requests_toolbelt is successfully imported and used.')
        }
    except Exception as e:
        # エラーが発生した場合
        return {
            'statusCode': 500,
            'body': json.dumps(f'Failed to import or use requests_toolbelt: {str(e)}')
        }

うまくlayerが作れていたら
ログにrequests_toolbelt is successfully imported and used. が表示されるはずです。

まとめ

以上の手順で、必要なPythonライブラリをLambda Layerとしてパッケージ化することができます。
Dockerを使用することで、ローカル環境に依存せずにライブラリをインストールできるのでおすすめです。

ぜひ試してみてください!

0
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
0
0