0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

③S3 ⇨ Lambda ⇨ S3でテキストを大文字変換する構成を作ってみた(GitHub ActionsでCICD化)

Last updated at Posted at 2025-06-29

GitHub ActionsでCICD化

前回の記事「②S3 ⇨ Lambda ⇨ S3でテキストを大文字変換する構成を作ってみた(リモートバックエンドへ移行)」の続き

※すでに一度検証で設定が終わっている部分があるため設定前の画面と異なります。

やりたいこと

ブランチ[main,dev,cicd]

  1. cicdにpush
  2. devにプルリクエストからマージ
  3. devからmainにマージ
  4. terraform destroyを実行
1. cicd ブランチに push
   │
   ▼
2. cicd → dev のプルリクエストを作成 → Terraform plan を自動実行
   │
   └─> プルリクエスト をマージ  → dev ブランチが更新
         │
         ▼
3. dev ブランチから main ブランチへマージ(main ブランチ更新に伴い、Terraform Apply が自動実行)
   │
   ▼
4. Terraform destroy

全体の流れ

  1. ルートディレクトリに./github/workflows/terraform.ymlを作成
  2. Environmentsを設定
  3. cicdブランチにpush
  4. cicd→devにプルリクエスト(Terraform plan実行)
  5. devにマージ
  6. dev→mainにマージ(Terraform apply実行)
  7. 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を選択します。
Group 7.png

New repository secretsからAWS_ACCESS_KEYなどを作成します。
Group 9.png
Group 8.png

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

またproductionという環境を作成します.
Group 10.png

reviewrsにご自身を追加して、Save protection rulesをクリックします。
Group 11.png

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)
Group 12.png

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

Group 14.png

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

そうするとTerraform planが始まりました。
スクリーンショット 2025-06-29 17.48.52 1.png

Terraform planの内容がPull Request画面に出力されます。

5. devにマージ

devにマージする部分は割愛します。

6. dev→mainにマージ(Terraform apply実行)

次にdevからmainにプルリクエスト,マージします。
そうするとActionsが動き始めます。
以下、赤枠をクリックします。
Group 16.png

Review deploymentsをクリックして、productionにチェック、Approve and deployをクリックします。
Group 17.png
Group 18.png

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

7. Terraform destroyを実行

Actions内のRun workflowをクリックします。
本当にdestroyしますかとあるので、yesにしてRun workflowをクリックします。
Group 20.png

無事destroyできました!
Group 21.png

この記事のリポジトリです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?