サイトアイコン 上尾市のWEBプログラマーによるブログ

「Amazon Web Servicesネットワーク入門」の感想・備忘録

書籍「Amazon Web Servicesネットワーク入門」のまとめ。

点数

95点

感想

素晴らしい書籍だった。
VPC、サブネット、インターネットゲートウェイ、NATゲートウェイ、ルートテーブルなど、わかりにくいことが丁寧に解説されていた。
AWSのネットワークを理解するための書籍は、本書がベストだと思う。

VPC

VPCとは

Amazaon VPCは、契約者ごとに「ネットワークを構成する場所」を提供する。
契約者は最初にVPC領域を作成し、その中にさらに細分化したサブネットを作る。これが仮想的なネットワークとなる。

インターネットゲートウェイ

VPCをインターネットに接続するには、VPCにインターネットゲートウェイを設置する。

インターネットゲートウェイを設置した後、EC2インスタンスに対してパブリックIPを割り当て、ルートテーブルでデフォルトゲートウェイ(0.0.0.0/0)にインターネットゲートウェイを設定することでインターネットに接続できるようになる。

IPアドレスの範囲

VPCを作成するときは、IPアドレスの範囲を指定する。
(プライベートIPの範囲の中から任意のものを指定)

VPCを作るという操作は「IPアドレスの範囲を決める」というだけであり、実体はまだない。
よって、VPCを作っただけでは、そこにEC2インスタンスを設置することはできない。

デフォルトのVPC

デフォルトのVPCは「すぐにインターネットに接続できるようにする」ことを目的に作られている。
デフォルトVPCのサブネットに配置されたEC2インスタンスは、パブリックIPとプライベートIPの2つのアドレスを持ち、インターネットに接続できる。

EC2インスタンスを手早くインターネットに接続したいときはデフォルトVPCを使うとよい。
初めてAWSを触る人にとっては便利だが、設定に柔軟性がないため、それ以外の場合は使うべきではない。

特に、公開したくないEC2インスタンスがある場合は、デフォルトのVPCを使ってはいけない。

デフォルトのVPCは特殊なVPCなので、変更や削除をするべきではない。
(作り直しができないので、誤って削除してしまった場合はAWSに依頼して作り直してもらう必要がある)

VPCとサブネットの作成例

  1. VPCの作成
    IPv4 CIDR ブロック:172.30.0.0/16
  2. サブネットの作成
    アベイラビリティーゾーン:ap-northeast-1a
    IPv4 CIDR ブロック:172.30.0.0/24
    テナンシー:デフォルト

テナンシーとは

ルートテーブル

ルートテーブル設定では、サブネットのデフォルトゲートウェイにインターネットゲートウェイを指定する。
これにより、宛先が同一サブネット以外のデータはインターネットゲートウェイを通るようになる。
※ルートテーブルの作成はVPC単位、適用はサブネット単位。

サブネットを作成した直後は、VPCに作成されたメインのルートテーブル「送信先:VPCのネットワークアドレス(172.30.0.0/16など)、ターゲット:local」が設定されている。
インターネットに接続するには、これに加えて「送信先:0.0.0.0/0、ターゲット:インターネットゲートウェイ」というルート情報が必要である。
変更方法は2つある。

  1. メインのルートテーブルを変更する
    (※メインのルートテーブルを使っている他のサブネットにも影響する)
  2. 新しくルートテーブルを作ってアタッチする

プライベートサブネット

WEBサーバをパブリックサブネットで運用し、そのサブネットの下にプライベートサブネットを配置してデータベースを運用する。
このようにデータベースサーバとして使うEC2インスタンスを、インターネットからアクセスできないサブネットに設置するのはよくある実装方法である。

こうした運用では「SSH接続できない」「プライベートIPしか付与されていないのでインターネットにアクセスできない。そのため、OSやソフトのインストールができない」という2つの問題がある。

「SSH接続できない」の解決方法

「SSH接続できない」の解決方法は「踏み台サーバーを使う」である。
例えば、WEBサーバにSSH接続し、そこからプライベートIPでデータベースサーバへ接続する。

「プライベートIPしか付与されていないのでインターネットにアクセスできない」の解決方法

「プライベートIPしか付与されていないのでインターネットにアクセスできない」の解決方法は「NATゲートウェイを配置する」である。
NATゲートウェイは「プライベートIP⇒インターネット」の接続のための装置である。
逆の「インターネット⇒プライベートIP」の通信は許可されない。

NATゲートウェイはパブリックサブネットに配置する。
NATゲートウェイにはElastic IPを割り当てなければならない。
そして、プライベートサブネットのデフォルトゲートウェイ(0.0.0.0/0)がNATゲートウェイとなるようにルートテーブルを編集する。

EC2

EC2インスタンスに割り当てられるIP

サブネットではDHCPサーバーが動作している。
サブネットにEC2インスタンスを配置すると、プライベートIPが割り当てられる。
割り当てられたプライベートIPは変更されることはなく、ずっと同じアドレスのままである。
(インスタンスを停止・再開した場合もアドレスは変わらないため、実質は固定IPと同じである)

EC2インスタンス作成時の「自動割り当てパブリックIP」の設定値により、パブリックIPが割り当てられるかどうかが決まる。
(これは動的なパブリックIPの割り当てであり、静的なパブリックIPにする場合はElasticIPを使う)
通常は「サブネット設定を使用」を選択する。
※この設定は後から変更ができない。変更したいときはインスタンスを複製し、古いインスタンスを削除する。

ENI

物理サーバーのNICに相当するのが、AWSのENI(Elastic Network Interface)である。
ENIは仮想的なNICであり、EC2インスタンスを作成するとENIも作られる。

プライベートIPを指定する

EC2インスタンス作成時にプライベートIPを指定することもできる。
ただし「そのENIに対して常に同じアドレスを割り当てるようにDHCPを設定する」という意味であり、EC2インスタンスのOSではIP自動取得設定にしなければならない。
(AWSでは、IPは常にサブネットのDHCPサーバーが割り当てるものである)

SSH接続可能なEC2インスタンスの作成例

  1. サブネットの「パブリック IPv4 アドレスの自動割り当て」を「はい」に設定。
  2. EC2インスタンスを作成
    「自動割り当てパブリックIP」は「サブネット設定を使用」を選択。
    セキュリティグループ設定でSSHを許可。
  3. インターネットゲートウェイを作成
    作成したゲートウェイを選択して「VPCにアタッチ」をクリック⇒VPCを選択
  4. ルートテーブルを作成
    「ルートの編集」でターゲット:0.0.0.0/0、送信先:インターネットゲートウェイ、のルートを追加する。
  5. サブネットで使うルートテーブルを変更
    サブネットの「ルートテーブルの関連付けの編集」で4で作成したルートテーブルを選択する。

プライベートIPでDBサーバを運用するEC2インスタンスの作成例

  1. サブネットを作成
    IPv4 CIDR ブロック:172.30.1.0/24
    「パブリック IPv4 アドレスの自動割り当て」は「いいえ」に設定。
    AZはWebサーバと同じにする。
    (どちらかがダウンするとサービスが止まるので、別のAZにする必要はない。また、通信速度・コスト面でも同一AZの方がよい)
  2. EC2インスタンスを作成
    1で作成したサブネットに配置。
    セキュリティグループにdefaultを選択。
    WEBサーバにもdefaultセキュリティグループを適用する。
    ※defaultを適用したインスタンス同士は全ての通信が許可される。
  3. NATゲートウェイを作成
    サブネットにはパブリックサブネットを指定する。
  4. ルートテーブルを作成
    「ルートの編集」でターゲット:0.0.0.0/0、送信先:NATゲートウェイ、のルートを追加する。
  5. サブネットで使うルートテーブルを変更
    サブネットの「ルートテーブルの関連付けの編集」で4で作成したルートテーブルを選択する。

WEBサーバの~/.ssh/に秘密鍵ファイルをアップしssh DBサーバのプライベートIP -i ~/.ssh/キーファイルでWEBサーバを踏み台にしてDBサーバへのSSH接続が可能となる。

Amazon Linux2でのMySQL(MariaDB)のインストール

Amazon Linux2ではMySQLではなくMariaDBをインストールすることができる。
(MariaDBクライアントはデフォルトでインストールされている)
sudo yum install -y mariadb-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
# 以下のコマンドでセキュリティ関連の設定(rootパスワード、匿名ユーザの削除等)を簡単に変更することができる。
sudo mysql_secure_installation

セキュリティ

ネットワークALC

ネットワークALCはサブネットに設定されるもの。
まず、ネットワークACLでサブネット全体の大まかなパケットフィルタリングを行い、セキュリティグループで個々のEC2インスタンスのパケットフィルタリングを行う。

セキュリティグループとネットワークALCの違い

セキュリティグループ
ネットワークALC

同じセキュリティグループ同士で通信できるようにする

セキュリティグループのルールの設定では、送信元・送信先にアドレスではなくセキュリティグループを指定することができる。
これにより「特定のセキュリティグループを指定したEC2インスタンスとだけ通信する」というルールを作れる。

デフォルトで用意されているdefaultセキュリティグループは上記の設定がされており、defaultセキュリティグループが適用されたEC2インスタンス同士の通信は全て許可されるようになっている。

defaultセキュリティグループのルール

ステートフルとステートレス

TCP/IPの通信では、サーバに接続するときにクライアントには1024〜65535の中からランダムにポート番号が割り当てられる。
これはエフェメラルポートと呼ばれる。

セキュリティグループの設定はステートフルであるため、例えばSSHサーバであればインバウンドの22番だけ許可すればよく、アウトバウンドの許可設定は不要である。

ネットワークALCの設定はステートレスであるため、例えばSSHサーバであればインバウンドの22番だけでなく、アウトバウンドの1024〜65535の許可設定も必要である。

セキュリティグループとネットワークALCの使い分け

ネットワークACLではステートレスであるため、ポート単位の設定は難しくなる。
よって、ネットワークACLではIPアドレス制限の設定を行い、ポート単位の設定はセキュリティグループで行うのが適切な使い方である。

モバイルバージョンを終了