はじめに
Cloud9を使用してLambdaで使用するLayerを作るときのzipの作成手順をまとめておく
作成時につまづいた部分も残しておくことで、未来の自分のためになることを期待
Cloud9の準備
マネコンから Cloud9 > [関数の作成] > 名前を入力して [作成]
Cloud9 IDEの「開く」からエディタの画面へ
環境構築
pyenvのインストール
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
bashrc
vi ~/.bashrc
export PATH="/home/ec2-user/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
source ~/.bashrc
入れたいpythonのバージョンを指定してインストール
pyenv install 3.9.16
pyenv global 3.9.16
バージョン確認
python3 -V
モジュールを入れるディレクトリ
mkdir python && cd $_
Layer化したいものを詰めてzip化
pip3 install requests -t .
cd ../
zip -r requests.zip python/
aws s3 cp requests.zip s3://<backet_name>/requests.zip # S3に上げる場合はaws cliから可能
あとはLayerに画面で作成するだけです。
必要なくなったらインスタンスの削除を忘れずに。
memo
個人的メモ書き。
requestsとboto3
(2023.06.21)
python3.9のLambdaに対して、何も考えず上記の方法でrequestsのLayerを作って適用したら、import時にエラーが発生した。
boto3 requests cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'
requestsを外してboto3だけにするとimportは成功するし、boto3を入れずにrequestsのLayerだけにしたらその場合も成功する...
(原因)
両方とも依存関係の中に urllib3
があり、違うバージョンの2つが共存する状態になっていた。
- boto3は urllib3-1.26.16
- requestsは urllib3-2.0.3 (バージョン指定しなかったせいで最新の2.31.0を入れようとしていた)
requestsのバージョンを下げていき、urllib3のバージョンを揃えて解決。