Poetryを使ったPythonプロジェクトをGitHub Actionsを用いてAWS Lambdaへのデプロイする仕組みについて考える
概要
GitHubで管理しているPythonプロジェクトについて、AWS Lambda上で動作させたい時に、mainブランチへのpush等、リポジトリへの特定のアクションをトリガーに自動でAWS Lambdaに自動でデプロイされるという安全で楽な仕組みが欲しくなる。
このような場合、GitHubが提供しているCI/CDプラットフォームであるGitHub Actionsを用いた自動デプロイの仕組みを作るのが手段の1つとなるが、
AWS Lambda上でPythonで記述されたコードを実行させるには、使用するパッケージを含めたファイル群をzipで固めたものをデプロイすることになる。
このとき、対象のPythonプロジェクトがPoetryを使用してパッケージの管理を行われていた場合に、GitHub Actionsを動かすyamlファイルをどのように記述するのかについて検討を行った。
結論
分かる人はGitHub Actionsの動作について記述したyamlファイルを読んだ方が早いと思うので、先にファイルの中身を見せ、この後に解説を載せる。
.github/workflows/deploy.yml
name: Lambda Deploy on: push: branches: - main jobs: lambda-deploy: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Python uses: actions/setup-python@v2 with: python-version: '3.x.x' - name: Install Poetry run: | curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - echo "$HOME/.poetry/bin" >> $GITHUB_PATH - name: Generate Deployment Targets run: | poetry export -f requirements.txt --output requirements.txt poetry run pip install -t ./ -r requirements.txt zip -r artifact.zip ./* - name: Deploy env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: us-east-1 run: | pip3 install awscli aws lambda update-function-code --function-name your-lambda-function-name --zip-file fileb://artifact.zip --publish
解説
前提: poetry.lockがgitの管理対象である。
`poetry export -f requirements.txt --output requirements.txt` から、プロジェクトで利用しているPythonパッケージについてのパッケージのバージョンを含めた情報をpipで利用できるrequirements.txt形式に出力する。
そのrequirements.txtをもとに、ダウンロードしてきたパッケージと一緒にzipで固め、AWS Lambdaにデプロイを行う。
`poetry build` を行い出力された dist/*.whl ファイルをもとに必要なPythonパッケージをダウンロードする方法も調べると出てくるが、この方法ではpip installを行った時に、取得するパッケージのバージョンが固まらない。一方、`poetry export` を使い出力されたrequirements.txtを用いる手法では、requirements.txtの内容はpoetry.lockに記載されているパッケージとそのバージョンに固まるので、`pip install` を行った時に取得するパッケージのバージョンをコントロールすることが可能となり、AWS Lambda上にデプロイされるパッケージのバージョンをローカルの開発環境と同じ状態にすることができる。
参考
- GammaLab | Github ActionsでAWS Lambdaにdeployする, https://gammalab.net/blog/lfj8xfqj6qdyg/
- Building Lambdas with Poetry — Chariot Solutions, https://chariotsolutions.com/blog/post/building-lambdas-with-poetry/
- GitHub Actionsのドキュメント - GitHub Docs, https://docs.github.com/ja/actions
- Poetry - Python dependency management and packaging made easy, https://python-poetry.org/
コメント
コメントを投稿