😄

Github ActionsでTerraformを実行するメモ

2024/12/02に公開
5

Github ActionsでTerraformを実行するメモ

Github ActionsでTerraformを実行する方法が分かったのでメモ。

前提条件

  • AWSとGithub間でOIDCを使用して認証ができている

手順

1. .tfstate用バケットを作成

.tfstate用バケットを作成した後、providerを編集する。
backendをs3と指定する。直接記述するか最初は空ブロックにしておいて後からコマンド実行時に動的に設定することもできる。terraformで管理してしまうと削除対象に入ってしまうのでGUIから作るのがベスト

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }

  // 直接指定
  backend "s3" {
    bucket = バケット名
    key    = "path/terraform.tfstate" // terraform.tfstateを忘れずに記述
    region = "ap-northeast-1"
  }

  // 空ブロック
  backend "s3" {}
}
  1. backendの設定を反映させる
    このとき空ブロックの場合、バケット名とキー名を聞かれるので作成したバケットとキー名を入力する。
terraform init -migrate-state
  1. workflowファイルを作成してプッシュ
    Githubの環境変数に以下を設定して
  • ROLE_TO_ASSUMEは前提条件のOIDC設定時に作成したIAMロールのARN
  • BUCKET_NAMEは作成した.tfstate用バケットの名前

terraform init時にs3バケットの各情報をオプションから渡す。

name: "Terraform CI/CD"

on: 
  workflow_dispatch:
    inputs:
      apply:
        description: "Terraform applyの確認"
        required: true
        type: boolean
        default: false

env:
  AWS_REGION: 'ap-northeast-1'
  ROLE_TO_ASSUME: ${{ secrets.AWS_ROLE_ARN }}
  BUCKET_NAME: ${{ secrets.S3_BUCKET }}

permissions:
  id-token: write
  contents: read

jobs:
  terraform:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./dev // 実行したいmain.tfがあるフォルダを指定する。

    steps:
      - uses: actions/checkout@v3
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ${{ env.AWS_REGION }}
          role-to-assume: ${{ env.ROLE_TO_ASSUME }}

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3

      - name: Terraform init
        run: |
          terraform init \
            -migrate-state \
            -backend-config="bucket=${{ env.BUCKET_NAME }}" \
            -backend-config="key=terraform.tfstate" \
            -backend-config="region=ap-northeast-1"
          
      - name: Terraform fmt
        run: |
          terraform fmt -check

      - name: Terraform validate
        run: |
          terraform validate

      - name: Terraform plan
        run: |
          terraform plan -out=tfplan

      - name: Terraform apply
        if: ${{ inputs.apply == true }}
        run: |
          terraform apply -auto-approve

最後に

間違っていることがあれば、コメントに書いていただけると幸いです。
よろしくお願いいたします。

GitHubで編集を提案

Discussion

rakiraki

間違ってはいないけど setup-terraform は v3 を使うのがいいと思うよ。
GitHub Actions のワークフローでチェックなしの apply の auto-approve は気をつけないと危ないかも。
おまけ https://qiita.com/raki/items/9a020c02759fede05157

御楯玄嶽御楯玄嶽

コメントありがとうございます。バージョンとapplyのオプションについて調べた後、修正しました。
ご指摘してくださりありがとうございます。以後気を付けます。

rakiraki

おっと。-auto-approve なしの apply を投げると、このままでは変更があった場合に yes の入力待ちになって、github actions では後から値の入力ができないので困ったことになるよ。

rakiraki

あと aws-actions/configure-aws-credentials も去年 master から main になったので、かなり古いのが使われることになるはず。今は v4.0.2 が最新らしいので @v4 とかにしておかないと。

御楯玄嶽御楯玄嶽

コメントありがとうございます。やっぱりrakiさんの記事のようにworkflow_dispatch、inputsを使用して確認した時のみapplyを実行するほうが安全そうですね。terraformのCI/CD構築やベストプラクティスについて勉強してきます。