GitHub ActionsでCICD化
前回の記事「②S3 ⇨ Lambda ⇨ S3でテキストを大文字変換する構成を作ってみた(リモートバックエンドへ移行)」の続き
※すでに一度検証で設定が終わっている部分があるため設定前の画面と異なります。
やりたいこと
ブランチ[main,dev,cicd]
- cicdにpush
- devにプルリクエストからマージ
- devからmainにマージ
- terraform destroyを実行
1. cicd ブランチに push
│
▼
2. cicd → dev のプルリクエストを作成 → Terraform plan を自動実行
│
└─> プルリクエスト をマージ → dev ブランチが更新
│
▼
3. dev ブランチから main ブランチへマージ(main ブランチ更新に伴い、Terraform Apply が自動実行)
│
▼
4. Terraform destroy
全体の流れ
- ルートディレクトリに./github/workflows/terraform.ymlを作成
- Environmentsを設定
- cicdブランチにpush
- cicd→devにプルリクエスト(Terraform plan実行)
- devにマージ
- dev→mainにマージ(Terraform apply実行)
- Terraform destroyを実行
1. ルートディレクトリに./github/workflows/terraform.ymlを作成
ファイル構成
.
├── backend.tf
├── bootstrap
│ ├── state_backend.tf
│ └── terraform.tfstate
├── .github #追加
│ └── workflows #追加
│ └── terraform.yml #追加
├── main.tf
├── modules
│ ├── lambda
│ │ ├── function.zip
│ │ ├── lambda_function.py
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── s3
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── outputs.tf
├── s3⇨lambda⇨s3.zip
├── text.txt
└── variables.tf
terraform.yml
name: Terraform CI/CD
permissions:
contents: read # checkout などでリポジトリを読む
pull-requests: write # PRにコメントするために必要
on:
pull_request:
branches: [dev] # devブランチへのプルリクエスト時にトリガー
push:
branches: [main] # mainブランチへのプッシュ時にトリガー
workflow_dispatch: # 手動実行を許可
inputs:
destroy:
description: "本当に destroy しますか? ('yes'と入力すると実行されます)"
required: true
default: "no"
type: choice
options:
- "no"
- "yes"
env:
TF_WORKING_DIR: "./" # Terraformの作業ディレクトリ
TF_VERSION: "1.5.7" # 使用するTerraformのバージョン
AWS_REGION: "ap-northeast-1" # AWSリージョン
jobs:
terraform-plan:
name: "🗺️ Terraform Plan"
runs-on: ubuntu-latest
# devブランチへのプルリクエスト時のみ実行
if: github.event_name == 'pull_request' && github.base_ref == 'dev'
environment: production # 環境を指定 (GitHub Environmentsを使用)
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # AWSアクセスキーID
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # AWSシークレットアクセスキー
aws-region: ${{ env.AWS_REGION }}
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Terraform Init (with backend-config)
working-directory: ${{ env.TF_WORKING_DIR }}
run: |
# S3とDynamoDBを状態管理のバックエンドとして初期化
terraform init -reconfigure \
-backend-config="bucket=${{ secrets.TF_BACKEND_BUCKET }}" \
-backend-config="key=${{ secrets.TF_BACKEND_KEY }}" \
-backend-config="region=${{ env.AWS_REGION }}" \
-backend-config="dynamodb_table=${{ secrets.TF_DYNAMODB_TABLE }}"
- name: Terraform Plan
id: plan # ステップID
working-directory: ${{ env.TF_WORKING_DIR }}
# プラン結果をファイルに出力(色なし)
run: terraform plan -no-color -input=false > plan.txt
- name: Comment PR with Plan
uses: marocchino/sticky-pull-request-comment@v2
with:
path: plan.txt # 出力されたプランファイルをPRにコメント
recreate: true # コメントを毎回再作成
terraform-apply:
name: "🚀 Terraform Apply"
runs-on: ubuntu-latest
# mainブランチへのプッシュ時のみ実行 (needs: terraform-plan を削除)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
environment: production # 環境を指定
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # ここにSecretsを追加
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # ここにSecretsを追加
aws-region: ${{ env.AWS_REGION }}
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Terraform Init (with backend-config)
working-directory: ${{ env.TF_WORKING_DIR }}
run: |
terraform init -reconfigure \
-backend-config="bucket=${{ secrets.TF_BACKEND_BUCKET }}" \
-backend-config="key=${{ secrets.TF_BACKEND_KEY }}" \
-backend-config="region=${{ env.AWS_REGION }}" \
-backend-config="dynamodb_table=${{ secrets.TF_DYNAMODB_TABLE }}"
- name: Terraform Apply
working-directory: ${{ env.TF_WORKING_DIR }}
run: terraform apply -auto-approve # 自動承認でTerraformを適用
terraform-destroy:
name: "💣 Terraform Destroy"
runs-on: ubuntu-latest
# workflow_dispatchでdestroy入力が'yes'の場合のみ実行
if: github.event_name == 'workflow_dispatch' && github.event.inputs.destroy == 'yes'
environment: production # 環境を指定
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # ここにSecretsを追加
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # ここにSecretsを追加
aws-region: ${{ env.AWS_REGION }}
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Terraform Init (with backend-config)
working-directory: ${{ env.TF_WORKING_DIR }}
run: |
terraform init -reconfigure \
-backend-config="bucket=${{ secrets.TF_BACKEND_BUCKET }}" \
-backend-config="key=${{ secrets.TF_BACKEND_KEY }}" \
-backend-config="region=${{ env.AWS_REGION }}" \
-backend-config="dynamodb_table=${{ secrets.TF_DYNAMODB_TABLE }}"
- name: Terraform Destroy
working-directory: ${{ env.TF_WORKING_DIR }}
run: terraform destroy -auto-approve # 自動承認でリソースを破棄
2. Environmentsを設定
SettingsのSecrets and variablesを選択します。

New repository secretsからAWS_ACCESS_KEYなどを作成します。


TF_BACKEND_BUCKETなどは、前回に相当する部分です。
前回記事
# 〇〇〇〇はterraform applyしたときの output で確認
terraform init \
-reconfigure \
-backend-config="bucket=terraform-state-〇〇〇〇" \
-backend-config="key=global/s3/terraform.tfstate" \
-backend-config="region=ap-northeast-1" \
-backend-config="dynamodb_table=terraform-lock-〇〇〇〇"
TF_BACKEND_BUCKET=terraform-state-〇〇〇〇
TF_BACKEND_KEY=global/s3/terraform.tfstate
TF_DYNAMODB_TABLE=terraform-lock-〇〇〇〇
reviewrsにご自身を追加して、Save protection rulesをクリックします。

3. cicdブランチにpush
git switch cicd
git add .
git commit -m 'コメント'
git push -u origin cicd
※今回はs3バケットの名前を変更しました。
4. cicd→devにプルリクエスト(Terraform plan実行)
今回は、s3バケットの名前を変更してpushしました(variables.tf)

Create Pull Requestを押すと、Actionsが動き始めます。
以下の赤枠部分をクリックします。

productionにチェックをいれ、Approve and deployをクリックします。

Terraform planの内容がPull Request画面に出力されます。
5. devにマージ
devにマージする部分は割愛します。
6. dev→mainにマージ(Terraform apply実行)
次にdevからmainにプルリクエスト,マージします。
そうするとActionsが動き始めます。
以下、赤枠をクリックします。

Review deploymentsをクリックして、productionにチェック、Approve and deployをクリックします。


そうするとTerraform applyが始まり、無事リソースが作成されました。

7. Terraform destroyを実行
Actions内のRun workflowをクリックします。
本当にdestroyしますかとあるので、yesにしてRun workflowをクリックします。




