🤖

Lambda Layer にアップロードするための zip ファイルを作成するには Cloud9 環境を利用すると結構便利

2023/12/18に公開

Qiitaの本記事にて投稿した記事に加筆・修正し、移行した記事です。

要約

  • Lambda に外部ライブラリを組み込むには、Lambda Layer が便利
  • Lambda Layer へは python.zip としてアップロードする必要がある
  • 非 AmazonLinux 環境で zip 化したパッケージは Lambda 上で呼び出せない可能性がある
  • Cloud9 で zip 化→そのまま S3 にアップロードすると結構楽でした

前提

Lambda の実行環境で、外部ライブラリを使うための方法

  1. 外部ライブラリを含めて zip したものをデプロイする
    • ライブラリのサイズが大きいと、インラインコード編集ができなくなる
      • なので、ブラウザ上でちょこっと確認とかができなくなる
  2. 外部ライブラリを Lambda Layer として用意しておき、Lambda 上でそれを呼び出す
    • 一つ Layer を用意しておけば、複数の関数で呼び出すこともできる

容量的にも、管理的にも Lambda Layer を使う方がよさそうです

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html

https://dev.classmethod.jp/articles/lambda-layer-basics-how-it-works/

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

https://sebenkyo.com/2021/05/21/post-1979/

https://www.distant-view.co.jp/column/6513/

大体はこれでできるけど、できないやつもある

AmzonLinux2 環境下で Windows 環境下で zip 化したライブラリを呼び出せない場合がある。
自分の場合は PIL とかは NG でした。Cython 使ってるライブラリがダメなのかもしれないです。

https://designare.jp/blog/noda/lambdaの外部モジュールのimportでエラーが出た場合の解.html

https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html?icmpid=docs_lambda_help

なので、AmazonLinux2 環境下で、zip 化したら確実なのでは

以下から本題です。

Cloud9 環境で、zip 化する

EC2 で~とか docker で~とかいろいろと方法はあるようですが、今回は Cloud9 を使用します。
Cloud9 も EC2 上で動くので、使わないときは適宜 終了 or 停止してください

Cloud9 環境を立ち上げ

下記記事参考に環境を作成する

  • スペックは t2.micro で OK(一番安いやつで OK)
  • 終了したらインスタンスの停止 or 終了を忘れないようにする

https://qiita.com/gonbe/items/44050b2f28c9c06f13e6

下記記事を参考に、python 環境構築、zip 化を行っていく

https://blog.usize-tech.com/make-pandas-lambda-layer/

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