📑
.tfstateファイルをGitHubリポジトリ内で管理する方法メモ
はじめに
この方法での.tfstateファイルの管理は推奨できません
ベストプラクティスを知りたい方は「terraform tfstate s3」でググって下さい
誰が嬉しい記事か?
クライアントがAWS使いたくない!GitHubだけで完結させたい!的な要望を上げてきた場合に嬉しいです
.tfstateファイルとは?
以下参照
処理フロー
- GitHubリポジトリへのpushをトリガとし、GitHub Actionsを起動
- ランナー上でterraformを実行し、.tfstateファイルを出力
- .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