見出し画像

GitHub ActionsによるTerraformの自動化

こんにちは。NOBORIの村田です。
医療機関向けのクラウドサービスの設計開発を行っています。

その中でGitHub ActionsとTerraformを使ってインフラ構築の自動化を行ったためその紹介を行いたいと思います。

※過去にTerraformに関する記事も書いたので、よければそちらも参照下さい

やりたいこと

・Pull Requestの作成時にterraform fmtを実行し、差分があれば失敗させる
・Pull Requestの作成時にterraform planを実行し、コメントに結果を表示する
・Pull Requestをマージした際にterraform applyを実行し、変更を反映する

Pull Request作成時のワークフロー

・PR作成時にGitHub Actionsを実行する

name: plan

on:
  pull_request:
    branches: [master]

・Jobの実行環境の設定

jobs:
  terraform:
   name: Terraform Plan
   runs-on: ubuntu-latest

   defaults:
     run:
       shell: bash
       
   steps:
     - name: Checkout
       uses: actions/checkout@v2

・AWSのアクセスキー等を設定

     - name: configure AWS credentials
       uses: aws-actions/configure-aws-credentials@v1
       with:
         aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
         aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
         aws-region: ap-northeast-1

・terraformコマンドをインストール

     - name: Setup Terraform
       uses: hashicorp/setup-terraform@v1
       with:
         terraform_version: 1.0.0

・terraform fmt/validでテンプレートファイルのフォーマットチェック及びvalidationを行う
・チェックに失敗した場合、Jobをエラーにする

      - name: Terraform Format
        run: terraform fmt -recursive -check

      - name: Terraform Validation
        working-directory: ./
        run: |
          terraform init
          terraform workspace select stg
          terraform validate
          terraform plan -no-color

・terraform planを実行
・-no-colorを指定しないと、後続のstepでPRにコメントする際に表示がおかしくなる

      - name: Terraform Plan
        id: plan
        working-directory: ./
        run: |
          terraform plan -no-color

・terraform planの結果をPRのコメントを投稿する

      - name: Comment
        uses: actions/github-script@v3.0.0
        env:
          PLAN: "terraform\n${{ steps.plan.outputs.stdout }}"
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const output = `
            #### Terraform Plan: \`${{ steps.plan.outcome }}\`

            <details><summary>Show Plan</summary>

            \`\`\`${process.env.PLAN}\`\`\`

            </details>`;

            github.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: output
            })

Pull Requestをマージした際のワークフロー

・PRをマージした時にワークフローを実行する

name: apply-staging
on:
  pull_request:
    branches: [master]
    types: [closed]

jobs:
  terraform:
    name: Terraform Apply
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true

    defaults:
      run:
        shell: bash
    steps:
      - name: Checkout
        uses: actions/checkout@v2

・AWSのアクセスキー等の設定、terraformコマンドのインストールはplanの時と同様に行います

     - name: configure AWS credentials
       uses: aws-actions/configure-aws-credentials@v1
       with:
         aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
         aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
         aws-region: ap-northeast-1

     - name: Setup Terraform
       uses: hashicorp/setup-terraform@v1
       with:
         terraform_version: 1.0.0

・terraform applyを実行する

      - name: Terraform Apply
        id: apply
        working-directory: ./
        run: |
          terraform init
          terraform workspace select stg
          terraform apply -auto-approve

おわりに

以上でGithub Actionsの設定は完了です。
aws-actions/configure-aws-credentialやhashicorp/setup-terraformを使うことで簡単にAWS環境の構築を自動化出来ました。

これからも、インフラ構築やアプリケーションのビルドについてGithub Actionsで自動化していきたいと思います。