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?

第4回:コンテナ環境での自動ビルドと修正の反映 および AWS Fargate へのデプロイ前検証

Posted at

目次


1. はじめに

本シリーズでは、.NET 9 + PostgreSQL + Docker + AWS Fargate を用いた
フルスタック開発環境の構築から自動デプロイまで を扱っている。

これまでに:

  • macOS上での .NET 9 開発環境構築
  • PostgreSQL コンテナ連携
  • VSCode での Blazor WebApp 修正とデバッグ
    を実施してきた。

今回(第4回)では、
「自動ビルドと修正反映」+「AWSデプロイ前のCI検証」 をテーマとする。
すなわち、ローカルで動かして終わりではなく、
GitHub Actions による自動テストとデプロイフローを実際に構築していく。


2. 全体像:ローカル開発からクラウドデプロイまで

以下は、開発からデプロイまでの全体フロー。

フェーズ 処理内容 実行環境
① 開発 コード修正、docker build VSCode(macOS)
② テスト dotnet test による自動検証 GitHub Actions
③ ビルド Docker イメージ生成・ECR Push GitHub Actions
④ デプロイ copilot deploy により Fargate に反映 AWS Fargate

この流れを構築することで、
手動操作を最小化し、Git操作(push・PRマージ)のみで
クラウド更新までを自動化できる。


3. Docker イメージの自動ビルドと反映

ローカル環境では docker-compose.yml により、
PostgreSQL と WebApp の両方を起動できる。

services:
  db:
    image: postgres:18
    container_name: postgres-db
    platform: linux/arm64
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "5432:5432"
    volumes:
      - postgres-data18:/var/lib/postgresql/data
      - ./pgconf/postgresql.conf:/etc/postgresql/postgresql.conf:ro
    command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      retries: 5

  web:
    build:
      context: ./src/WebApp
      dockerfile: Dockerfile
    container_name: dotnet9-webapp
    platform: linux/arm64
    depends_on:
      db:
        condition: service_healthy
    environment:
      ConnectionStrings__Default: "Host=db;Port=5432;Database=${POSTGRES_DB};Username=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Pooling=true;"
      ASPNETCORE_ENVIRONMENT: "Container_Development"
    ports:
      - "9999:8080"
    restart: unless-stopped

volumes:
  postgres-data18: {}

ローカルで修正した内容は、
以下のコマンドで即時反映できる。

docker compose build web
docker compose up -d

4. GitHub Actions による CI 構成

リポジトリ配下の .github/workflows/webapp-ci.yml
以下のような設定を置く。

name: build_and_deploy

on:
  push:
    branches:
      - main
      - chore/*
  pull_request:
    branches: [ main ]

jobs:
  build_and_test:
    runs-on: ubuntu-latest
    env:
      AWS_REGION: ${{ secrets.AWS_REGION }}
      ECR_ACCOUNT_ID: ${{ secrets.ECR_ACCOUNT_ID }}
    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x
      - name: Restore & Test
        run: |
          dotnet restore
          dotnet test tests/WebApp.IntegrationTests --logger "trx;LogFileName=test_results.trx"

  deploy_to_fargate:
    needs: build_and_test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
      - name: Login to ECR
        uses: aws-actions/amazon-ecr-login@v2
      - name: Build and Push Docker image
        run: |
          docker build -t $ECR_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/webapp/webapp:latest -f src/WebApp/Dockerfile src/WebApp
          docker push $ECR_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/webapp/webapp:latest
      - name: Install Copilot CLI
        run: |
          curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux
          chmod +x /usr/local/bin/copilot
      - name: Deploy to AWS Fargate
        run: |
          copilot deploy --name webapp --env test

主なポイント

要素 内容
on.push mainブランチと chore/* ブランチで起動
dotnet test 自動テストを実行
needs: テスト成功後のみ deploy ジョブを実行
if: main ブランチ以外では AWS デプロイをスキップ

5. デプロイ前検証:自動テストの実行

tests/WebApp.IntegrationTests/LoginTests.cs は、
アプリが正常にログイン可能かを確認する簡易テスト。

[Fact]
public async Task Login_With_AdminCredentials_Should_Return_Success()
{
    using var client = new HttpClient();
    var response = await client.PostAsync("http://localhost:9999/Login",
        new FormUrlEncodedContent(new Dictionary<string, string>
        {
            ["UserName"] = "admin",
            ["Password"] = "admin123!"
        }));
    response.EnsureSuccessStatusCode();
}

このテストにより、アプリが最低限起動しているかをCIで検証できる。
運用ではさらにAPIレスポンスやDB操作テストも追加可能。


6. Secrets 設定と CLI 自動化

GitHub Actions では AWS 認証やアプリ構成を Secrets に登録する。
手動でGUIから設定する代わりに、GitHub CLI でスクリプト化できる。

gh auth login
gh secret set AWS_ACCESS_KEY_ID --body "<your-access-key>"
gh secret set AWS_SECRET_ACCESS_KEY --body "<your-secret>"
gh secret set AWS_REGION --body "ap-northeast-1"
gh secret set ECR_ACCOUNT_ID --body "327845752170"

これにより、GUI操作なしで環境構築を自動化できる。


7. ローカルでの動作検証

AWS にデプロイする前に、ローカルでも同じビルドが再現できる。

docker compose build
docker compose up -d

アプリが起動したらブラウザで以下にアクセス。

http://localhost:9999

ログイン画面が表示され、
admin / admin123! でログイン可能であれば成功。


8. まとめ

  • GitHub Actions によりビルド・テスト・デプロイの流れを自動化
  • mainブランチのみ Fargate に反映
  • Secrets 管理は CLI でスクリプト化
  • ローカル検証とクラウドCIの動作を統一
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?