うごく生ゴミプログラマの備忘録

うごく生ゴミ 〜再臨〜

外部ライブラリ使っているAWS Lambda関数(Python)のzipファイル作成シェルスクリプト(Poetry管理プロジェクト)

Poetryで管理しているPythonで書いたAWS Lambdaの関数(外部ライブラリも使っている)を、zipにまとめるスクリプトを書いたので備忘録として残しておく。

フォルダ構成

アプローチ

Poetryで管理している場合、 .venv/lib/python*/site-packages/ に poetry add したライブラリがインストールされるので、site-pckages 下のファイルと、自分で書いたソースコードをガッチャンコしたフォルダを作って、それをzipコマンドでzipにまとめるというやり方をした。

ただし .venv フォルダをプロジェクトディレクトリ内に作成するには、

poetry config virtualenvs.in-project true

で、Poetryの仮想環境をプロジェクトディレクトリ内に作成するよう設定が必要なので注意。

ワイはDockerfileに

RUN poetry config virtualenvs.in-project true

って書いてる。

スクリプト

build.sh の全文

#!/bin/sh

cd `dirname $0`
cd ../

rm -rf ./dist/
mkdir -p ./dist/package/

cp --recursive ./.venv/lib/python*/site-packages/. ./dist/package/
cp --recursive ./src/. ./dist/package/

cd ./dist/package/
zip -r ../package ./

cd ../
rm -rf ./package/

ポイント

srcディレクトリと.venv/lib/python*/site-packages/ を dist/package/ ディレクトリにコピーしている。

cp --recursive ./.venv/lib/python*/site-packages/. ./dist/package/
cp --recursive ./src/. ./dist/package/

zipを作成した後

zipを作成した後は、マネジメントコンソールからアップロードするなり、aws cli からアップロードするなり好きにしましょうという感じ。

ワイは以下のようなシェルスクリプト(deploy.shに該当)を書いて、S3にアップロードしてからLambda関数を更新するようにしてみた。

#!/bin/sh

cd `dirname $0`
cd ../

aws s3 cp ./dist/package.zip s3://<Amazon S3バケット名>/<S3キー>

aws lambda update-function-code \
    --function-name <AWS Lambda関数名> \
    --s3-bucket <バケット名> \
    --s3-key <S3キー>