😄
Github ActionsでTerraformを実行するメモ
Github ActionsでTerraformを実行するメモ
Github ActionsでTerraformを実行する方法が分かったのでメモ。
前提条件
- AWSとGithub間でOIDCを使用して認証ができている
手順
1. .tfstate用バケットを作成
.tfstate用バケットを作成した後、providerを編集する。
backendをs3と指定する。直接記述するか最初は空ブロックにしておいて後からコマンド実行時に動的に設定することもできる。terraformで管理してしまうと削除対象に入ってしまうのでGUIから作るのがベスト
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
// 直接指定
backend "s3" {
bucket = バケット名
key = "path/terraform.tfstate" // terraform.tfstateを忘れずに記述
region = "ap-northeast-1"
}
// 空ブロック
backend "s3" {}
}
- backendの設定を反映させる
このとき空ブロックの場合、バケット名とキー名を聞かれるので作成したバケットとキー名を入力する。
terraform init -migrate-state
- workflowファイルを作成してプッシュ
Githubの環境変数に以下を設定して
- ROLE_TO_ASSUMEは前提条件のOIDC設定時に作成したIAMロールのARN
- BUCKET_NAMEは作成した.tfstate用バケットの名前
terraform init時にs3バケットの各情報をオプションから渡す。
name: "Terraform CI/CD"
on:
workflow_dispatch:
inputs:
apply:
description: "Terraform applyの確認"
required: true
type: boolean
default: false
env:
AWS_REGION: 'ap-northeast-1'
ROLE_TO_ASSUME: ${{ secrets.AWS_ROLE_ARN }}
BUCKET_NAME: ${{ secrets.S3_BUCKET }}
permissions:
id-token: write
contents: read
jobs:
terraform:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./dev // 実行したいmain.tfがあるフォルダを指定する。
steps:
- uses: actions/checkout@v3
- uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ env.AWS_REGION }}
role-to-assume: ${{ env.ROLE_TO_ASSUME }}
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Terraform init
run: |
terraform init \
-migrate-state \
-backend-config="bucket=${{ env.BUCKET_NAME }}" \
-backend-config="key=terraform.tfstate" \
-backend-config="region=ap-northeast-1"
- name: Terraform fmt
run: |
terraform fmt -check
- name: Terraform validate
run: |
terraform validate
- name: Terraform plan
run: |
terraform plan -out=tfplan
- name: Terraform apply
if: ${{ inputs.apply == true }}
run: |
terraform apply -auto-approve
最後に
間違っていることがあれば、コメントに書いていただけると幸いです。
よろしくお願いいたします。
Discussion
間違ってはいないけど setup-terraform は v3 を使うのがいいと思うよ。
GitHub Actions のワークフローでチェックなしの apply の auto-approve は気をつけないと危ないかも。
おまけ https://qiita.com/raki/items/9a020c02759fede05157
コメントありがとうございます。バージョンとapplyのオプションについて調べた後、修正しました。
ご指摘してくださりありがとうございます。以後気を付けます。
おっと。-auto-approve なしの apply を投げると、このままでは変更があった場合に yes の入力待ちになって、github actions では後から値の入力ができないので困ったことになるよ。
あと
aws-actions/configure-aws-credentials
も去年 master から main になったので、かなり古いのが使われることになるはず。今は v4.0.2 が最新らしいので @v4 とかにしておかないと。コメントありがとうございます。やっぱりrakiさんの記事のようにworkflow_dispatch、inputsを使用して確認した時のみapplyを実行するほうが安全そうですね。terraformのCI/CD構築やベストプラクティスについて勉強してきます。