こちらの記事ではAWS環境でPython用のレイヤーを作成する方法をご紹介する。
Lambda (Python)を使っていると、地味にすぐ遭遇する問題である。
主に、Lambda上に使いたいレイヤーがない or 250MB問題にぶつかるからである。
こちらの記事ではレイヤーはなんぞやについては言及しないが、レイヤー問題を解決するためのヒントを体系立てて記載できればと思っている(方法そのものしか書いてないところが多かったので……)
自作してレイヤー追加する前に
Pythonだと、ARNを利用して追加する方法がある。
使いたいライブラリのARNがある場合はこちらの方が手っ取り早い。
ARNとはリソース番号で、それを指定すると有志の方々が作成したLamnda(Python)用のレイヤーを手っ取り早く利用できると言うワケだ(正確ではないが、大体そんな感じ)
上記のリンクから、リージョンのCSVを確認し、使いたいライブラリのARN番号をレイヤー追加すれば良い。
例えば、東京リージョンの場合は「ap-northeast-1」のCSVを見る感じである。
参考 AWS LambdaのPython用Layerは有志の提供物を使えば自作が不要になる
こちらで当該ライブラリがない or 容量オーバーしたぜ! と言う方は下記の方法を参考に、自作しよう。
AWS環境でLambda (Python)のライブラリ(レイヤー)を自作する
今回はAWS環境上でやる方法をご紹介する。
ローカル環境のlinux等でも同等の作成方法は取れるが、私は全てオンライン環境を使った。
ざっくりとした手順としては、以下の通りとなる。
やったことないと面倒そうだと思うが、分かってしまうとそこまで煩雑ではない。
ただ、やり方が散在している……だから、ここでまとめてみたのだと思って頂ければ幸いだ。
EC2(Amazon linux2)をたちあげる
【AWS】EC2でAmazon Linux 2を構築しSSH接続してみよう
上記サイトを参考に、EC2を立ち上げよう。
生成した鍵は、FTP転送の際にも使用するので大事に取っておくこと!
EC2にDocker+Docker Composeをインストールする
【AWS】EC2にDockerとDocker Composeをインストール
上記サイトを参考に、Docker環境を立ち上げたEC2上に構築する。
Lambda用のレイヤーをdocker環境で作成する
上記サイトを参考に、レイヤー作成環境を整える。
この時、「requirements.txt 」に自分が使いたいライブラリを入力しておく。例えば、「numpy」「scipy」を追加したい場合は、下記のような感じになる。
numpy
scipy
あとはdockerコマンドを実行して、pythonフォルダを圧縮すればレイヤーの完成である。
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" \
/bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
上記で作成したレイヤーをFTPで、ローカル環境に落とす
WinSCPでAmazon LinuxにSFTP接続してみた
上記サイトを参考に、作成したレイヤーをローカル環境に落とそう。
この時、EC2を作成した際に生成した鍵を使う。鍵変換を忘れずに!
自作したレイヤーを追加する
【AWS Lambda】Pythonパッケージのレイヤー追加・関数での利用方法|No Module Namedエラー対策
上記サイトの「Lambda関数とレイヤーの設定」を参考に、レイヤーを追加する。
なお、互換性のあるアーキテクチャに関しては、チェックなしにしよう。
容量オーバーだと怒られた!
「Lambda用のレイヤーをdocker環境で作成する」にて、圧縮する前に容量をできるだけ削除する必要がある。
不要なファイルがそこそこあるらしいので、それを削除すれば良い。
今、現在こちらはまだ検証中なので分かり次第、追記する。
レイヤー追加が成功したら
作成したEC2は停止しておこう。停止しておげば費用は発生しない。
そして、またレイヤーを作りたくなったら、出来上がったpythonフォルダを削除して、「Lambda用のレイヤーをdocker環境で作成する」からやりなおせば同じように再利用できる。
ただし次回使う際(停止/再開する度)、IPアドレスが変わるのでそこだけは注意。
まとめ:人様のリンクを貼っているだけやんけ
人様のリンクを貼っているだけやんけ! と言われそうだが、これを調べるだけでも時間がかかったのだ……部分的に書かれても分からない人も多いんだぞ!
実際にやってみると、エラーが出てくる人も多いだろうが、そこはまた各々調べて貰えればと思う(おい)
こういうのはやりながら覚えるしかないのだ!
ではでは、この辺で。
コメント