Skip to Content
AWS(Amazon Web Services)初級a-01 ECサイトを構築する(VPC・EC2・Aurora・ALB・S3)ステップ4:ALB、ターゲットグループを利用したEC2インスタンスのスケーリング

ステップ4:ALB、ターゲットグループを利用したEC2インスタンスのスケーリング

今回のステップの概要とECサイトとの関連について

このステップでは、前回までに構築したECサイトを、より多くのアクセスに対応できる堅牢なシステムへと進化させます。具体的には、ALB(Application Load Balancer)を導入し、複数のEC2インスタンスでトラフィックを分散させる構成を作ります。また、マルチAZ(複数のアベイラビリティーゾーン)を活用することで、システムの可用性と耐障害性を高めます。

ECサイトにとって、この構成は「お店の支店を複数開いて、どの支店も同じサービスを提供できるようにする」ようなものです。たとえば、あるお店が混雑していたら、別のお店に案内することで、お客さんをスムーズに対応できます。また、1つのお店が何らかの理由で営業できなくなっても、他のお店が営業を続けられるので、サービスが止まることがありません。

このステップで学ぶこと

リソースの関わりと構成説明

ステップ4で作成するリソースは、ECサイトの拡張性と可用性を高めるものです。それぞれのリソースがECサイトにどのように関わるのかを説明します。

AMI(Amazon Machine Image)とECサイトの関わり

AMI「ec-site-web-ami」は、ECサイトの「店舗設計図」のような役割を果たします。この設計図があることで、同じ内装・設備を持つ店舗を簡単に複数作ることができます。これにより、すべての店舗(EC2インスタンス)で同じECサイトアプリケーションが動作することが保証されます。

ALB(Application Load Balancer)とECサイトの関わり

ALB「ec-site-alb」は、ECサイトの「受付案内係」のような役割を果たします。お客さん(ユーザー)が来店したとき、どの店舗(EC2インスタンス)が空いているかを確認し、最適な店舗に案内します。これにより、一部の店舗に客が集中することを防ぎ、すべての店舗で均等にサービスを提供できます。

ターゲットグループとECサイトの関わり

ターゲットグループ「ec-site-web-tg」は、ALBが案内できる「店舗リスト」のような役割を果たします。また、各店舗が正常に営業しているかを定期的にチェック(ヘルスチェック)し、問題がある店舗には客を案内しないようにします。

オートスケーリングとECサイトの関わり

オートスケーリンググループ「ECサイトASG」は、ECサイトの「店舗管理本部」のような役割を果たします。客(トラフィック)が増えたら自動的に新しい店舗(EC2インスタンス)をオープンし、客が減ったら不要な店舗を閉めることで、コストを最適化します。また、何らかの理由で店舗が閉まってしまった場合も、自動的に新しい店舗をオープンして、サービスを継続します。

実際の手順

実際の手順では、たくさんの設定値を入力することになります。 本文中に設定値が指定されていない場合は、デフォルト値のまま作業を進めてください。

1. セキュリティグループの設定

ALBのセキュリティグループを作成します。これにより、インターネットからALBにアクセスできるようになります。
EC2のセキュリティグループを修正します。これにより、ALBからEC2インスタンスにアクセスできるようになります。ALB以外はEC2インスタンスにアクセスできなくなります。

1-1. ALBセキュリティグループの作成

  1. EC2ダッシュボードに移動します。
  2. 左側のメニューから「セキュリティグループ」をクリックします。
  3. 「セキュリティグループを作成」ボタンをクリックします:
    • セキュリティグループ名:「ec-site-alb-sg」と入力します。
    • 説明:「for ec-site ALB」と入力します。
    • VPC:「ec-site-vpc」を選択します。
    • 「インバウンドルール」の「ルールを追加」ボタンをクリックします。
      • タイプ:「HTTP」を選択します。
      • ソース:「Anywhere-IPv4」を選択します。
      • 「セキュリティグループを作成」ボタンをクリックします。
  4. 「セキュリティグループ (sg-xxxxxxxxxxxxxxxxx | ec-site-alb-sg) が正常に作成されました」と表示されることを確認します。

1-2. EC2セキュリティグループの修正

  1. 左側のメニューから「セキュリティグループ」をクリックします。
  2. 「ec-site-web-sg」を選択します。
  3. 「インバウンドルール」タブを選択します。
  4. 「インバウンドのルールを編集」ボタンをクリックします。
  5. 「削除」ボタンをクリックします。(これによりすべてのIPアドレスからEC2インスタンスにアクセスできるルールを削除します。)
  6. 「ルールを追加」ボタンをクリックします。
    • タイプ:「HTTP」を選択します。
    • ソース:「カスタム」を選択します。右隣の空欄には「ec-site-alb-sg」を選択します。(これによりEC2インスタンスにアクセスできるのはALBだけとなります。)
    • 「ルールを保存」ボタンをクリックします。
  7. 「インバウンドセキュリティグループのルールが、セキュリティグループで正常に変更されました」と表示されることを確認します。

2. AMI(Amazon Machine Image)の作成

まず、現在動作しているEC2インスタンスから、AMI(システムのスナップショット)を作成します。これにより、同じ設定の新しいインスタンスを簡単に作成できるようになります。

2-1. EC2ダッシュボードにアクセス

  1. AWSマネジメントコンソールにログインします。
  2. 画面上部の検索バーに「EC2」と入力し、表示される「EC2」をクリックします。
  3. EC2ダッシュボードが表示されます。

2-2. AMIの作成前の準備

  1. 左側のメニューから「インスタンス」をクリックします。
  2. ステップ1で作成したEC2インスタンス「ec-site-web」を選択し、「接続」ボタンをクリックします。
  3. 「接続方法」画面で「Session Manager」タブを選択します。
  4. 「接続」ボタンをクリックします。
  5. 新しいブラウザタブが開き、EC2インスタンスターミナルセッションが表示されます。
  6. 接続に成功すると、Amazon Linux 2023のウェルカムメッセージが表示されます。
  7. 以下コマンドを実行しpm2プロセスや既存のソースコードを削除しましょう:
# 特権管理者で作業します sudo su # 作業ディレクトリに移動 cd /root/ecommerce-app-v1 # PM2タスク削除 pm2 delete all # EC2インスタンス起動時のPM2自動起動設定を削除 pm2 unstartup # PM2ログを削除 pm2 flush # cd /root/ # 既存ソースコードの削除 rm -rf /root/ecommerce-app-v* /root/ecommerce-app-v*.zip __MACOSX # ファイルが残っていないことを確認(total 0 と表示されればOK) ll /root # 80ポートがどのプロセスからも使われていないことを確認(何も表示されなければOK) netstat -tulpn | grep :80
Tip

【解説】AMI作成前のクリーンアップが重要な理由

これらのコマンドを実行する理由は、AMI(Amazon Machine Image)を「クリーンな状態」で作成するためです。AMIは「サーバーの設計図」のようなもので、オートスケーリングで新しいサーバーが作られる際のテンプレートとなります。

PM2プロセスやログ、既存のソースコードを削除することで、新しく起動するサーバーは常にS3から最新のソースコードをダウンロードし、最新の状態でアプリケーションを開始できます。もしこのクリーンアップを行わないと、古いソースコードが残ったままAMIが作成され、新しいサーバーが古いコードで動作してしまう可能性があります。

これは「お菓子の型」を作る時のように、型に前回の生地が残っていると新しいお菓子が形崩れしてしまうのと同じです。毎回きれいに清掃した型を使うことで、同じ品質のお菓子を作ることができるのと同様に、クリーンなAMIを使うことで一貫性のあるサーバー環境を構築できます。

2-3. AMIの作成

  1. 左側のメニューから「インスタンス」をクリックします。
  2. ステップ1で作成したEC2インスタンス「ec-site-web」を選択します。
  3. 「アクション」→「イメージとテンプレート」→「イメージの作成」をクリックします。
  4. 「イメージの作成」:
    • イメージ名:「ec-site-web-ami」と入力します。
    • イメージの説明:「lets hosting ec site」と入力します。
    • 他の設定はデフォルトのままにします。 create ami
  5. 「イメージの作成」ボタンをクリックします。
  6. 「AMIが正常に作成されました」というメッセージが表示されます。
Tip

【解説】AMI作成の重要性とオートスケーリングにおける役割

AMIを作成する理由は、オートスケーリング時に「既に設定済みのサーバー」を瞬時に起動できるようにするためです。AMIには、必要なソフトウェア、設定、セキュリティ設定などがすべて含まれているため、新しいサーバーが起動した瞬間から即座にサービスを提供できます。

もしAMIを利用しなかった場合、オートスケーリングで新しいサーバーが起動するたびに、OSのアップデート、Node.jsのインストール、pnpmのインストール、アプリケーションのダウンロードとビルドなど、すべての作業を一から実行する必要があります。これには10分以上かかる場合があり、その間はサーバーがサービスを提供できません。

特にトラフィック急増時には、この待機時間が致命的です。例えば、ECサイトでセールが開始されアクセスが急増した時、新しいサーバーの準備に10分もかかってしまうと、その間にお客様が離脱してしまい、売上機会を失ってしまいます。AMIを使用することで、この起動時間を数分に短縮でき、迅速にトラフィック増加に対応できるようになります。

2-4. AMIの状態確認

  1. 左側のメニューから「AMI」をクリックします。
  2. 作成したAMI「ec-site-web-ami」のステータスが「利用可能」になるまで待ちます(数分かかることがあります)。 ami-list

3. 起動テンプレートの作成

オートスケーリングで使用する起動テンプレートを作成します。

3-1. 起動テンプレートの作成

  1. 左側のメニューから「起動テンプレート」をクリックします。

  2. 起動テンプレートを作成」ボタンをクリックします。

  3. 起動テンプレートの作成」:

    • 起動テンプレート名と説明:
      • 起動テンプレート名:「ec-site-launch-template」と入力します。
      • バージョンの説明:「ec-site-launch-template-1」と入力します。
      • 「Auto Scalingガイダンスを提供する」にチェックを入れます。
    • アプリケーションとOSイメージ:
      • 「自分のAMI」タブの「自己所有」を選択します。
      • Amazon マシンイメージ (AMI)で先ほど作成した「ec-site-web-ami」を選択します。
    • インスタンスタイプ
      • 「t3.small」を選択します。
    • キーペア
    • ネットワーク設定:
    • ストレージ
      • デフォルト設定のままにします。
    • リソースタグ
      • 「新しいタグを追加」をクリックします。
      • キー:「Name」と入力します。
      • 値:「ec-site-AutoScaling-Instance」と入力します。
    • 高度な詳細:
      • IAMインスタンスプロファイル:ステップ1で作成した「ec-site-web-SSMRole」を選択します。
      • (注:このロールにより、Systems Managerセッションマネージャーを使用してインスタンスに接続できます)
      • User Data(ユーザーデータ)によるWebアプリ自動デプロイ設定
        • Auto Scalingで起動するEC2インスタンスが、常に最新のWebアプリケーションをS3から取得し、pm2で自動起動するには「ユーザーデータ(User Data)」の設定が必要です。

        • 「起動テンプレートの作成」画面の「高度な詳細」セクションにある「ユーザーデータ」欄に、以下のスクリプトを貼り付けてください。

        • arn:aws:secretsmanager:us-east-1:xxxxxxx:secret:xxxxの部分は、ステップ3でメモしたSecrets ManagerのARNに置き換えてください。

          #!/bin/bash # 起動テンプレート時点ではPATHも環境変数も何も設定されていないので設定する export HOME=/root cd /root # 1. S3から最新ソース取得&展開 aws s3 cp s3://tenarai-blueprint-sample-code-983911888049-us-east-1/ec-site-tenarai-sample/ecommerce-app-v1.zip ./ecommerce-app-v1.zip unzip -o ecommerce-app-v1.zip # 2. ステップ3で メモしたSecrets ManagerのARNを.envファイルに記録します cd /root/ecommerce-app-v1 echo 'AURORA_SECRET_ARN=arn:aws:secretsmanager:us-east-1:xxxxxxx:secret:xxxx' > /root/ecommerce-app-v1/.env # 3. 依存パッケージインストール /root/.local/share/pnpm/pnpm install /root/.local/share/pnpm/pnpm build # 4. pm2でアプリ起動 /root/.local/share/pnpm/pm2 start /root/.local/share/pnpm/pm2 save /root/.local/share/pnpm/pm2 startup
  4. 起動テンプレートを作成」ボタンをクリックします。

template_1 template_2 template_3 template_4 template_5 template_6

Tip

【解説】ユーザーデータによる自動デプロイメントの重要性

ここで設定する起動スクリプトは、EC2インスタンスが最初作成起動時にのみ必ず自動で実行されます。このスクリプトでは、S3からWebアプリケーションのソースコードを取得し、pnpmで必要なパッケージをインストールし、pm2でアプリケーションを起動します。

この仕組みがあることで、エンジニアはS3の中身(ソースコード)を新しいものに更新し、EC2を起動し直すだけで、すぐに新しいバージョンのWebアプリケーションを動かすことができます。つまり、サーバーに手作業でログインしてファイルをコピーしたり、コマンドを打ったりする必要がありません。

この設定の大きなメリットは、作業の手間やミスを大幅に減らせることです。たとえば、手作業でサーバーごとにファイルをアップロードしていた場合、うっかり古いファイルを残してしまったり、コマンドの打ち間違いでアプリが動かなくなったりすることがあります。しかし、この自動化の仕組みがあれば、どのサーバーも必ず同じ手順で最新のアプリをセットアップできるので、失敗やトラブルが起きにくくなります。

もしこの設定がなかった場合、サーバーごとに人が手作業で更新しなければならず、「一部のサーバーだけ古いまま」「更新漏れでバグが残る」「作業ミスでサービスが止まる」といった問題が起こる可能性があります。このように、自動でアプリケーションをアップグレードできる仕組みを作ることは、DevOps(開発と運用をスムーズにつなげる考え方)の観点からもとても大切です。人の手をできるだけ減らし、ミスや手間をなくして、素早く安全に新しい機能や修正を反映できるようになります。

4. オートスケーリンググループの作成

オートスケーリンググループを作成して、トラフィックに応じて自動的にEC2インスタンスの数を調整できるようにします。

4-1. オートスケーリンググループの作成

  1. 左側のメニューから「Auto Scalingグループ」をクリックします。
  2. 「Auto Scalingグループの作成」ボタンをクリックします。
  3. 起動テンプレートまたは設定を選択」:
    • Auto Scalingグループ名:「ec-site-asg」と入力します。
    • 起動テンプレート:先ほど作成した「ec-site-launch-template」を選択します。
    • バージョン:「Latest (*)」を選択します。
      • 注意:Defaultではありません
  4. 「次へ」ボタンをクリックします。
  5. 「インスタンス起動オプションを選択」:
  6. 「次へ」ボタンをクリックします。
  7. ステップ3でロードバランサーとターゲットグループを作成します:
    • ロードバランシング
      • 「新しいロードバランサーにアタッチする」を選択します。
        • 「ロードバランサーのタイプ」:「Application Load Balancer
        • 「ロードバランサーの名前」:「ec-site-alb」
        • 「ロードバランサーのスキーム」:「Internet-facing
          • 「Internal」はインターネットに公開しないVPC内部で利用するためのものです。
        • 「アベイラビリティーゾーンとサブネット」:「パブリック
          • ドロップダウンリストをクリックし、パブリックを選択してください。
        • 「リスナーとルーティング」の「デフォルトルーティング (転送先)」:「ターゲットグループを作成する」
        • 「新しいターゲットグループ名」:「ec-site-web-tg」
  8. 「次へ」ボタンをクリックします。
  9. 「グループサイズとスケーリングポリシーを設定」:
    • グループサイズ:
      • 希望するキャパシティー:「1」と入力します。
      • 最小キャパシティー:「1」と入力します。
      • 最大キャパシティー:「4」と入力します。
    • スケーリングポリシーはなしを選択します。
  10. 「次へ」ボタンをクリックします。
  11. 「通知を追加」画面では、デフォルト設定のままで「次へ」ボタンをクリックします。
  12. タグを追加」画面では、デフォルト設定のままで「次へ」ボタンをクリックします。
  13. 「確認」画面で内容を確認し、「Auto Scalingグループの作成」ボタンをクリックします。

asg_check_1 asg_check_2 asg_check_3 asg_check_4 asg_check_5 asg_check_6

Tip

【解説】オートスケーリンググループが必要な理由

オートスケーリンググループを作成する理由は、「システムが自動的に状況に応じてサーバー数を調整する」ためです。これにより、手動でサーバーを管理する必要がなくなり、コスト効率と可用性の両方を実現できます。

具体的には、アクセスが少ない深夜は最小限のサーバーで運用してコストを削減し、アクセスが増える時間帯やセール期間中は自動的にサーバーを追加してパフォーマンスを維持します。また、サーバーが故障した場合も、自動的に新しいサーバーで置き換えるため、サービスの継続性が保たれます。

もしオートスケーリンググループがなければ、サーバーの故障時に手動で復旧作業を行う必要があり、その間サービスが停止してしまいます。また、トラフィック増加に対応するために事前に多くのサーバーを用意しておく必要があり、アクセスが少ない時間帯も高額な運用コストがかかってしまいます。オートスケーリンググループは、現代のクラウドサービスにとって必要不可欠な機能なのです。

Tip

【解説】最初に「スケーリングポリシーなし」を選ぶ理由

初回はあえてスケーリングポリシーを設定せず、固定台数で挙動を観察するのが安全です。Auto Scaling Group、ALB、ターゲットグループなど新規要素を同時に導入すると、ヘルスチェックやユーザーデータ、セキュリティグループ、サブネット配置など複数の要因が絡み合い、原因切り分けが難しくなります。最小・希望キャパシティーを一定にしてまず「単体の安定稼働」を確認すれば、ALB配下でのルーティング、ターゲットの正常判定、起動テンプレートのユーザーデータ実行結果(依存の取得・ビルド・pm2起動)が正しく機能しているかを確証できます。安定が確認できた段階で、ターゲット追跡スケーリング(例: 平均CPU使用率50%)のような動的制御を段階的に有効化します。これにより、スケールイベントによる台数変動が新たなノイズとして加わる前に土台の健全性を担保でき、トラブル発生時も「基盤の問題」か「スケーリング制御の問題」かを迅速に切り分けられます。結果として、検証効率と復旧速度が上がり、学習コストと運用リスクを最小化できます。

Tip

【解説】スケーリングポリシーの種類と選択理由

AWSには主に3つのスケーリングポリシーがあります。ターゲット追跡スケーリングは「エアコンの自動温度調節」のように動作し、設定した目標値(今回はCPU使用率70%)を維持するよう自動的にサーバー数を調整します。メリットは設定が簡単で自動的に最適化されることですが、急激な負荷変化には若干の遅れが生じる場合があります。

ステップスケーリングは「段階的な対応」を行い、CPU使用率70%で1台追加、80%で2台追加といった細かい制御が可能です。メリットは柔軟な設定ができることですが、設定が複雑になりがちです。シンプルスケーリングは「1つの条件で1つのアクション」を実行し、設定は最も簡単ですが、連続的な調整ができないため現代では推奨されていません。

今回ターゲット追跡スケーリングを選択した理由は、ECサイトのような「一定の性能を維持したい」システムに最適だからです。CPU使用率70%という目標値を設定することで、サーバーに適度な余裕を持たせながら、コストと性能のバランスを自動的に取ることができます。初学者にとっても理解しやすく、実用的な選択肢です。

Tip

【解説】ターゲットグループの重要性と役割

ターゲットグループは、ALB(Application Load Balancer)がトラフィックを振り分ける「送り先リスト」のような役割を果たします。レストランで例えると、お客様を案内する際の「利用可能なテーブルリスト」のようなものです。

ターゲットグループには、各サーバー(EC2インスタンス)の健康状態を定期的にチェックする「ヘルスチェック」機能があります。これにより、故障したサーバーやアプリケーションが停止したサーバーには自動的にトラフィックを送らないようになります。また、復旧したサーバーは自動的にリストに戻り、再びトラフィックを受け取れるようになります。

もしターゲットグループを設定しなかった場合、ロードバランサーは「どのサーバーにトラフィックを送ればよいか」がわからず、機能しません。また、サーバーの故障を検知できないため、故障したサーバーにもトラフィックを送り続けてしまい、ユーザーがエラーページを見ることになってしまいます。ターゲットグループは、信頼性の高いサービス提供のために不可欠な仕組みなのです。

Tip

【解説】プライベートサブネット移行によるセキュリティ強化

EC2インスタンスをパブリックサブネットからプライベートサブネットに移動したのは、セキュリティを高めるためです。本来、Webアプリケーションのサーバー(EC2)は、インターネットから直接アクセスできない「プライベートサブネット」に置くのが安全な設計です。なぜなら、パブリックサブネットに置くと、悪意のある第三者から直接攻撃されるリスクが高まるからです。

ステップ3では、学習のためにEC2インスタンスに直接アクセスできるシンプルな構成にしたかったので、あえてパブリックサブネットに配置していました。しかし、ステップ4ではALB(Application Load Balancer)を導入し、ユーザーはALBを通してしかEC2にアクセスできない仕組みになりました。これにより、EC2インスタンスをプライベートサブネットに移動しても、サービスの利用者は問題なくWebサイトにアクセスできます。

つまり、「ALBが受付係になり、EC2サーバーは裏方で働く」イメージです。これによって、外部からの不正アクセスを防ぎ、より安全なシステムを作ることができます。

4-2. ALBセキュリティグループの修正

  1. 左側のメニューから「ロードバランサー」をクリックします。
  2. 「ec-site-alb」を選択します。
  3. 「セキュリティ」タブを選択します。
  4. 「編集」ボタンをクリックします。
    • 「ec-site-web-sg」と「ec2-rds-1」を削除します。(削除するには×印をクリックします。)
    • 「セキュリティグループ」のドロップダウンリストから「ec-site-alb-sg」を選択します。
    • 「変更内容の保存」ボタンをクリックします。
  5. 「セキュリティグループが正常に変更されました。」と表示されることを確認します。

4-3. オートスケーリンググループの確認

  1. 作成したオートスケーリンググループ「ec-site-asg」が表示されます。

  2. インスタンス管理」タブをクリックし、インスタンスが起動していることを確認します(2つのインスタンスが起動するまで数分かかることがあります)。

  3. ALBを確認します。左側のメニューから「ロードバランサー」をクリックします。

Tip

【解説】リソースマップの読み方と確認ポイント

リソースマップは、ALBがどのVPC/サブネットに配置され、どのリスナーからどのターゲットグループへルーティングし、その先でどのEC2が登録されているかを一枚で俯瞰できる配線図です。まずALBのタイプがInternet-facingでパブリックサブネットにあること、リスナー(例: :80/HTTP)の転送先が想定のターゲットグループであることを確認します。次にターゲットグループが正しいVPCで作成され、ヘルスチェックのパス/ポートがアプリに合っているか、登録ターゲットがAuto Scalingのインスタンスになっているかを見ます。最後にアベイラビリティーゾーンがALB/ターゲットグループ/サブネットで整合しているかを確認すると、配線ミスやアタッチ漏れを素早く検知できます。

resorce_map

  1. ターゲットグループを確認します。左側のメニューから「ターゲットグループ」をクリックします。
Tip

【解説】ターゲットグループ確認の要点

ターゲットグループ確認の要点は「ヘルス」「登録状況」「ルーティング設定」です。ヘルスがunhealthyの場合は、ヘルスチェックのパス/ポート/プロトコル、許容レスポンスコード、タイムアウト/間隔/しきい値を見直します。登録状況では、想定のAuto Scalingグループからインスタンスが自動登録されているか、ターゲットタイプ(instance/ip)が要件に合致しているかを確認します。ルーティング設定では、リスナールールがこのターゲットグループに転送する条件になっているかを確認します。セキュリティグループの許可(ALB→EC2のポート)不足やサブネット/AZ不一致でもunhealthyになります。

step4_tg_check_2 step4_tg_check_1

4-4. スケーリングポリシーの作成

  1. 作成したAutoScalingGroup「ec-site-asg」の詳細画面を開き、「オートスケーリングタブ」を開きます。 asg_create_1

  2. 「動的スケーリングポリシーを作成する」を押し、以下設定を入力します。

    • ポリシータイプ: ターゲット追跡スケーリング
    • スケーリングポリシー名: RequestCountPolicy
    • メトリクスタイプ: ターゲットごとの Application Load Balancer リクエスト数
    • ターゲットグループ: ec-site-web-tg
    • ターゲット値: 25
  3. 「作成」を押し、スケーリングポリシーを作成すると以下のような項目が表示されます。

asg_create_2

Tip

【解説】シンプル/ターゲット追跡/ステップの違い

動的スケーリングには3種類があります。ターゲット追跡は選んだメトリクスの目標値を保つよう自動調整する方式で、設定が簡単かつ実運用で推奨です。ステップスケーリングは、しきい値の超過度合いに応じて段階的に台数を増減でき、特定のピークに合わせた精緻な制御が可能ですが、設計が複雑になりがちです。シンプルスケーリングは単一の調整とクールダウンで動く古い方式で、連続調整が苦手です。まずはターゲット追跡を採用し、必要に応じて特定イベント向けにステップルールを併用するのが実務的です。

Tip

【解説】動的スケーリングと予測スケーリングの使い分け

予測スケーリングは、過去のトラフィックから機械学習で需要を予測し、需要が増える前に事前にキャパシティを増やす方式です。動的スケーリング(ターゲット追跡等)は実測メトリクスに反応して後追いで調整します。日次の明確なパターン(朝夕の波、曜日の傾向)やセール開始時刻が決まっている場合は、予測で先回りすることでスパイク時の遅延を抑えられます。一方、突発的で読みにくいイベントには動的が有効です。ベース容量を予測で先に上げ、上振れ分を動的で追従させる併用が最も安定します。

4-5. ALB経由で負荷をかけてスケールアウトを確認する

オートスケーリングが正しく動作するかを確認するため、ローカルPCからALBのDNS名に対して負荷テストツール(例:abコマンド)を使ってリクエストを大量に送り、インスタンス数が自動で増える(スケールアウト)ことを確認します。

まずはALBとターゲットグループ経由でWebサイトが見れるか確認しましょう。

  1. ステップ6-3でメモしたALBのDNS名(例:http://ec-site-alb-123456789.us-east-1.elb.amazonaws.com)をブラウザで確認しましょう。 

    • 前回のステップと同じ画面が表示されれば成功です。
    • メトリクスでが変化することも確認できます。(メトリクスの反映には5分ほどかかります。)
  2. メトリクスを確認します。

alb_check step4_tg_check_3

Tip

【解説】メトリクスはユーザーに近い層から順に確認する

メトリクス確認は「ユーザーに近い層から奥へ」が鉄則です。まずALBのメトリクス(4xx/5xx、正常ターゲット数、リクエスト数や待機接続)で入口の異常有無を見ます。次にターゲットグループでヘルスチェック失敗の理由コード、遅延、ドロップの傾向を確認します。最後に各インスタンスのCPU/メモリやアプリログを見てボトルネックを特定します。上流で異常が出ていれば下流の数値も乱れるため、入口から順に確認することで原因の切り分けが速くなり、無駄な深掘りを避けられます。

  1. AWSコンソールからCloudShell開きます。

cloudshell_open

  1. CloudShellの環境からリクエストを送り負荷をかけてみましょう:
# 送信数: 4000件 # 期間: 4分(240秒, 間隔 0.12秒 ≒ 8.3RPS) for i in {1..4000}; do curl -sS http://ec-site-alb-1509604451.us-east-1.elb.amazonaws.com/ >/dev/null 2>&1 & sleep 0.12; done; wait

※負荷テストは短時間で行い、不要なコストや他の利用者への影響が出ないよう注意してください。

  1. 先ほどと同じように「ec-site-asg」や「ec-site-alb」のメトリクスを確認しリクエストが実際に届いているかどうか確認しましょう。

4-6. CloudWatchでアラームを確認

CloudWatchのアラームも確認しましょう。このアラームを利用してEC2のAutoScalingの判定をしています。AlarmHighがスケールアウトのアラーム、AlarmLowがスケールインのアラームです。

  1. 画面上部の検索バーに「CloudWatch」と入力し、表示される「CloudWatch」をクリックします。
  2. CloudWatchダッシュボードが表示されます。
  3. 左側のメニューから「すべてのアラーム」をクリックします。

cloudwatch_metrics

4-7. Auto Scaling グループでインスタンス数の増減の履歴を確認

AutoScalingGroupのアクティビティタブではインスタンス数の増減の履歴を確認できます。

  1. EC2ダッシュボードに戻ります。
  2. 左側のメニューから「Auto Scaling グループ」をクリックします。
  3. 「アクティビティ」タブをクリックします。

asg_activity

5. 不必要なインスタンスの停止

  1. EC2メニューから「インスタンス」をクリックします。
  2. ステップ1で作成したEC2インスタンス「ec-site-web」を選択
  3. アクションを開き、「インスタンスを停止」を押してEC2インスタンスを停止します
Tip

【解説】EC2インスタンス停止の重要性とコスト効果

既存のEC2インスタンスを停止する理由は、主にコスト削減と今後の運用効率化のためです。EC2インスタンスは「時間貸し駐車場」のような料金体系で、起動している間は継続的に料金が発生しますが、停止状態では料金がかかりません(ストレージ料金は除く)。

オートスケーリンググループが動作している状況では、既存の手動で作成したインスタンスは不要になります。同じ機能を提供するサーバーが複数動いていても、料金は2倍になってしまい無駄なコストが発生します。また、オートスケーリンググループは統一された設定で管理されるため、手動で作成したインスタンスは管理の複雑さを増すだけです。

ただし、停止したインスタンスは「予備のサーバー」として保持しておくことができます。将来的にAMIを作り直したい場合や、何らかの問題でオートスケーリンググループが正常に動作しない場合の緊急時対応として利用できます。停止状態なら料金はかからないため、保険のような役割を果たしてくれる便利な仕組みです。

このステップで何をしたのか

このステップでは、ECサイトの可用性と拡張性を高めるために、ALB(Application Load Balancer)を導入し、複数のEC2インスタンスでトラフィックを分散させる構成を構築しました。また、オートスケーリンググループを設定して、アクセス数に応じて自動的にサーバー数を増減できるようにしました。

ECサイトでどのような影響があるのか

この構成により、ECサイトは多くのアクセスがあっても安定したサービスを提供できるようになりました。たとえば、セール時などのアクセス集中時でも、自動的にサーバーが増えて対応できます。また、サーバーに障害が発生しても、別のサーバーが自動的に引き継ぐため、サービスが停止することなく継続できます。これは、お店が混雑時に自動的に店舗数を増やし、災害時でも別の場所で営業を続けられる体制を整えたことに相当します。

実践チェック:画面キャプチャで証明しよう

下記のチェック項目について、実際にAWSマネジメントコンソールで設定ができていることを確認し、各項目ごとに該当画面のスクリーンショットを撮影して提出してください。

構成図による理解度チェック

ステップ3の構成図を元に、このステップで追加・変更したリソースを反映させ、より実践的な構成図を完成させましょう。

なぜ構成図を更新するのか?

  • 可用性の理解: ALBやAuto Scaling、マルチAZといった、システムの可用性・耐障害性を高めるための仕組みがどのように連携するのかを把握します。
  • スケーラビリティの理解: アクセス負荷に応じてサーバーが自動で増減する様子を図で表現することで、スケーラブルな設計を体感します。
  • セキュリティ構成の進化: インターネットからのアクセスをALBに集約し、EC2インスタンスをプライベートサブネットに配置する構成のセキュリティ的な利点を理解します。

構成図の書き方(変更・追記)

ステップ3で作成した構成図をベースに、以下の点を変更・追記してみましょう。

  1. EC2インスタンスの移動: パブリックサブネットにあったEC2インスタンスを、プライベートサブネットに移動します。
  2. ALBの追加: パブリックサブネットにALBを描きます。
  3. Auto Scaling Groupの追加: 2つのプライベートサブネットにまたがる形で、EC2インスタンスを囲むAuto Scaling Groupを描きます。
  4. ターゲットグループ: ALBとEC2インスタンスの間にターゲットグループを配置します。
  5. 通信経路の変更:
    • インターネットからの通信は、まずALBに到達します。
    • ALBは、プライベートサブネット内のEC2インスタンスにトラフィックを転送します。
    • EC2からDBへの通信経路はこれまで通りです。
  6. セキュリティグループの更新:
    • ALB用のSG(インターネットからHTTPを許可)と、EC2用のSG(ALBからHTTPを許可)の関係性がわかるように描きます。

💡 ヒント: この構成図は、モダンなWebアプリケーションの基本的な形です。どのリソースがどのネットワーク領域にあり、どのように通信を制御しているかを意識して描くことが重要です。

理解度チェック:なぜ?を考えてみよう

AWSの各リソースや設計には、必ず“理由”や“目的”があります。 下記の「なぜ?」という問いに自分なりの言葉で答えてみましょう。 仕組みや設計意図を自分で説明できることが、真の理解につながります。 ぜひ、単なる暗記ではなく「なぜそうなっているのか?」を意識して考えてみてください。

Q. EC2インスタンス(Webサーバーやアプリサーバーなど)を、インターネットから直接アクセスできない「プライベートサブネット」に置くのはなぜでしょうか? (ヒント:もしEC2がインターネットから見える場所にあったら、どんなリスクがあるでしょう?)

Q. ALB(Application Load Balancer)は、なぜインターネットからアクセスできる「パブリックサブネット」に置くのでしょうか? (ヒント:ALBの役割や、外部からのアクセスについて考えてみましょう)

Q. Auto Scaling(オートスケーリング)は、なぜ必要なのでしょうか? (ヒント:利用者が増えたり減ったりしたとき、サーバーの数を自動で調整する仕組みがあると、どんな良いことがあるでしょう?)

今回のステップで利用したAWSサービス名一覧

Last updated on