応用課題
1. 課題の概要
この章で学んだ内容をもとに、シンプルなタスク管理APIをコンテナ化し、Docker Composeでローカル起動できる状態にした上で、AWS ECS/Fargate にデプロイします。
アプリケーション本体は配布するものを使用します。コンテナ化(Dockerfile・Docker Compose)とAWSデプロイ(ECR・ECS/Fargate)の部分に集中して取り組みます。
2. 事前準備
Gitの基礎知識を習得していることを前提とします。自信のない方は先に以下の講座を実施してください。
2.1 サンプルアプリのダウンロード
zipには FastAPI + SQLAlchemy で実装されたシンプルなタスク管理APIが入っています。アプリは DATABASE_URL 環境変数で接続先のMySQLを指定する設計になっています。
2.2 必要なツール
3. 必須要件
3.1 Dockerfile
サンプルアプリを本番運用想定でコンテナ化するDockerfileを作成すること。以下の観点を満たすこと。
- マルチステージビルドを使用し、最終イメージにビルドツールや開発用依存が残らない構成にすること
- 実行ユーザを非rootユーザに切り替えていること
- ベースイメージは公式の軽量イメージ(例:
-slim、-alpine、distrolessなど)を選定していること WORKDIR・COPY・EXPOSE・CMD(またはENTRYPOINT)を適切に設定していること
3.2 .dockerignore
ビルドコンテキストから不要なファイルを除外する .dockerignore を作成すること。
3.3 Docker Compose
ローカルで動作確認できる docker-compose.yml を作成すること。
- FastAPI アプリのコンテナと、MySQL のコンテナを定義していること
docker compose upでアプリが起動し、FastAPI から MySQL に接続してデータを操作できること- アプリの環境変数(
DATABASE_URL)は Compose のenvironmentまたはenv_fileで設定していること
3.4 ECS/Fargate へのデプロイ
ローカルで動いたアプリをAWS上にデプロイすること。
- VPCを作成し、2つのアベイラビリティゾーンにパブリックサブネットとプライベートサブネットを配置(マルチAZ構成)
- ECRリポジトリにコンテナイメージをpushし、ECSタスク定義から参照していること
- ECSクラスタを作成し、Fargate起動タイプでタスクを実行していること
- ECSタスクはプライベートサブネットに配置されていること
- ALBをパブリックサブネットに配置し、ECSサービスへルーティングしていること
- RDS(MySQL 8.x)をプライベートサブネットに配置し、ECSタスクから接続できるようにすること
- RDS用のセキュリティグループで、ECSタスクからの接続のみ許可していること
- ALBのDNS名から
/tasksにアクセスし、APIが動作することを確認できること
4. 発展課題(任意)
4.1 Secrets Managerで機密情報を管理する
- DB接続情報(
DATABASE_URL)を AWS Secrets Manager または Systems Manager Parameter Store で管理し、ECSタスク定義から参照する
4.2 HTTPS化
- Route53で独自ドメインを設定する
- ACMでSSL証明書を発行し、ALBでHTTPS化する
4.3 Auto Scaling
- ECSサービスに Auto Scaling を設定する(CPU使用率などをトリガー)
4.4 IAMロールの分離
- タスクロール(アプリから他AWSサービスへのアクセス用)と タスク実行ロール(ECS Agent がイメージpull やログ出力するための権限)を分離する
5. 提出形式
5.1 GitHubリポジトリ
実装したコード(Dockerfile、.dockerignore、docker-compose.yml、アプリケーション一式)をアップロードしたGitHubリポジトリのURLを記載してください。
5.2 スクリーンショット
以下のスクリーンショットを添付してください。
ローカル動作確認
docker compose upでコンテナが起動している画面(またはdocker psでコンテナが動作している画面)- ローカルから
curl http://localhost:8000/tasksなどでAPIが動作している画面
AWS デプロイ確認
- ECRリポジトリにイメージがpushされている画面
- ECSサービスでタスクが実行中(RUNNING)の画面
- ALBのDNS名から
/tasksにアクセスしてAPIが動作している画面
5.3 まとめ
実装中に苦労したこと、工夫したこと、学んだことを記載してください。