AWS Lambda用のレイヤーをWindows上のDockerで作成

AWS Lambda用のレイヤーをWindows上のDockerで作成

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レイヤーの作成手順

下記手順の通りに行う

  1. ファイル作成

  2. Dockerイメージを実行

  3. AWSにアップロード

1.1. ファイル作成

  1. Dockerfile作成

以下の内容の「Dockerfile」を作成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FROM amazonlinux:2

ARG PYTHON_VERSION=3.11.6

# 必要なパッケージのインストールとPythonのビルド
RUN yum update -y && \
yum install -y tar gzip make wget && \
export CFLAGS=$(pkg-config --cflags openssl11) && \
export LDFLAGS=$(pkg-config --libs openssl11) && \
wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
tar xzvf Python-${PYTHON_VERSION}.tgz && \
cd Python-${PYTHON_VERSION} && \
./configure --with-ensurepip=install && \
make && \
make install && \
cd - && rm -rf Python-${PYTHON_VERSION}* && \
yum clean all

# レイヤー作成用のスクリプトをコンテナに追加
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh

# 必要なツールのインストールとディレクトリの作成
RUN yum install -y zip && \
mkdir /python

ENTRYPOINT ["/entrypoint.sh"]

「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で起動したときのエラーではじめて分かるから面倒。
トライ&エラー。

多分スマートな方法がある。

  1. entrypoint.sh作成

以下の内容の「entrypoint.sh」を作成。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash -eu

SRC=/python
DIST=/out/layer.zip

pip3 install -t ${SRC} $@
find ${SRC} -type d -name "__pycache__" -exec rm -rf {} +
find ${SRC} -name "*.pyc" -delete
rm -f ${DIST}
zip -q -r -9 ${DIST} ${SRC}

Dockerfileとentrypoint.shは同じディレクトリに保存する。

1.2. Dockerイメージを実行

さっきのファイルを保存したディレクトリでコンソールからDocker実行。

Dockerが無い場合は以下の記事通りにセットアップしたら良い。

  1. Dockerイメージをビルド
1
docker build -t temp .
  1. 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→レイヤー→レイヤーの作成」に移動。



  1. 適当な名前を付ける

  2. 「layer.zip」が10MB未満なら直接アップロード、以上ならS3に置いてパスを渡す

  3. Lambda関数と合わせる

  4. Lambda関数と合わせる

2. 作成したAWSレイヤーの使用方法

AWSコンソールから「Lambda→関数→関数名」に移動。
「コード→レイヤー→レイヤーの追加」で作成したレイヤーを選ぶ。

タグ , ,

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×