📑

.tfstateファイルをGitHubリポジトリ内で管理する方法メモ

2024/05/11に公開

はじめに

この方法での.tfstateファイルの管理は推奨できません

ベストプラクティスを知りたい方は「terraform tfstate s3」でググって下さい

誰が嬉しい記事か?

クライアントがAWS使いたくない!GitHubだけで完結させたい!的な要望を上げてきた場合に嬉しいです

.tfstateファイルとは?

以下参照

State | Terraform

処理フロー

  1. GitHubリポジトリへのpushをトリガとし、GitHub Actionsを起動
  2. ランナー上でterraformを実行し、.tfstateファイルを出力
  3. .tfstateファイルをGitHubリポジトリへコミット

実際の作業

1. 作業リポジトリ作成

割愛

2. GitHub Action実行用.yml作成

terraform.yml(名前は何でもよい)

name: 'Terraform'

on:
  push:
    branches: [ "main" ]
    paths:
      - '.github/workflows/terraform.yml'

permissions:
  contents: write

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    environment: production

    defaults:
      run:
        shell: bash

    steps:
    - name: Checkout
      uses: actions/checkout@v4

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

    - name: Terraform Init
      run: terraform init

    - name: Terraform Format
      run: terraform fmt -check

    - name: Terraform Plan
      run: terraform plan -input=false -out=tfplan

    - name: Terraform Apply
      run: terraform apply -auto-approve tfplan

    - name: Generate token
      id: generate_token
      uses: actions/create-github-app-token@v1
      with:
        app-id: ${{ secrets.APP_ID }}
        private_key: ${{ secrets.PRIVATE_KEY }}

    - name: Commit tfstate file
      run: |
        git config --global user.email ${{ secrets.USER_MAIL }}
        git config --global user.name ${{ secrets.USER_NAME }}
        git add terraform.tfstate
        git commit -m "Update tfstate file"
        git remote add origin_with_app https://github.com/${{ secrets.USER_NAME }}/${{ secrets.USER_REPOS }}
        git push origin_with_app main
      env:
        TOKEN: ${{ steps.generate_token.outputs.token }}

今回はランナーの中にコミット処理を入れているので、トリガを絞ってあげないと(試してないけど)無限走行しそう

on:
  push:
    branches: [ "main" ]
    paths:
      - '.github/workflows/terraform.yml'

GitHub AppでAPP IDと秘密鍵を用意し、以下ソースでアクセストークンを発行している

    - name: Generate token
      id: generate_token
      uses: actions/create-github-app-token@v1
      with:
        app-id: ${{ secrets.APP_ID }}
        private_key: ${{ secrets.PRIVATE_KEY }}

3. terraform側の準備

.tfstateファイルだけ吐いてくれればいいので、特に何も構築しない

main.tf(こちらも名前は何でもよい)

terraform {
  required_providers {
    
  }
}

4. 動作確認方法

ランナーがエラー吐かず、リポジトリ内にterraform.tfstateがコミットされているのを確認すればok

Discussion