🛺
ローカルのtfstateをs3へ移行し、Github Actionsから利用する
はじめに
ローカルでTerraformを使ってAWSのリソースを管理していましたが、
GitHub Actionsのワークフローからも同様の操作が行えるように試したのでメモします。
s3にtfstateを移行し、そのtfstateをワークフローから使用するイメージです。
イメージ図
この記事で説明すること
- terraformのbackendをs3とし、ローカルのtfstateをs3へ移行する方法
- GitHub Actionsで同じtfstateを使用する方法
前提
- Terraform 1.4.6
- GitHub Actionsが使用するOIDCプロバイダーの設定が済んでいる
検証
ローカルから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
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ファイルの格納場所を忘れずに指定しましょう。
ワークフロー用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
の内容はこちらを参照してください。
リポジトリのアクセス制限などを行うのが望ましいです。
workflow実行、動作確認
run workflow
を選択し
No Changes
となればOKです!
ローカルと同じように動作しました。
おわりに
ローカルとGitHub Actionsの動作の違いに注意ですね。
(working-directory
を適切に設定しないとNo configuration files
となる等)
何はともあれ移行を試せてよかったです。
最初はスピード重視でローカルで検証→一段落ついたらGitHib Actionsでも動作確認する
というパターンで役に立つと思います。
参考
Discussion