📖

はじめてのAmazon VPC構築レポート(2)_構築編

に公開

はじめてのAmazon VPC構築レポート(2)_構築編

こんにちは! 株式会社HESの望月です。

今回は、前回の投稿「はじめてのAmazon VPC構築レポート(1)_基礎調査から設計まで」のつづき、「技術合宿2日目」のレポートです。
合宿2日目では、1日目で得た知識を頼りにAmazon VPCの構築にチャレンジします。

  1. ネットワークの基礎調査 (1日目) ←前回
  2. Amazon VPCの基礎調査 (1日目) ←前回
  3. Amazon VPCの構成図を作成 (1日目) ←前回
  4. Amazon VPCをトライアンドエラーで構築 (2日目) ←本記事の内容
  5. Amazon VPCの構成図を再度作成 (2日目) ←本記事の内容

構築中はたくさんの問題に直面しましたが、試行錯誤の末、最後にはAmazon VPC上にAPサーバーを稼働させることができました。
本記事では、成功手順だけでなく失敗談も含めて共有します。これからVPC構築に挑む方の参考になれば幸いです!

1. 前回の投稿(合宿1日目)の振り返り

まずは、前回の投稿の振り返りです。
私は会社の技術合宿に参加し、初めてAmazon VPCの構築に挑戦することになりました。

合宿の最終目標は以下の3点でした。

合宿1日目では、ネットワークやAmazon VPCの基礎調査を実施しました。
その成果が以下の「VPCネットワーク構成図」です。

■ VPCネットワーク構成図 (初稿)

しかし、この構成図(初稿)には足りない部分がありました。

合宿2日目では、この図を基に構築作業を実施しましたが、その過程で多くの壁にぶつかります。
次章より、その試行錯誤の記録をまとめていきます。

2. 構築作業の流れ(合宿2日目)

合宿2日目は、1日目に得た知識を基に以下の手順で構築を進めることにしました。
作業はすべて AWSマネジメントコンソール 上で実施します。

次章から、各工程について「作業内容 → 発生した問題 → 結果」の順に、時系列で詳しく説明していきます。

【構築ステップ】

  • Step 1: VPCとサブネットの作成
  • Step 2: セキュリティグループの作成
  • Step 3: EC2インスタンスの起動
  • Step 4: ロードバランサーの作成
  • Step 5: EC2へのアクセス確認
  • Step 6: アプリケーションの実行環境を構築

3. Step1: VPCとサブネットの作成

● 作業内容

AWSマネジメントコンソールから「VPCを作成」を選択しました。
VPCの設定画面では、VPCだけでなくサブネット等を一括で作成できる「VPCなど」機能を選択しています。

設定値は以下の通りです。

【主な設定】

  • 名前: my-vpc
  • アベイラビリティーゾーン (AZ) の数: 1
  • IPv4 CIDR: 10.0.0.0/16
  • パブリックサブネットの数: 1
  • パブリックサブネット CIDR ブロック: 10.0.1.0/24
  • プライベートサブネットの数: 1
  • プライベートサブネット CIDR ブロック: 10.0.2.0/24

● 結果

「VPCを作成」をクリックすると、VPC、サブネット、ルートテーブル、インターネットゲートウェイなどが自動的に作成され、関連付けも完了しました。

4. Step 2: セキュリティグループの作成

● 作業内容

VPCダッシュボードから「セキュリティグループを作成」をクリックし、基本設定を行いました。

【基本設定】

項目 設定値
セキュリティグループ名 my-sg
VPC my-vpc(Step 1で作成)
インバウンドルール ※ 以下に別記
アウトバウンドルール なし

続いて、インバウンドルール(外部からの接続許可)を設定しました。
この時、SSH接続のソース(接続元)設定にて 「マイIP」 を選択しました。
管理者(自分)からの通信のみを許可するようにしたいためです。
※「マイIP」を選択すると、現在接続しているネットワークのグローバルIPアドレスが自動入力されます。

【インバウンドルールの設定(当初)】

タイプ ポート範囲 ソース 意図
カスタムTCP 80 0.0.0.0/0 HTTPアクセス (Web)
カスタムTCP 8000 0.0.0.0/0 MCPO用
カスタムTCP 3000 0.0.0.0/0 OpenWebUI用
SSH 22 マイIP 管理者(自分)のみ許可

● 発生した問題

Step2以降の作業中に合宿所のWi-Fiが不安定になったため、一時的にネットワークをスマートフォンのテザリングに切り替えたところ、SSH接続ができなくなってしまいました。

● 結果

「セキュリティグループを作成」をクリックし、セキュリティグループが作成されました。

5. Step 3: EC2インスタンスの起動

● 作業内容

AWSマネジメントコンソールで「EC2」サービスから「インスタンスを起動」をクリックし、基本設定を行いました。

項目 設定値
名前 my-app
AMI Ubuntu Server 24.04 LTS (HVM),SSD Volume Type
インスタンスタイプ t3.micro t3.xlarge
キーペア 新しいキーペアを作成
ネットワーク設定/VPC my-vpc
ネットワーク設定/サブネット 作成したプライベートサブネット
ネットワーク設定/パブリックIPの自動割り当て 無効化
ネットワーク設定/ファイアウォール 作成したセキュリティグループ(my-sg)
ストレージ 30 GiB gp3ボリューム

● 結果

「インスタンスを起動」をクリックし、EC2インスタンスが作成されました。

6. Step 4: ロードバランサーの作成

● 作業内容

EC2ダッシュボードから「ロードバランサーの作成」を選択しました。
当初はWebアプリに最適な ALB (Application Load Balancer) を作成する予定でしたが、後述の問題により作成できず、 NLB (Network Load Balancer) を採用しました。

【ロードバランサー設定 (NLB)】

項目 設定値
ロードバランサータイプ ALB NLB
ロードバランサ名 my-lb
スキーム インターネット向け
VPC my-vpc
アベイラビリティーゾーンとサブネット パブリックサブネットがあるAZ / パブリックサブネット

【リスナーとターゲットグループの設定】
各ポートへの通信を、対応するターゲットグループ(EC2)へ転送する設定を行いました。

ターゲットグループ名 プロトコル ポート
my-dify-tg TCP 80
my-mcpo-tg TCP 8000
my-owui-tg TCP 3000
my-ssh-tg TCP 22

● 発生した問題

ALBの作成画面を進めたところ、「サブネットの選択」にてエラーとなり、作成を完了できませんでした。

7. Step 5: EC2へのアクセス確認

● 作業内容

Step 4で作成したNLBを経由して、WebアクセスとSSH接続の確認を行いました。

  1. SSH接続: ターミナルからNLBの「DNS名」を指定しキーペアでSSH接続。
  2. webサーバーのインストール SSHにてWebサーバー(Nginx)をインストールする。
  3. Webアクセス: ブラウザにNLBの「DNS名」を入力してアクセス。

● 結果

無事にSSH接続が成功し、Nginxの初期ページが表示されました。

ここではエラーは発生しませんでしたが、設計段階で私が抱いていた 「プライベートサブネットへの正しいアクセス方法」 について、調査した内容をまとめます。

8. Step 6: アプリケーションの実行環境を構築

● 作業内容

EC2にSSH接続し、アプリケーションの実行環境を構築しました。
具体的には、Docker Engineをインストールし、以下の3つのアプリケーションコンテナを起動しました。

  • Dify: LLMアプリ開発プラットフォーム
  • OpenWebUI: 大規模言語モデルのWeb UI
  • MCPO: OpenWebUIのMCP機能拡張

各アプリケーションの構築は、以下の公式ドキュメントを参照して実施しました。

● 発生した問題

Dockerのインストールが完了し、OpenWebUI のコンテナを起動した瞬間、以下2つのトラブルが発生しました。

1. コンテナ起動中にSSHが強制切断される

OpenWebUIのコンテナを起動(docker run ...)した数秒後、ターミナルの反応がなくなり、SSH接続が強制的に切断されました。
その後、何度接続を試みてもタイムアウトしてしまいました。

2. シリアルコンソールへのログイン失敗

  1. でSSHが強制切断されたため、調査のために「EC2シリアルコンソール」からの接続を試みましたが、ログインパスワードが分からず、完全に締め出されてしまいました。

● 結果

インスタンスタイプの変更後、すべてのアプリケーション(Dify, OpenWebUI, MCPO)が正常に起動しました。
ブラウザからNLBのDNS名にポートを指定してアクセスし、各アプリケーションの画面が表示されることを確認しました。

9. 最終的なVPCネットワーク構成図

数々のトライアンドエラーを経て、最終的に構築された環境のネットワーク構成図を再度作成しました。

初稿(1日目時点)と比較して、実際の構築作業で得られた知見(NLBの採用、Docker構成の具体化など)を反映させています。

■ VPCネットワーク構成図 (最終版)

● 初稿からの主な変更点・改善点

構築時のトラブルシューティングを通じて、以下の3点を修正・詳細化しました。

1. ロードバランサーの変更 (ALB → NLB)
初稿ではL7ロードバランサの「ALB」を想定していましたが、シングルAZ構成でも作成可能なL4ロードバランサ「NLB」に変更しました。

2. EC2内部構造(コンテナ通信)の可視化
EC2インスタンス内部の各アプリケーションコンテナの通信フローを描き足しました。

3. IPアドレスと通信経路の明記
各サブネットのCIDRや、想定されるIPアドレス、通信の方向(矢印)を具体的に記載しました。

10. まとめ

本記事では、技術合宿2日目の「Amazon VPC構築」における試行錯誤(トライアンドエラー)の記録をまとめました。

今回の合宿では、「Amazon VPC上にAPサーバーを構築し、稼働させる」 というメインゴールを達成することができました。

しかし数々の問題に直面したことで、新たな課題が見つかりました。

  • ネットワークの根本的な理解が足りていない
    • PCからサーバーまでの通信シーケンス
    • IPアドレスの仕組み
  • 本番環境を想定した設計ができていない
    • AZの冗長化
    • ロードバランサによる適切な負荷分散
    • 正しいヘルスチェックの設計
    • 踏み台サーバを利用したセキュアな構成

2日間の技術合宿のレポートは、今回で終了です。
しかし、上記の課題を克服するために、合宿後に追加調査を実施しました。

次回は、その追加調査の内容をまとめた記事を投稿したいと思います。

最後までお読みいただき、ありがとうございました!

参考

記事作成にあたり、以下サイトの情報を参考にさせていただきました。

HESI :技術や日々のお仕事などを紹介します

Discussion