🛺

ローカルのtfstateをs3へ移行し、Github Actionsから利用する

2023/07/07に公開

はじめに

ローカルでTerraformを使ってAWSのリソースを管理していましたが、
GitHub Actionsのワークフローからも同様の操作が行えるように試したのでメモします。

s3にtfstateを移行し、そのtfstateをワークフローから使用するイメージです。

イメージ図

この記事で説明すること

  • terraformのbackendをs3とし、ローカルのtfstateをs3へ移行する方法
  • GitHub Actionsで同じtfstateを使用する方法

前提

検証

ローカルからs3にtfstate移行

s3を作成し、ローカルのtfstateを移行します。

s3バケット作成

tfstateを格納するs3バケットを作成します。

$ aws s3 mb s3://<bucket_name>

バックエンドをs3に変更

terraformのbackendの設定を明示的にs3と設定します。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.65.0"
    }
  }
+  backend "s3" {
+    bucket = "<作成したバケット>"
+    key    = "<パス>"
+    region = "ap-northeast-1"
+  }
}

バックエンド設定をローカルからs3に更新

現在の状態を維持したいので、-migrate-stateオプションを使用します

$ terraform init -migrate-state

https://developer.hashicorp.com/terraform/cli/commands/init#backend-initialization

s3にtfstateがあることを確認

できれば無事にterraformのbackendがs3となっています。

$ aws s3 ls s3://<bucket_name>
2023-07-05 12:33:54      29450 terraform.tfstate

tfファイル、workflowをpush

terraformを動かすworkflowと、ローカルで編集していたtfファイルをGitHubリポジトリへpushします。

ディレクトリ構成

はこんな感じです。

.
├── .github
│   └── workflows
│       └── terraform.yaml
└── terraform
    └── main.tf

push

terraformを動かすworkflow、tfファイルをpushします。
ワークフローはこんな感じです。

terraform.yaml
terraform.yaml
name: terraform

on:
  workflow_dispatch:

env:
  AWS_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}

permissions:  
  id-token: write
  contents: read

jobs:
  test:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: terraform

    steps:
      - name: configure aws credential
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1

      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
        with:
          terraform_version: 1.4.6

      - name: Terraform fmt
        id: fmt
        run: terraform fmt
        continue-on-error: true
  
      - name: Terraform Init
        id: init
        run: terraform init
  
      - name: Terraform Validate
        id: validate
        run: terraform validate
  
      - name: Terraform Plan
        id: plan
        run: terraform plan
        continue-on-error: true

working-directoryでtfファイルの格納場所を忘れずに指定しましょう。
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#defaultsrun

ワークフロー用IAMロール作成

#ロール作成
aws iam create-role \
    --role-name GitHubActionsRole \
    --assume-role-policy-document file://trust.json

#ポリシーをアタッチ
aws iam attach-role-policy \
    --role-name GitHubActionsRole \
    --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

trust.jsonの内容はこちらを参照してください。
リポジトリのアクセス制限などを行うのが望ましいです。
https://zenn.dev/not75743/articles/cc1139772b7970#iamロール作成
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html

workflow実行、動作確認

run workflowを選択し

No ChangesとなればOKです!
ローカルと同じように動作しました。

おわりに

ローカルとGitHub Actionsの動作の違いに注意ですね。
(working-directoryを適切に設定しないとNo configuration filesとなる等)

何はともあれ移行を試せてよかったです。
最初はスピード重視でローカルで検証→一段落ついたらGitHib Actionsでも動作確認する
というパターンで役に立つと思います。

参考

https://zenn.dev/not75743/articles/7a68064286c95f
https://blog.g-gen.co.jp/entry/using-terraform-via-github-actions

Discussion