Closed8

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

not75743not75743

方針

  • ローカルのtfstateをs3へ移行
  • ローカルのtfファイルをGithubへpush
  • workflowを起動、terraform planを実行し、No Changesであることを確認する
not75743not75743

ローカルからs3にtfstate移行

s3バケット作成

$ aws s3 mb s3://<bucket_name>

バックエンドを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

s3にtfstateがあることを確認

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

tfファイル、workflowをpush

ディレクトリ構成はこんな感じ

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

これをpushします。
ワークフローはworkflow_dispatchで起動します。

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
        with:
          submodules: recursive 
          fetch-depth: 0

      - 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
not75743not75743

workflow実行

OIDC用ロール作成

アクセスキーなしでAWSサービスを操作するため、OIDC用の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ロール作成

動作確認

run workflowを選択し

No ChangesとなればOK

このスクラップは2023/07/07にクローズされました