応用課題
この章では、AWS講座で学んだ内容を応用した課題に取り組みます。
1. 課題の概要
この講座で学んだAWSの各サービスを組み合わせて、シンプルなタスク管理アプリケーションをデプロイするインフラを構築します。
サンプルアプリケーションはフロントエンドが Next.js、バックエンドが FastAPI で実装されています。本課題では、これらをAWS上にデプロイし、フロントエンドとバックエンドが連携して動作する状態を構築します。
構成は以下のとおりです。
- フロントエンドは AWS Amplify で動かす
- バックエンドは ALB + EC2(Amazon Linux 2023)で動かす
- データベースは RDS(MySQL 8.x)を使い、バックエンドからは環境変数経由で接続する
2. 事前準備
2.1 前提となる講座
この章では、以下の知識を前提としています。自信がない場合は先に関連講座を実施してみましょう。
| 講座名 | 必要な知識 |
|---|---|
| Git入門 | リポジトリ作成、コミット、Pushなど、Gitの基本操作 |
2.2 サンプルアプリケーションのダウンロード
本課題で使用するサンプルアプリケーションのソースコードを以下からダウンロードしてください。
フロントエンド(Next.js)
バックエンド(FastAPI)
バックエンドのzipには、EC2上での環境構築を自動化するシェルスクリプト(setup.sh)と、データベース接続情報を記述するための雛形(.env.example)、READMEが同梱されています。
2.3 必要なツール
この章では、以下のツールを使用します。まだインストールしていない場合は、リンク先の手順に沿って準備をお願いします。
| ツール名 | 関連箇所 | 理由 |
|---|---|---|
| Visual Studio Code | Visual Studio Codeのインストール | サンプルアプリケーションの編集と .env の作成に使用する |
| Git | Git/GitHubのセットアップ | Amplifyと連携するGitHubリポジトリの作成・プッシュに使用する |
2.4 必要なアカウント
この章では、以下のアカウントを使用します。まだ用意していない場合は、リンク先の手順に沿って準備をお願いします。
| アカウント名 | 関連箇所 | 理由 |
|---|---|---|
| AWSアカウント | AWSアカウントの作成 | AWSリソースを構築する環境として使用する |
| GitHubアカウント | Git/GitHubのセットアップ | Amplifyと連携するリポジトリのホスティング先として使用する |
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 まとめ
実装中に苦労したこと、工夫したこと、学んだことを記載してください。