Step1: クラウド1
このStepでは、AWSの基本サービス(VPC・EC2・ELB・オートスケーリング・IAM)を学び、本コースの制作物となる sns-camp-api をAWS上に手動でデプロイして、ヘルスチェックエンドポイントで疎通確認できる状態まで構築します。
1. 講座の履修
AWS講座 の以下の章を実施してください。すでに同等の知識がある場合は、講座の履修はスキップしても構いません。
2. 課題の実施
2.1 目的・背景
本コースの制作物である sns-camp-api を、まずは AWS 上にデプロイし、インターネット経由でアクセスできる状態にします。実運用を意識して、一部のサーバに障害が起きても継続的に応答でき、負荷の変動にも自動で追従できる構成を組み立てることが目標です。
| 💡 ポイント |
| 本課題は、要件定義や設計を自分で考えるスキルを高めるため、要件をあえて抽象的に記載しています。進める中で不明点がある場合は、講師への質問 から事前に相談してください。メンタリング当日に「わからなくて進んでいない」状態になると活用できる時間が限られてしまうため、迷ったら途中段階でもこまめに質問を出すことを推奨します。 |
2.2 進め方
本課題は、以下の2段階に分けて進めます。
- 構成図の提出: 実施要件を踏まえてインフラ構成図を作成し、提出する。メンターからフィードバックを受け、必要に応じて構成を修正する
- 構築結果の提出: フィードバックを反映した構成図をもとに実際に AWS 上で構築し、動作確認と机上確認を行って提出する
構成図のフィードバックを受けてから構築に進むことで、構成の誤りが構築や以降のStepに波及するのを防ぎます。
2.3 使用するアプリケーション
以下のサンプルアプリケーション(sns-camp-api)を利用し、これが動作するようにしてください。
2.4 構築要件
ネットワーク
- 独自の VPC を作成し、その中にリソースを配置すること
- 後述の EC2 は、インターネットから切り離されたサブネットに配置した上で、異なる AZ(アベイラビリティゾーン)で 2 台以上配置すること
- 後述の ALB を配置するサブネットは、インターネットからの通信を受け付けること
サーバ
- EC2 インスタンスにて sns-camp-api を動作させること
- OS は Amazon Linux 2023 を使用すること
ロードバランサー
- ALB(Application Load Balancer)を配置し、インターネットからのトラフィックを EC2 に振り分けること
オートスケーリング
- Auto Scaling グループで、EC2 の台数を自動で増減できる構成であること
- 最小台数: 2 台
- 最大台数: 6 台
- スケールアウトの契機: CPU 使用率が 70% を超えたとき
- スケールインの契機: CPU 使用率が 30% を下回ったとき
セキュリティ
- ALB は、インターネットからの HTTP 通信のみ受け付けること
- EC2 インスタンスは、ALB からの HTTP 通信のみ受け付けること
任意要件
- ALB のヘルスチェック機能で、異常な EC2 を自動的に切り離す構成にすること
- Elastic IP アドレスを割り当て、EC2 の再起動後もパブリック IP アドレスが変わらないようにすること(料金が発生するため注意)
2.5 判定基準
動作確認
sns-camp-api の疎通確認用エンドポイント GET /health を呼び出して、以下の curl コマンドで動作を確認してください。<ALBのDNS名> は、作成した ALB の DNS 名(例: my-alb-123456789.ap-northeast-1.elb.amazonaws.com)に置き換えてください。
curl -i http://<ALBのDNS名>/health
以下のようなレスポンスが返ります。
HTTP/1.1 200 OK
Content-Type: application/json
{"status": "ok"}
机上確認
以下の内容について、実際の設定画面などを確認し、それがわかるスクリーンショットを取得してください。
- 可用性: 1 つの EC2 インスタンスに障害が起きた場合に、ALB で切り離されて処理が継続される仕組み
- スケーリング: 需要が増減した場合に、Auto Scaling グループが EC2 の台数を増減させる仕組み(想定するスケール条件とあわせて)
2.6 課題提出
本課題は構成図と構築結果の2段階に分けて提出します。まず構成図を提出し、メンターからのフィードバックを受けてから、構築結果の提出に進んでください。
構成図の提出
下記内容を提出フォームより提出してください(提出はプレミアムプランでご利用いただけます)。
| 項目 |
内容 |
| 概要 |
設計したインフラ構成の特徴・採用したサービスを簡潔に記載する |
| インフラ構成図 |
作成したインフラ構成図を画像ファイルとして添付する |
| 選定理由 |
採用したサービスごとに、なぜそのサービスを選んだのかを記載する |
| まとめ |
構成を考える過程で検討したこと、工夫したこと、学んだこと |
構築結果の提出
構成図のフィードバックを反映した上で、実際に構築した結果を提出フォームより提出してください(提出はプレミアムプランでご利用いただけます)。
| 項目 |
内容 |
| 概要 |
構築したインフラ構成の特徴・採用したサービスを簡潔に記載する。構成図の提出から構成を調整した場合は、調整内容と理由もあわせて記載する |
| インフラ構成図 |
構築後の最終的なインフラ構成図を画像ファイルとして添付する |
| 動作確認 |
curl コマンドの実行結果を記載する |
| 机上確認 |
可用性・スケーリングそれぞれの設定がわかる画面のスクリーンショットを添付し、なぜ合格基準を満たしているかを記載する |
| まとめ |
構築中に苦労したこと、工夫したこと、学んだこと |
3. メンタリング報告
以下の内容をメンタリングで報告してください(メンタリングはプレミアムプランでご利用いただけます)。
3.1 講座の振り返り
以下の要素それぞれについて、3つの観点で報告してください。
対象の要素
- VPC
- EC2
- ELB
- オートスケーリング
- IAM
報告観点
3.2 提出課題の説明
提出したインフラ構成図をもとに、以下の内容を報告してください。
- どのような意図でこの構成にしたのか
- この構成のメリット
- この構成のデメリット(リスク)
4. 構築のヒント
仮想サーバ上で sns-camp-api を動かすための主要なコマンドをまとめます。本課題の本質は AWS でのインフラ構築にあり、仮想サーバ上で Linux アプリケーションを動かす部分は本課題の本質的な学習対象ではないため、自力で調べて進めていただいて構いませんが、詰まった場合は以下のヒントを適宜参考にしてください。
4.1 Linux でアプリを動作させる方法
展開してコマンド例を表示する
仮想サーバを初めて使う方や、Linux の上で Python アプリケーションを動かした経験がない方向けのコマンド例集です。以下の手順を参考に実行することで、sns-camp-api を仮想サーバ上で動作させるところまで到達できます。
sns-camp-api は Python 3.12 以上で動作します。まずローカルで、ダウンロードした sns-camp-api.zip を展開して自分の GitHub リポジトリに push します。その後、仮想サーバ上でそのリポジトリを git clone して配置します。GitHub を使った経験がある方は以下の手順で git clone、まだ GitHub を触っていない方は末尾の「(参考)GitHub を使わずに zip を転送する方法」で進めてください。GitHub の使い方は Git/GitHub 章で学べます。
GitHub リポジトリへの push(ローカルで実施)
GitHub にログインして、新しいリポジトリを作成しておいてください。プライベート・公開のどちらでも構いません。初期ファイル(README や .gitignore)は作成しない設定を推奨します。
ダウンロードした zip をローカルで展開します。
Windowsの場合:
Expand-Archive sns-camp-api.zip -DestinationPath sns-camp-api
Macの場合:
unzip sns-camp-api.zip -d sns-camp-api
展開したフォルダに移動します。
cd sns-camp-api
Git リポジトリを初期化します。
git init -b main
ファイルをステージングしてコミットします。
git add .
git commit -m "Initial commit"
GitHub で作成したリポジトリをリモートとして設定します。<自分のGitHubリポジトリURL> は作成したリポジトリの URL(例: https://github.com/<ユーザ名>/sns-camp-api.git)に置き換えてください。
git remote add origin <自分のGitHubリポジトリURL>
リモートに push します。
git push -u origin main
Git のインストール
ここからは仮想サーバ側での操作です。Amazon Linux 2023 の場合は、以下のコマンドで Git をインストールできます。
sudo dnf install -y git
Python 3.12 のインストール
Amazon Linux 2023 の場合は、以下のコマンドで Python 3.12 をインストールできます。
sudo dnf install -y python3.12 python3.12-pip
サンプルアプリケーションの配置
ホームディレクトリに移動します。
cd ~
自分の GitHub リポジトリから clone します。
git clone <自分のGitHubリポジトリURL> sns-camp-api
clone したディレクトリに移動します。
cd sns-camp-api
依存関係のインストール
requirements.txt に記載された依存関係をインストールします。
sudo pip3.12 install -r requirements.txt
サーバの起動
uvicorn app.main:app --host 0.0.0.0 --port 8080
ポート 8080 でサーバが起動します。別のターミナルから以下のコマンドでヘルスチェックのレスポンスが返れば起動確認完了です。
curl http://localhost:8080/health
バックグラウンドでの常駐化
SSH 接続を切ってもサーバが動き続けるようにするには、systemd サービスとして登録します。/etc/systemd/system/sns-camp-api.service を以下の内容で作成してください。
[Unit]
Description=SNS Camp API
After=network.target
[Service]
Type=simple
User=ec2-user
WorkingDirectory=/home/ec2-user/sns-camp-api
ExecStart=/usr/local/bin/uvicorn app.main:app --host 0.0.0.0 --port 8080
Restart=on-failure
[Install]
WantedBy=multi-user.target
以下のコマンドでサービスを有効化・起動します。
sudo systemctl daemon-reload
sudo systemctl enable --now sns-camp-api
(参考)GitHub を使わずに zip を転送する方法
GitHub がすぐに使えない場合は、ローカルの sns-camp-api.zip を SCP で仮想サーバに転送し、仮想サーバ上で unzip して展開する方法でも代替できます。
ローカルで実施
ローカルから仮想サーバに zip を転送します。<鍵ファイル> は仮想サーバ作成時にダウンロードした .pem ファイル、<仮想サーバのパブリックIP> は仮想サーバのパブリック IP アドレスに置き換えてください。
scp -i <鍵ファイル> sns-camp-api.zip ec2-user@<仮想サーバのパブリックIP>:~/
仮想サーバで実施
unzip をインストールします。
sudo dnf install -y unzip
ホームディレクトリに移動し、zip を展開します。
cd ~
unzip sns-camp-api.zip -d sns-camp-api
cd sns-camp-api
4.2 オートスケーリングでの起動方法
展開してユーザデータの例を表示する
Auto Scaling グループでは、スケールアウトや障害復旧のタイミングで新しい EC2 インスタンスが自動的に起動します。このとき、新しいインスタンスに毎回 SSH で接続して手作業でセットアップしていては、スケーリングの自動化が成立しません。Launch Template の「ユーザデータ」にセットアップスクリプトを設定しておくと、新しいインスタンスの初回起動時に自動実行され、アプリケーションが動く状態まで仕上がります。
以下のスクリプトを Launch Template の「ユーザデータ」に設定してください。<自分のGitHubリポジトリURL> は自分のリポジトリ URL に書き換えてください。
#!/bin/bash
set -eux
dnf install -y git python3.12 python3.12-pip
cd /home/ec2-user
sudo -u ec2-user git clone <自分のGitHubリポジトリURL> sns-camp-api
cd sns-camp-api
pip3.12 install -r requirements.txt
cat > /etc/systemd/system/sns-camp-api.service <<EOF
[Unit]
Description=SNS Camp API
After=network.target
[Service]
Type=simple
User=ec2-user
WorkingDirectory=/home/ec2-user/sns-camp-api
ExecStart=/usr/local/bin/uvicorn app.main:app --host 0.0.0.0 --port 8080
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sns-camp-api
ユーザデータは EC2 の初回起動時に root ユーザとして実行されます。実行ログは EC2 インスタンス内の /var/log/cloud-init-output.log で確認できます。