💐

【AWS】CodeBuildでterraformにCICDを組む

2023/08/08に公開

概要

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

https://github.com/zukizukizuki/aws-terraform/tree/ed769063d38704102655cc80c2578391255a9889

dryrun用のCodeBuildの設定

CodeBuildの作成

  1. CodeBuildに移動し、"ビルドプロジェクトを作成する"を押下

  2. 以下の設定で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ファイルを参照するので読取権限を付与する必要がある。

  1. IAMへ移動し、IAMリソース の ロールを選択
  2. CodeBuildに紐づいてるロール名を押下
  3. "許可を追加" → "ポリシーをアタッチ"を押下
  4. AmazonS3ReadOnlyAccess を選択し、"許可を追加"を押下

CIの動作確認

なんでもいいのでPRを作ってCIが動く事を確認する

apply用のCodeBuildの設定

  1. CodeBuildに移動し、"ビルドプロジェクトを作成する"を押下
  2. 以下の設定で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が動く事を確認する

GitHubで編集を提案

Discussion