Lambdaレイヤーを作成する目的と問題
- 目的
AWS Lambda関数で標準でないPythonライブラリ(今回の場合はopenai、linebot-sdkなど)を使用するには、それらのライブラリを事前に用意する必要がある。
以下2つの方法があり、
- Lambda関数にソースコードとともにアップロード
- Lambdaレイヤーを作成してLambda関数に適応させる
Lambdaレイヤーを作成する方法だと、
- 複数のLambda関数で共有することができる
- ソースコードとライブラリを別に管理できる
というメリットがある。
したがってLambdaレイヤーを作成する。
- 問題
AWS Lambdaは、Amazon Linux上で実行されるため、使用するライブラリや依存関係はAmazon Linux環境に合わせる必要がある。
具体的に言うとWindows上でpythonライブラリを用意してアップロードしても謎のエラーが発生することがあるので避けた方が良い。
Dockerを使用して仮想環境上にAmazon Linuxを再現することでこの問題を解決する。
具体例をもとにその方法を記す。
1. Lambdaレイヤーの作成手順
下記手順の通りに行う
ファイル作成
Dockerイメージを実行
AWSにアップロード
1.1. ファイル作成
- Dockerfile作成
以下の内容の「Dockerfile」を作成。
1 | FROM amazonlinux:2 |
「yum install -y tar gzip make wget && \」の部分で追加で使用するパッケージがあれば書き換える。
今回はpandasやらなんやら使っているのでいろいろ追加して、
1 | yum install -y tar gzip make gcc openssl11 openssl11-devel bzip2-devel libffi-devel wget && \ |
としている。
必要なパッケージはlambdaで起動したときのエラーではじめて分かるから面倒。
トライ&エラー。
多分スマートな方法がある。
- entrypoint.sh作成
以下の内容の「entrypoint.sh」を作成。
1 | #!/bin/bash -eu |
Dockerfileとentrypoint.shは同じディレクトリに保存する。
1.2. Dockerイメージを実行
さっきのファイルを保存したディレクトリでコンソールからDocker実行。
Dockerが無い場合は以下の記事通りにセットアップしたら良い。
- Dockerイメージをビルド
1 | docker build -t temp . |
- Dockerイメージを実行
1 | docker run --rm -v %cd%/out:/out temp line-bot-sdk openai rapidfuzz pandas |
引数の「line-bot-sdk openai rapidfuzz pandas」が今回使用するpythonライブラリ。
成功するとディレクトリ「out」に「layer.zip」が生成される。
1.3. AWSにアップロード
AWSコンソールから「Lambda→レイヤー→レイヤーの作成」に移動。
適当な名前を付ける
「layer.zip」が10MB未満なら直接アップロード、以上ならS3に置いてパスを渡す
Lambda関数と合わせる
Lambda関数と合わせる
2. 作成したAWSレイヤーの使用方法
AWSコンソールから「Lambda→関数→関数名」に移動。
「コード→レイヤー→レイヤーの追加」で作成したレイヤーを選ぶ。