AWS Lambda関数の本番デプロイについて検討したCI/CDをGitHub Actionsで実現する。
実現したいフロー
- masterにプルリクがマージされると起動する。
- 指定のディレクトリの更新でのみ起動する。
- AWSのリソースアクセス権限を取得する(できればOpenIdConnectを用いて)。
- 自動テストを走らせ、もしErrorが出たら終了。
- 自動で行うべきテストは、1)ユニットテスト 2)Flake8によるlintの2つ。
- アップロードすべきファイルをZipで圧縮し、S3にPUTする。
- Lambda関数にアップロードする。関数バージョンも同時に作成する。
- エイリアスをLATESTに更新する。
- 結果を通知する。
ex. 失敗した場合、失敗を通知する。
通知は何で行う?
業務用想定ということで、Slackへ通知する。
メールにも行えるらしいが、メールに投げ出すと受信するのが嫌になるほどメッセージが飛ぶので、避けられるなら避けたほうがいいんじゃないかと。
関数のアップロードにTerraformは使わない?
使わない。違うリポジトリを別々に同期させないといけないのは誤作動が恐ろしい。しかもTerraformは副作用的なリソース変更を実行してしまうリスクもある。そのためアプリケーションのデプロイには関係させない方向。
Lambda関数の関数バージョンはなぜ設定している?
いざというときロールバックするため。エイリアスを一つ前の関数バージョンに設定することで旧来に戻せることを狙っている。うまくすればB/Gデプロイも可能そうだが、今のところそこまで実行する予定はない。基本的に最新版を正とする方針のため、エイリアスは緊急時を除いて$LATEST運用。
GitHub Actions
事前準備: Slack
Slackにメッセージを飛ばすため、SlackのWEBHOOK URLを取得しておく。