目次
- はじめに
- 全体の流れ
- 手順1:DockerでLambda環境を構築
- 手順2:Dockerでライブラリをインストール・zip化
- 手順3:Dockerからzipファイルをローカルへ移動
- 手順4:AWSでレイヤーを作成
- おわりに
- 参考文献
はじめに
こんにちは、薬学生です。
今回は、AWSのLambdaでnumpy・pandasをレイヤーとして追加するのに結構手間取ったため、どのようにしてレイヤーを追加したかを紹介していきたいと思います。
なお、ここではPythonのデフォルトのライブラリではなく、pandasやnumpyといった、pipなどを利用してインストールする必要があるライブラリを想定しています。
全体の流れ
まず、全体としてどのような流れで実行したかを紹介します。
- Dockerを利用して、Lambdaが動作する環境を構築する
- Docker内でレイヤーに必要なライブラリをインストール・zip化する
- Dockerからローカルにzipフォルダを移行する
- zipフォルダをAWS上でアップロードしてレイヤーを作る
個人的にDockerを使い慣れていなかったり、アップロードするファイルの決まりがあることに気が付かなかったため、1~3に時間がかかってしまいました。それでは順を追って見ていきます。
手順1:DockerでLambda環境を構築
まず最初に、DockerでLambdaの環境を構築します。そもそもローカルではなくDockerで環境を構築する必要がある理由としましては、ローカルでライブラリを用意した場合、「invalid ELF header」とエラーが出てしまったからです。このエラーについては、「インストール時に環境に応じてheaderの情報が異なる」ことが原因のため起きるとのことです(こちらの記事を参考にさせていただいております。また、Lambdaで正しく動作すれば良いというスタンスですので、細かい部分は気にし過ぎす進めています)。
という訳で、Dockerを使ってLambdaと同じ環境を構築していくこととしました。先ほどの記事では「lambci/lambda」利用していましたが、この記事を書いている2022年3月現在、Python3.9はまだ非対応でした。
そのためこちらの記事を参考に、Amazon Linux2・Python3.9のDockerイメージ※を用意しました。
※こちらの組み合わせがLambdaの実行環境とのことです。なお、Amazon Linux2ではなく、LinuxがLambdaの実行環境だと述べている記事もあり、どちらが正確かは分かりません。私自身はAmazon Linux2の環境で用意したライブラリで正しく動作したため、ひとまずここではLunux2で話を進めていきます。
詳しくは先ほど紹介した記事の通りですが、コマンドを紹介しておきます。
$ docker pull amazonlinux:latest
Dockerfileを用意する。先ほど紹介したサイトからダウンロードできます。ファイルの中身は以下です。
FROM amazonlinux:latest
RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget zip tar gzip make && \
cd /opt && \
wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz && \
tar xzf Python-3.9.6.tgz && \
/opt/Python-3.9.6/configure --enable-optimizations && \
make altinstall && \
rm -f /opt/Python-3.9.6.tgz && \
python3.9 -m pip install --upgrade pip
上記のDockerfileがあるディレクトリに移動して、以下3行を実行。なお、1行目の最後のピリオドは入力ミスではなく必要ですので注意です。
$ docker build -t amazonlin2_py39 .
$ docker run -it -d --name amznlin2_py39_cont amazonlin2_py39
$ docker exec -it amznlin2_py39_cont bash
これでDockerの環境構築は完了です。
手順2:Dockerでライブラリをインストール・zip化
次に、Docker内でレイヤーとして組み込みたいライブラリをインストール・zip化していきます。なお、こちらで注意してほしいのが、ディレクトリ名を「python」または「python/lib/python3.●/site-packages」にする必要がある点です(●は利用したいpythonのバージョン)。
サイトによってはこの点を全く触れていなかったりするので、かなり躓きやすいポイントかと思います。(事実、私はここでかなり苦戦しました)
$ mkdir python
$ pip install -t ./python pandas
$ zip -r pandas.zip python
手順3:Dockerからzipファイルをローカルへ移動
zip化まで終わったら、Docker内のファイルをローカルに移動させましょう。まず、手順2ではDockerの環境内で操作をしていたと思いますので、「Ctrl + p, q」と入力してコンテナからログアウトします。
そして以下のコマンドを入力することで、コンテナのIDを確認します。
$ docker ps
確認したコンテナIDを利用して、ローカルにコンテナ内のファイルを移動します。
$ docker cp コンテナID:/pandas.zip ./
手順4:AWSでレイヤーを作成
ここまでくると、あとはAWS上でzipファイルをアップロードしてレイヤーを作成するだけですので簡単です。こちらのサイトなどでやり方が紹介されていますので参考にしてみてください。
おわりに
以上、AWSのLambdaでレイヤーを追加する方法でした。個人的に、pandasとかnumpyとかは用意しておいてくれてもいいのでは??と感じました(記事によってはデフォルトでnumpyはあると書いていましたが分かりませんでした)。この調子でAWSを使っていこうと思います。それではまた〜
参考文献
- 【AWS】Lambdaレイヤーでライブラリを共通化
- 【AWS・Lambda】Python外部ライブラリ読み込み方法
- Amazon Linux 2 & Python3.9のDockerイメージ【DL可】
- Dockerコンテナ上のファイルをローカルにコピーする
- Lambdaで「invalid ELF header」エラーが出たときの対処法
- pandasをLambdaのLayerとして追加する