とある Solution Architect の轍

とある Solution Architect の轍

AWS 入門 ~ VPC, EC2 編 ~

AWS 入門 ~ VPC, EC2 編 ~

AWS プラットフォーム上に WordPress を構築するハンズオンを通して、

  • VPC による仮想ネットワーク構築
  • EC2 の基礎

を把握します。

用語

〇〇サーバーとは

「Web サーバー」や「データベースサーバー」といったものがあるわけではなく、
サーバーに対して Web の機能を提供するソフトウェアをインストールしたものが「Web サーバー」といったように、
サーバーにどのようなソフトウェアをインストールするのかでサーバーの役割の上での呼び名が決まります。

AWS における「リージョン」と「アベイラビリティゾーン」

「リージョン」は地域に存在するデータセンター群で、
アベイラビリティゾーン」はリージョンをより細かく、物理的に距離が相当離された独立したファシリティに分割したものです。

「パブリック IP アドレス」と「プライベート IP アドレス」

インターネットに接続する際に用いる IP アドレスを「パブリック IP アドレス(グローバル IP アドレス)」、
インターネットで使われない IP アドレスを「プライベート IP アドレス」と呼びます。
以下の IP アドレス範囲はプライベート IP アドレスと呼ばれます。

  • 10.0.0.0 ~ 10.255.255.255
  • 172.16.0.0 ~ 17.31.255.255
  • 192.168.0.0 ~ 192.168.255.255

IP アドレス範囲と表記方法

「ネットワーク部」は、そのIPアドレスが属しているネットワークを識別するための部分です。
そのIPアドレスが、どのネットワークで使われているのかがわかります。
ホスト部」は、ネットワーク内のコンピュータを識別するための部分です。

IP アドレスの表記方法としては、
ネットワークのビット長を「/ビット長」で示すCIDR(Classless Inter-Domain Routing)表記と、
プレフィックスのビット数だけ 2 進数の 1 を並べ、残りを 0 としたサブネットマスク表記があります。
どちらも「先頭からいくつ分の IP アドレス範囲をネットワーク部とするか」を示す表記方法にすぎません。

インターネットゲートウェイとルートテーブル

自分のネットワークにインターネット回線を引き込むための「インターネットゲートウェイ」、
宛先 IP アドレスがいくつのときどのネットワークに流すべきかの設定を「ルートテーブル」と呼びます。

ルーティングプロトコル

ルーター同士が通信してルートテーブルの情報をやり取りする取り決めのことです。
大きく分けて、

  • EGP(Exterior Gateway Protocol):ISP 等のある程度大きなネットワークを管理する AS (Autonomous System)番号のやりとり
  • IGP(Interior Gateway Protocol):EGP の内部のルーター同士でのルートテーブル情報のやり取り

があります。

サーバー側のサービスとポート番号の関係

0~1023 まではアプリケーションごとに用途が決まったウェルノウンポート、
クライアント側で使われる一時的なランダムなポート番号をエフェメラルポートと呼びます。
エフェメラルポートはサーバーと接続している間だけ使われ、切断されると解放されます。
以下のコマンドで特定のポート番号を待ち受けているかどうかを調べることができます。

# sudo でないと一部の情報しか出力されない
$ sudo lsof -i -n -P

セキュリティグループ

AWS ではインスタンスに対してパケットフィルタリングを構成するファイヤーウォールの役割を指します。
インバウンドは外から自インスタンスに接続する向き、アウトバウンドは自インスタンスから外側に出ていく向きを指します。

NAT(Network Address Translation)

IP アドレスを変換する装置で 2 つのネットワークインタフェースを持ちます。
プライベートサブネットからインターネットの向きの通信だけを許可するときに使います。

片側のネットワークインタフェースにはパブリック IP アドレスを設定し、インターネットに接続可能な構成にしておきます。
もう片側にはプライベート IP アドレスを設定し、プライベートサブネットに接続します。
プライベートサブネットからインターネットの通信には、自身のパブリック IP アドレスに置換して通信します。

厳密には、IP アドレスだけを置換するものを NAT、IP アドレスとポート番号の双方を置換するものをNAPTやIPマスカレードと呼んで区別します。
家庭で使うルーターでは IP マスカレードにより 1 つのパブリック IP アドレスを複数台のホストで共有することでインターネット接続できるようにしています。

AWS では、NATインスタンス(NAT ソフトウェアがあらかじめインストールされた AMI から起動した EC2 インスタンス)を作成する方法と、
NATゲートウェイ(NAT 専用に構成された仮想的なコンポーネント) を配置する方法があります。
後者は負荷に応じてスケールアップし、時間当たりと転送バイト量で課金されます。

OSI参照モデルTCP/IP モデル いずれも通信機能を階層構造に分割したモデルで、
階層化することで、上位と下位の階層は相互に詳細を知らなくてよくなり差し替え可能になるメリットがある。
自身の階層がパケットに付与したヘッダのみに注目し、別階層のデータはカプセル化され参照しない。

TCPUDP
TCP は - 相手に届くことを保証する - 通信を始める前に 3 way handshake - データ順序を保証するため、シーケンス番号という連番をつけ、ACK で次にほしいシーケンス番号を応答番号として返す

UDP は - 状態を持たないプロトコル - 送信元ポート、宛先ポート、データの長さ、チェックサムのみ - データが 1 packet に収まる、データ順序が保証されなくてよい、応答がないときは再送でよい場合に適している

ネットワークの状態把握
1. 適当なサイトにアクセスしてクライアント側のネットワーク環境の動作確認 2. DNS サーバーに対して名前解決リクエストを送信する(nslookup, dig) 3. ICMP を使ったコマンド(ping, traceroute) でネットワーク上の経路を確認(ICMPが許可されている場合に限る) 4. telnet でポート番号を指定した TCP 到達性のチェック

定常的なネットワークの状態把握には、Zabbix, New Relic, CloudWatch(AWSの場合) の利用を検討します。

[VPC] ネットワークを構築する

Amazon VPC では、「どのような IP アドレス範囲を使うか」を指定して仮想的なネットワークを構築します。
以下のような手順で、VPC を作成していくつかのサブネットに分割して利用します。


  1. VPC (10.0.0.0/16)を作成する
  2. VPC をサブネット(public:10.0.1.0/24, private:10.0.2.0/24)に分割する
  3. インターネットゲートウェイを作成し、VPC 領域にアタッチする
  4. ルートテーブルを作成し、デフォルトゲートウェイ(0.0.0.0/0)をインターネットゲートウェイに転送する設定をルートテーブルに追加する
  5. ルートテーブルをパブリックサブネットに割り当てる

[EC2] Web/DB サーバーを構築する

EC2 インスタンスを作成した VPC のサブネットに構築します。
Web サーバーはインターネットからのアクセスができるパブリックサブネットに、
DB サーバーはプライベートサブネットに配置します。

パブリックサブネット

EC2 でインスタンスを作成

  • VPC 領域のパブリックサブネットに作成
  • パブリック IP を割り当て
  • ネットワークインタフェース設定からプライベート IP アドレス(10.0.1.10)を割り当て
  • セキュリティグループの設定(SSH を許可)
  • 鍵ファイルのダウンロード(Permission を 400 に変更)

Web サーバーのインストール
インスタンスにログインして Apache をインストールし、サービスを起動します。

ssh -i <*.pem> ec2-user@<IP_ADDRESS>
sudo yum -y install httpd

# サービスの設定
sudo systemctl start httpd.service
sudo systemctl enable httpd.service

# 動作確認
sudo systemctl list-unit-files -t service
ps -ax | grep httpd
sudo lsof -i -n -P | grep ":80"

その他設定
- セキュリティグループで HTTP のインバウンド接続を許可(80 ポート、ソース 0.0.0.0/0) - VPC の設定で DNS ホスト名を有効化(パブリックDNSでアクセスできるようになる) - IP アドレスはインスタンスを起動するたびにランダムなものが設定されるので、固定化したい場合は Elastic IP を用いてパブリック IP アドレスを固定化する必要があります。

プライベートサブネット

作成した VPC 領域のプライベートサブネットに DB サーバーの EC2 インスタンス(10.0.2.10)を作成します。
インターネットから接続させないので、自動割り当てパブリックIPは無効化します。
セキュリティグループに DB サーバーの通信ポートである 3306 を通す設定を追加します。
DB サーバに対して ping の疎通確認をするため、インバウンドの ICMPプロトコルも追加します。
Web サーバーにログインして、ping 10.0.2.10 で疎通確認します。
サーバーの死活監視をするために、ICMP プロトコルは許可する設定が一般的です。

Web サーバーを踏み台にしてDB サーバーに SSH 接続

# ローカル環境から秘密鍵を Web サーバーにアップロード
scp -i <*.pem> <*.pem> ec2-user@<IP_ADDRESS>:~/

# Web サーバーから DB サーバーに SSH 接続
chmod 400 <*.pem>
ssh -i <*.pem> ec2-user@<DB_SERVER_PRIVATE_IP_ADDRESS>

パブリックサブネットとプライベートサブネットを NAT ゲートウェイで接続する
2021 年 2 月現在、NAT ゲートウェイは無料枠がないそうです。
(今回は実験用途に閉じているので、危険なことを承知のうえパブリックサブネットに DB サーバーを配置して動作確認しました。)

DB サーバの設定

sudo yum -y install mariadb-server
sudo systemctl start mariadb
mysqladmin -u root password # password の設定

# DB 作成
mysql -u root -p

> MariaDB
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all on wordpress.* to wordpress@"%" identified by 'wordpresspasswd';
flush privileges;
# check
select user, host from mysql.user;
exit;

WordPress のセットアップ

以下の操作はすべて Web サーバーで行います。

sudo amazon-linux-extras install php7.3
sudo yum -y install php php-mbstring
sudo yum install mariadb-server

# check
mysql -h <DB_SERVER_PRIVATE_IP_ADDRESS> -u wordpress -p
# wordpresspasswd

# WordPress
cd ~
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xzvf latest-ja.tar.gz
cd wordpress
sudo cp -r * /var/www/html/
sudo chown apache:apache /var/www/html -R
sudo systemctl restart httpd # php の有効化のため再起動

# Web サーバにブラウザからアクセスしてセットアップ

参考図書