🚂
Pull request駆動をAWS Codeシリーズで実現するTerraformテンプレート
🎃 Deprecated
よりシンプル化した最新版を公開しました!そちらをご覧ください
どんな記事?
- AWS Codeシリーズで、Pull request駆動を実現するサンプルをご紹介
- デーモン的なLamndaですべてのPull requestを監視して、CodeBuildの起動につなげる
- Terraformで一撃デプロイできる状態で、GitHubに公開しています
作ったもの
@nekoze_climberさんが、公開されている CodeCommit × CodeBuildでプルリクエスト発行時に自動でCIが走るようにする を言語変更&機能拡張したTerraformテンプレートです。
元記事の TypeScript
× Serverless Framework
の組み合わせを、Python
× Terraform
に変えて、
- 通知機能の追加
- Pull requestへのコメント通知
- CodeStar Notificationsを使ったSNSへの通知
- 対象から任意のリポジトリを除外する機能の追加
- EventBridgeの発火タイミングの調整
- IAM権限の最小権限化
をしています。
ワンコマンドでデプロイできるものをGitHubに公開しているため、ご参考ください。
アーキテクチャ
基本部分は、元記事と同様で、3種類のデーモンLambdaで構成されています。
Lambda | 駆動タイミング | なにをする |
---|---|---|
creater | Pull request発行時 | CodeBuildプロジェクトの作成、起動 |
runner | ソースブランチの変更時 | ビルド実行 |
sweeper | Pull requestのクローズ時 | CodeBuildプロジェクトの削除 |
さらに、追加で
- 除外設定用のDynamoDB
- 通知用のSNS
を配置しました。
Code structure
terraform
├── env
│ └── example
│ ├── Makefile
│ ├── main.tf
│ ├── prepare_lambda_package.sh
│ └── provider.tf
└── module
├── creater
│ ├── buildspec.yml
│ ├── data.tf
│ ├── event.tf
│ ├── iam_codebuild.tf
│ ├── iam_lambda_creater.tf
│ ├── lambda.tf
│ ├── outputs.tf
│ ├── s3.tf
│ ├── src
│ │ ├── Pipfile
│ │ ├── Pipfile.lock
│ │ └── handler.py
│ ├── upload
│ │ ├── lambda.zip
│ │ └── prepare
│ └── variables.tf
├── exclusion_table
│ ├── dynamodb.tf
│ └── outputs.tf
├── notification
│ ├── data.tf
│ ├── outputs.tf
│ └── sns.tf
├── runner
│ ├── data.tf
│ ├── event.tf
│ ├── iam.tf
│ ├── lambda.tf
│ ├── outputs.tf
│ ├── src
│ │ ├── Pipfile
│ │ ├── Pipfile.lock
│ │ └── handler.py
│ ├── upload
│ │ ├── lambda.zip
│ │ └── prepare
│ └── variables.tf
└── sweeper
├── data.tf
├── event.tf
├── iam.tf
├── lambda.tf
├── outputs.tf
├── src
│ ├── Pipfile
│ ├── Pipfile.lock
│ └── handler.py
├── upload
│ ├── lambda.zip
│ └── prepare
└── variables.tf
一般的な、moduleを使ったTerraform構成です。
1点特殊なのが、 デプロイ用のコマンド。従来のterraform
コマンド実行を make
コマンドでラップするようにしています。
$ make terraform-init
$ make terraform-plan
$ make terraform-apply
$ make terraform-apply-auto-approve
こんな作りにしている理由は、Lambdaへのデプロイ用のPythonパッケージ(含む3rd partyライブラリ)を、デプロイ前にシェルスクリプトで生成する必要があるためです。詳細は、Makefile
を参照ください。
すぐに使いたい場合の変更箇所
terraform/module/creater/buildspec.yml
-
terraform/module/creater/src/handler.py
内のCodeBuildの設定値(ベースイメージやspecを変えたいとき)
を変えていただくのみでOKです。
あとは、
$ cd ./terraform/env/example
$ make terraform-init
$ make terraform-apply-auto-approve
ですぐ使い始められます👍
Discussion