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上にデプロイされるパッケージのバージョンをローカルの開発環境と同じ状態にすることができる。

参考

コメント

このブログの人気の投稿

壁に穴をあけずに絵を飾りたかった話

QNAPのTS-453Dを買った話

PCが余っていたので仮想通貨マイニングを始めてみた話