【AWS】CodeBuildでterraformにCICDを組む
概要
CICDを組むとみんな(CICD管理者を除く)幸せになれるのでAWSのサービスを使って先日作ったaws-terraformにCICDを組む
(本当はgitub actionsで組みたかったけどこのissuesが解決するまで待ち)
CodeBuildとは?
設定ファイル(buildspec.yml)で指定されたビルドコマンドで色々してくれる
今回はterraform planとterraform applyを実行するshell scriptを用意してそれを蹴るために使う
余談ですが
CodePipelineというgithubの更新と連動してCodeBuildやCodeDeployを呼び出してくれるサービスと
CodeDeployというEC2、ECS、Fargate等にデプロイしてくれるサービスと
CodeCommitというAWS版githubみたいなサービス
があるけどCodeBuild単体でgithubと連携出来るのと今回はEC2等にデプロイを行わないのと普段githubばかり使っているのでで今回これらは使わない
やる事
以前作ったaws-terraformに以下の図のような構成で
・githubのmainブランチへのPR作成、変更が行われたら自動terraform Plan
・githubのmainブランチにpushされたら自動terraform apply
を実施出来る様にします。
※aws-terraformを作成した記事はこちら
githubにコードを準備
codebuild/buildspec-dryrun.yml の作成
codebuildフォルダを作成し、buildspec-dryrun.ymlを作成する。
version: 0.2
phases:
install:
commands:
- chmod +x ${CODEBUILD_SRC_DIR}/scripts/install.sh
- ${CODEBUILD_SRC_DIR}/scripts/install.sh
build:
commands:
- chmod +x ${CODEBUILD_SRC_DIR}/scripts/dryrun.sh
- ${CODEBUILD_SRC_DIR}/scripts/dryrun.sh
参考 : https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-github-pull-request.html
scripts/install.shの作成
scriptsフォルダを作成し、install.shを作成する。
#!/bin/sh
set -ex
TERRAFORM_VERSION="1.5.4"
wget -q "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
unzip -d /usr/local/bin "terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
scripts/dryrun.shの作成
#!/bin/sh
set -ex
terraform init -input=false -no-color -backend-config="key=terraform.tfstate" -backend-config="bucket=zukkie-terraform-state"
terraform plan -no-color
codebuild/buildspec-apply.yml の作成
version: 0.2
phases:
install:
commands:
- chmod +x ${CODEBUILD_SRC_DIR}/scripts/install.sh
- ${CODEBUILD_SRC_DIR}/scripts/install.sh
build:
commands:
- chmod +x ${CODEBUILD_SRC_DIR}/scripts/apply.sh
- ${CODEBUILD_SRC_DIR}/scripts/apply.sh
scripts/apply.shの作成
#!/bin/sh
set -ex
terraform init -input=false -no-color -backend-config="key=terraform.tfstate" -backend-config="bucket=zukkie-terraform-state"
terraform apply -auto-approve -no-color
全て作成済みのgithub
dryrun用のCodeBuildの設定
CodeBuildの作成
-
CodeBuildに移動し、"ビルドプロジェクトを作成する"を押下
-
以下の設定でPlan用のCodeBuildを作成する。
・プロジェクト名 → 任意
・ソースプロバイダ → github(SSOでgithubに接続)
・リポジトリ → GitHub アカウントのリポジトリ
・GitHub リポジトリ → https://github.com/zukizukizuki/aws-terraform.git
・"コードの変更がこのレポジトリにプッシュされるたびに再構築する"にチェック
・"ウェブフックイベントフィルタグループ 1"に"PULL_REQUEST_CREATED" と"PULL_REQUEST_UPDATED"を選択
・オペレーティングシステム → Amazon linux 2
・ランタイム → Standard
・イメージ → 任意
・Buildspec名 → codebuild/buildspec-dryrun.yml
※他は全てデフォルト
ロールにS3読み取り権限を付与する
terraformコマンドを使う時にS3にある stateファイルを参照するので読取権限を付与する必要がある。
- IAMへ移動し、IAMリソース の ロールを選択
- CodeBuildに紐づいてるロール名を押下
- "許可を追加" → "ポリシーをアタッチ"を押下
- AmazonS3ReadOnlyAccess を選択し、"許可を追加"を押下
CIの動作確認
なんでもいいのでPRを作ってCIが動く事を確認する
apply用のCodeBuildの設定
- CodeBuildに移動し、"ビルドプロジェクトを作成する"を押下
- 以下の設定でPlan用のCodeBuildを作成する。
・プロジェクト名 → 任意
・ソースプロバイダ → github(SSOでgithubに接続)
・リポジトリ → GitHub アカウントのリポジトリ
・GitHub リポジトリ → https://github.com/zukizukizuki/aws-terraform.git
・"コードの変更がこのレポジトリにプッシュされるたびに再構築する"にチェック
・"ウェブフックイベントフィルタグループ 1"に"PULL_REQUEST_MERGED" を選択
・オペレーティングシステム → Amazon linux 2
・ランタイム → Standard
・イメージ → 任意
・Buildspec名 → codebuild/buildspec-apply.yml
※他は全てデフォルト
ロールにPowerUser権限を付与する
dryrun用のCodeBuildと同様に S3の読取権限を付与する必要があるが、
色んなリソースを作る事になるので今回はPowerUser権限を付与する。
※本来はもっと権限を絞るべきです。
CDの動作確認
なんでもいいのでPRをマージしてCDが動く事を確認する
Discussion