🅰️
Lambda Layer にアップロードするための zip ファイルを作成するには Cloud9 環境を利用すると結構便利
Qiitaの本記事にて投稿した記事に加筆・修正し、移行した記事です。
要約
- Lambda に外部ライブラリを組み込むには、Lambda Layer が便利
- Lambda Layer へは python.zip としてアップロードする必要がある
- 非 AmazonLinux 環境で zip 化したパッケージは Lambda 上で呼び出せない可能性がある
- Cloud9 で zip 化→そのまま S3 にアップロードすると結構楽でした
前提
Lambda の実行環境で、外部ライブラリを使うための方法
- 外部ライブラリを含めて zip したものをデプロイする
- ライブラリのサイズが大きいと、インラインコード編集ができなくなる
- なので、ブラウザ上でちょこっと確認とかができなくなる
- ライブラリのサイズが大きいと、インラインコード編集ができなくなる
- 外部ライブラリを Lambda Layer として用意しておき、Lambda 上でそれを呼び出す
- 一つ Layer を用意しておけば、複数の関数で呼び出すこともできる
容量的にも、管理的にも Lambda Layer を使う方がよさそうです
Lambda Layer
まずは zip にする必要がある
C:\dev\sampledir> pip install --upgrade pip
C:\dev\sampledir> mkdir python
C:\dev\sampledir> cd python
C:\dev\sampledir\python> pip install requests -t .
- pip の -t オプションで、直後に指定したディレクトリにイントールが可能
- python 直下にインストールされるので、python ディレクトリを zip 化し、python.zip を作成する
- python.zip という名前が重要!
後は、Layer に追加すればOK
大体はこれでできるけど、できないやつもある
AmzonLinux2 環境下で Windows 環境下で zip 化したライブラリを呼び出せない場合がある。
自分の場合は PIL とかは NG でした。Cython 使ってるライブラリがダメなのかもしれないです。
なので、AmazonLinux2 環境下で、zip 化したら確実なのでは
以下から本題です。
Cloud9 環境で、zip 化する
EC2 で~とか docker で~とかいろいろと方法はあるようですが、今回は Cloud9 を使用します。
Cloud9 も EC2 上で動くので、使わないときは適宜 終了 or 停止してください
Cloud9 環境を立ち上げ
下記記事参考に環境を作成する
- スペックは t2.micro で OK(一番安いやつで OK)
- 終了したらインスタンスの停止 or 終了を忘れないようにする
下記記事を参考に、python 環境構築、zip 化を行っていく
pyenv 環境構築
ターミナルでコマンド実行していく
# ライブラリを保管するディレクトリを作成
mkdir tmp-python
cd tmp-python
# zip 化に必要なツールをインストール
sudo yum -y install bzip2-devel xz-devel
# pyenv を clone
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# pyenv の PATH を通す
vi ~/.bashrc
# vi でファイルが開かれるので、 I key で INSERT mode に変更。以下を追記する
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
# 完了したら、ESC key で INSERT mode を終了
# :wq! で保存して終了
# .bashrc の変更を現在のターミナルに適用する
source ~/.bashrc
# 任意の Python を Install
pyenv install 3.9.16
# pyenv で現環境に設定
pyenv global 3.9.16
python -V
ライブラリインストール
# pip をアップデート
pip install --upgrade pip
pip -V
# 今回は試しに Cython を呼び出しているライブラリをインストール
mkdir pack
cd pack
mkdir python
cd python
pip install h3 -t .
zip 化する
- 先述したようにpython.zipという名前にする必要があるので注意
# python.zip を作成する
# python ディレクトリを zip 化する
cd ../
zip -r python.zip python
s3 にアップロード
aws s3 cp python.zip s3://s3オブジェクト URL
>> upload: ./python.zip to s3://s3オブジェクトURL/python.zip
- あとは Layer にしてしまえば OK
- あとは Lambda 関数の Layer にして、動作確認
おわり
ありがとうございました
こんなのもあります
Discussion