応用課題
1. 課題の概要
この章で学んだAWSの各サービスを組み合わせて、シンプルなタスク管理アプリをデプロイするインフラを構築します。
サンプルアプリはフロントエンドが Next.js、バックエンドが FastAPI で実装されています。本課題では、これらをAWS上にデプロイし、フロントエンドとバックエンドが連携して動作する状態を構築します。
構成は以下のとおりです。
- フロントエンドは AWS Amplify で動かす
- バックエンドは ALB + EC2(Amazon Linux 2023)で動かす
- データベースは RDS(MySQL 8.x)を使い、バックエンドからは環境変数経由で接続する
2. 事前準備
Gitの基礎知識を習得していることを前提とします。自信のない方は先に以下の講座を実施してください。
本課題で使用するサンプルアプリのソースコードを以下からダウンロードしてください。
2.1 フロントエンド(Next.js)
2.2 バックエンド(FastAPI)
バックエンドのzipには、EC2上での環境構築を自動化するシェルスクリプト(setup.sh)と、データベース接続情報を記述するための雛形(.env.example)、READMEが同梱されています。
3. 必須要件
3.1 フロントエンド(Amplify)
- AWS Amplifyで Next.js アプリをデプロイする
- GitHubリポジトリと連携し、push時に自動デプロイされる構成にする
- 環境変数
NEXT_PUBLIC_API_URLに、バックエンドの ALB の DNS 名(例:http://my-alb-1234567890.ap-northeast-1.elb.amazonaws.com)を設定する。発展課題で独自ドメインを設定した場合は、そのドメイン(例:https://api.example.com)を指定する
3.2 バックエンド(ALB + EC2)
- VPC内にPublic SubnetとPrivate Subnetを2つ以上のAZに分散配置する
- Public Subnetに ALB(Application Load Balancer)を配置する
- Private SubnetにEC2インスタンス(Amazon Linux 2023)を配置し、FastAPIアプリを動作させる
- ALB経由でFastAPIエンドポイントにアクセスできるようにする
- セキュリティグループでALB・EC2・RDS間および外部からの通信を制御する
3.3 データベース(RDS)
- RDS(MySQL 8.x)をPrivate Subnetに配置する
- マルチAZ構成で可用性を確保する
- バックエンドのEC2からのみ接続できるよう、セキュリティグループを設定する
3.4 サンプルアプリのセットアップ
tasks-api.zip を展開すると現れる setup.sh をEC2上で実行することで、必要なミドルウェア(Python・依存パッケージ等)のインストールから FastAPIアプリの systemd サービス化・起動までが完結します。具体的な実行手順は同梱の README を参照してください。
なお、データベースのテーブルはアプリ起動時に自動で作成されるため、別途マイグレーションコマンドを実行する必要はありません。
3.5 データベース接続情報(envファイル)の更新
tasks-api.zip には .env.example が同梱されています。EC2上で以下の手順を実施し、RDSへの接続情報を反映してください。
.env.example を .env としてコピーします。
cp .env.example .env
.env を編集し、RDS構築時に控えた接続情報を反映します。
DATABASE_URL=mysql+pymysql://<DBユーザ名>:<DBパスワード>@<RDSエンドポイント>:3306/<DB名>
各項目は以下を指します。
<DBユーザ名>: RDS作成時に指定したマスターユーザ名<DBパスワード>: RDS作成時に指定したマスターパスワード<RDSエンドポイント>: RDSコンソールの「接続とセキュリティ」タブに表示されるエンドポイントのホスト名<DB名>: アプリケーションが利用するデータベース名
.env を更新した後は、systemd経由でFastAPIプロセスを再起動して設定を反映します。
sudo systemctl restart tasks-api
4. 発展課題(任意)
4.1 AutoScalingでバックエンドのEC2を冗長化する
AutoScaling Group でバックエンドのEC2を複数台構成にし、ALBターゲットグループに自動登録されるようにします。インスタンスを1台手動終了しても、自動で新しいインスタンスが起動して復旧する状態を目指します。
実装のヒントとして、セットアップ済みのEC2からAMIを作成し、そのAMIを起動テンプレートに指定する方法が一般的です。AutoScalingが起動する新規インスタンスはセットアップ済みの状態で立ち上がり、すぐにALBに参加できます。AMI化する前に、.env を編集してアプリが正常起動することを確認しておいてください。
4.2 独自ドメインでHTTPS化
- Route53で独自ドメインを設定する
- ACMでSSL証明書を発行し、ALBおよびAmplifyでHTTPS化する
5. 提出形式
以下の4項目をまとめて提出してください。本文はマークダウンで記載し、構成図・スクリーンショットは画像として添付してください。
5.1 概要
実装した範囲を簡潔に記載してください。
例:
- 必須要件のみ実施
- 必須要件 + 発展課題(AutoScalingで冗長化)を実施
- 必須要件 + 発展課題(AutoScalingで冗長化、独自ドメインでHTTPS化)を実施
5.2 構成図
構築したAWS構成を示す構成図を画像で添付してください。
- 必須要件で構築するすべてのリソース(VPC、Public/Private Subnet、ALB、EC2、RDS、Amplify等)を含めること
- 発展課題を実施した場合は、AutoScalingや独自ドメイン部分も構成図に反映すること
5.3 スクリーンショット
以下のスクリーンショットを画像で添付してください。
インフラ構成
- VPCの Subnet 一覧(Public/Private が AZ 分散で構成されていることが確認できる画面)
- ALB の詳細画面(Public Subnet 配置とターゲットグループの設定が確認できる画面)
- EC2 インスタンス一覧(Private Subnet に配置されていることが確認できる画面)
- RDS の詳細画面(Private Subnet 配置・マルチAZ構成・MySQL 8.x が確認できる画面)
- セキュリティグループの設定(ALB・EC2・RDS のインバウンドルールが確認できる画面)
アプリケーションの動作
- ブラウザで Amplify のURLにアクセスしたフロントエンドの画面
- タスクを追加した後の画面
- ブラウザを再読み込みしてもタスクが表示されていることが確認できる画面
- ALB エンドポイントに直接アクセスして
/healthが{"status":"ok"}を返している画面
発展課題を実施した場合
- AutoScaling Group の構成画面(複数台が動作していることが確認できる画面)
- 独自ドメインでアクセスしている画面(HTTPS化されていることが確認できる画面)
5.4 まとめ
実装中に苦労したこと、工夫したこと、学んだことを記載してください。