DockerとAWS CLIを利用して任意のパッケージを含めたAWS LambdaのLayerを作成する手順のメモ。
Dockerコンテナ内でパッケージインストールからzip作成まで完結させるので、マシン環境を無闇に汚さずに済む、再現性に優れる、というメリットがある。
前提環境
$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
(中略)
$ docker version
Client:
Version: 18.06.1-ce
(中略)
$ aws --version
aws-cli/1.16.198 Python/3.6.8 Linux/4.14.123-86.109.amzn1.x86_64 botocore/1.12.188
手順
ここでは、Python3.7ランタイム向けのLayerを作成する手順を紹介する。
作業はすべて同一の作業パスで行う。
Dockerfile作成
以下のファイルをファイル名Dockerfile
で作成。
ファイル内の[Package1] [Package2] ...
部分にはインストールしてLayerに含めたいパッケージを記載。
例えばrequests
とlxml
の最新版を含めたい場合はpip install -t ./python requests lxml && \
と書く。
FROM python:3.7
WORKDIR /work
CMD apt update && \
apt install -y zip && \
mkdir python && \
pip install -t ./python [Package1] [Package2] ... && \
zip -r ./zipdir/layer.zip python
zipファイル作成
以下のコマンドを実行してDockerfileを利用したイメージのビルドとコンテナ実行を行い、Layerにアップロードするzipファイルを作成。
$ docker build -t aws_layer_zip .
$ docker run -v "${PWD}":/work/zipdir aws_layer_zip
Layer作成
以下のコマンド実行を実行して、Layerにzipファイルをアップロード。
$ aws lambda publish-layer-version \
--layer-name hoge-layer \
--zip-file fileb://${PWD}/layer.zip \
--compatible-runtimes python3.7
python3.7ランタイムのLambdaで利用可能なLayerが作成できた。
以上