応用課題
1. 課題の概要
この章で学んだ内容をもとに、コンテナ化したアプリケーションに対する CI/CDパイプライン を GitHub Actions で構築します。
必須要件は 机上での CI/CDパイプラインの設計と実装 です。実際のAWSリソースを構築する必要はなく、ワークフローを設計し、AWS連携前までのジョブが動作することを確認するところまでが範囲です。実環境へのエンドツーエンドデプロイは発展課題として扱います。
2. 事前準備
Gitの基礎知識を習得していることを前提とします。自信のない方は先に以下の講座を実施してください。
2.1 サンプルアプリのダウンロード
zipには FastAPI + SQLAlchemy で実装されたシンプルなタスク管理APIに加え、本番運用想定の Dockerfile と .dockerignore が同梱されています。Dockerfile はマルチステージビルド・非rootユーザ・軽量ベースイメージで構成されており、そのままビルドして利用できます。
2.2 必要なツール
3. 必須要件
3.1 CI/CDパイプラインの構築
GitHub Actions で、push または プルリクエストをトリガーに動作するワークフローを設計・実装すること。
実際のAWSリソースを構築する必要はありません。ワークフローの設計と、AWS連携前までのジョブが正しく動作することを確認するところまでが必須範囲です。
3.2 ワークフローに含めるステップ
以下のステップをワークフローに含めること。
- 静的解析: flake8 と mypy を実行する
- 自動テスト: pytest を実行する
- コンテナイメージのビルド: 同梱の Dockerfile からイメージをビルドする
- ECR への push: ビルドしたイメージを ECR にpushする
- ECS へのデプロイ: ECS タスク定義を更新する
このうち、静的解析・自動テスト・コンテナイメージのビルド は実際に GitHub Actions 上で成功することを確認してください。ECR push と ECS デプロイのステップはワークフローに記述するだけで構いません(AWS認証エラー等でジョブが失敗してOKです)。
3.3 ワークフロー設計
- 静的解析・自動テスト・ビルド・デプロイは ジョブを分離 すること(依存関係は
needsで表現する) - AWS認証情報を扱うステップでは GitHub Secrets を参照し、ワークフロー内に直接記述しないこと
- デプロイは mainブランチへのマージ時のみ 実行されるよう、トリガーやジョブの条件を設定すること
4. 発展課題(任意)
4.1 AWSリソースの構築とエンドツーエンドのデプロイ
CI/CDパイプラインを実際にエンドツーエンドで動作させるため、デプロイ先となるAWSリソースを構築する。
- ECRリポジトリを作成し、GitHub Actions からの push を許可する(OIDC連携、またはIAMユーザのアクセスキーを GitHub Secrets に登録)
- ECSクラスタとサービスを作成し、Fargate起動タイプでタスクを実行する
- ALBを介してECSサービスにアクセスできる構成にする
- RDSをプライベートサブネットに配置し、ECSタスクから接続できるようにする
- パイプラインを実行し、mainブランチへのマージで自動的にデプロイされることを確認する
4.2 Blue/Green デプロイメント
ECS の Blue/Green デプロイメントを構築し、ダウンタイムなくデプロイできる構成にする。
- CodeDeploy と ECS を組み合わせて Blue/Green デプロイを構成する
- ALB のターゲットグループを2つ用意し、Blue/Green の切り替えを行えるようにする
- ワークフローからは CodeDeploy のデプロイメントをトリガーする形に変更する
- デプロイ失敗時の自動ロールバックを設定する
4.3 その他
- カナリアデプロイ(CodeDeploy のリニアまたはカナリア戦略)を構築する
- プルリクエスト時にAIコードレビューを自動実行する
- Terraform 等のIaCコードにも CI/CDパイプラインを適用する(plan の自動実行、approval後の apply)
5. 提出形式
5.1 GitHubリポジトリ
CI/CDパイプライン(GitHub Actions のワークフローファイル)を含むコード一式をアップロードしたGitHubリポジトリのURLを記載してください。
5.2 設計方針と効果
構築したCI/CDパイプラインについて、以下の観点で簡単な考察を記載してください。
- 設計方針: どんな目的でCI/CDパイプラインを設計したか
- 施策: 具体的にどんなステップ・ジョブ構成・トリガー条件・セキュリティ対策などを組み込んだか
- 効果: その施策によって、どんな改善・利点が得られるか(手動作業の削減、品質担保、デプロイ安全性の向上など)
「動くものを作った」で終わらず、なぜその構成にしたのか・それで何が良くなるのか を自分の言葉で言語化することがこの課題の狙いです。
5.3 まとめ
実装中に苦労したこと、工夫したこと、学んだことを記載してください。