🚂

Pull request駆動をAWS Codeシリーズで実現するTerraformテンプレート

2022/01/06に公開

🎃 Deprecated

よりシンプル化した最新版を公開しました!そちらをご覧ください

https://zenn.dev/jimon/articles/df9523a2507e99


どんな記事?

  • 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に公開しているため、ご参考ください。

https://github.com/Jimon-s/terraform-example-codebuild-triggered-by-pull-request

アーキテクチャ

Architecture

基本部分は、元記事と同様で、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

ですぐ使い始められます👍

https://github.com/Jimon-s/terraform-example-codebuild-triggered-by-pull-request

Discussion