書籍「Amazon Web Servicesネットワーク入門」のまとめ。
点数
95点
感想
素晴らしい書籍だった。
VPC、サブネット、インターネットゲートウェイ、NATゲートウェイ、ルートテーブルなど、わかりにくいことが丁寧に解説されていた。
AWSのネットワークを理解するための書籍は、本書がベストだと思う。
VPC
VPCとは
Amazaon VPCは、契約者ごとに「ネットワークを構成する場所」を提供する。
契約者は最初にVPC領域を作成し、その中にさらに細分化したサブネットを作る。これが仮想的なネットワークとなる。
- リージョンごとに最大5つまでのVPCを作ることができる。
- VPC同士は完全に独立していて、異なるVPC間で通信することはできない。
- サブネットには、ネットワークACLと呼ばれるパケットフィルタリング設定がある。
- VPC領域内にはルーターがあり、サブネットが互いに接続される。
ルーターを設置する操作をしなくても、必ず1つのルーターが暗黙に置かれる。
インターネットゲートウェイ
VPCをインターネットに接続するには、VPCにインターネットゲートウェイを設置する。
インターネットゲートウェイを設置した後、EC2インスタンスに対してパブリックIPを割り当て、ルートテーブルでデフォルトゲートウェイ(0.0.0.0/0)にインターネットゲートウェイを設定することでインターネットに接続できるようになる。
IPアドレスの範囲
VPCを作成するときは、IPアドレスの範囲を指定する。
(プライベートIPの範囲の中から任意のものを指定)
- たとえインターネットにつなぐ場合でも、プライベートIPを使う。
- VPCを実際に使えるようにするには、IPアドレスを切り分けてサブネットを作り、サブネットをいずれかのAZ(アベイラビリティゾーン)に配置する。
- アドレス範囲は後から変更できないため、通常は最大数である/16(65536個のアドレス)を指定する。
VPCを作るという操作は「IPアドレスの範囲を決める」というだけであり、実体はまだない。
よって、VPCを作っただけでは、そこにEC2インスタンスを設置することはできない。
デフォルトのVPC
デフォルトのVPCは「すぐにインターネットに接続できるようにする」ことを目的に作られている。
デフォルトVPCのサブネットに配置されたEC2インスタンスは、パブリックIPとプライベートIPの2つのアドレスを持ち、インターネットに接続できる。
EC2インスタンスを手早くインターネットに接続したいときはデフォルトVPCを使うとよい。
初めてAWSを触る人にとっては便利だが、設定に柔軟性がないため、それ以外の場合は使うべきではない。
特に、公開したくないEC2インスタンスがある場合は、デフォルトのVPCを使ってはいけない。
- IPアドレス範囲:172.31.0.0/16
- サブネット:172.31.0.0/20、172.31.16.0/20、172.31.32.0/20
- VPCにインターネットゲートウェイが設置されている。
- 各サブネットの「パブリック IPv4 アドレスの自動割り当て」が「はい」になっている。
- VPCにルートテーブルが作成されている。
デフォルトのVPCは特殊なVPCなので、変更や削除をするべきではない。
(作り直しができないので、誤って削除してしまった場合はAWSに依頼して作り直してもらう必要がある)
VPCとサブネットの作成例
- VPCの作成
IPv4 CIDR ブロック:172.30.0.0/16 - サブネットの作成
アベイラビリティーゾーン: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つある。
- メインのルートテーブルを変更する
(※メインのルートテーブルを使っている他のサブネットにも影響する) - 新しくルートテーブルを作ってアタッチする
プライベートサブネット
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インスタンスの作成例
- サブネットの「パブリック IPv4 アドレスの自動割り当て」を「はい」に設定。
- EC2インスタンスを作成
「自動割り当てパブリックIP」は「サブネット設定を使用」を選択。
セキュリティグループ設定でSSHを許可。 - インターネットゲートウェイを作成
作成したゲートウェイを選択して「VPCにアタッチ」をクリック⇒VPCを選択 - ルートテーブルを作成
「ルートの編集」でターゲット:0.0.0.0/0、送信先:インターネットゲートウェイ、のルートを追加する。 - サブネットで使うルートテーブルを変更
サブネットの「ルートテーブルの関連付けの編集」で4で作成したルートテーブルを選択する。
プライベートIPでDBサーバを運用するEC2インスタンスの作成例
- サブネットを作成
IPv4 CIDR ブロック:172.30.1.0/24
「パブリック IPv4 アドレスの自動割り当て」は「いいえ」に設定。
AZはWebサーバと同じにする。
(どちらかがダウンするとサービスが止まるので、別のAZにする必要はない。また、通信速度・コスト面でも同一AZの方がよい) - EC2インスタンスを作成
1で作成したサブネットに配置。
セキュリティグループにdefaultを選択。
WEBサーバにもdefaultセキュリティグループを適用する。
※defaultを適用したインスタンス同士は全ての通信が許可される。 - NATゲートウェイを作成
サブネットにはパブリックサブネットを指定する。 - ルートテーブルを作成
「ルートの編集」でターゲット:0.0.0.0/0、送信先:NATゲートウェイ、のルートを追加する。 - サブネットで使うルートテーブルを変更
サブネットの「ルートテーブルの関連付けの編集」で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の違い
セキュリティグループ
- EC2インスタンス(ENI)単位
- ステートフル
- 許可するルールを定義
- 全てのルールが適用される
- デフォルトは全拒否
ネットワークALC
- サブネット単位
- ステートレス
- 許可と拒否両方のルールを定義
- 最初に合致したルールが適用される
- デフォルトは全許可
同じセキュリティグループ同士で通信できるようにする
セキュリティグループのルールの設定では、送信元・送信先にアドレスではなくセキュリティグループを指定することができる。
これにより「特定のセキュリティグループを指定したEC2インスタンスとだけ通信する」というルールを作れる。
デフォルトで用意されているdefaultセキュリティグループは上記の設定がされており、defaultセキュリティグループが適用されたEC2インスタンス同士の通信は全て許可されるようになっている。
defaultセキュリティグループのルール
- インバウンド:defaultセキュリティグループが適用されたEC2インスタンスが送信元の場合は全許可
- アウトバウンド:全許可
ステートフルとステートレス
TCP/IPの通信では、サーバに接続するときにクライアントには1024〜65535の中からランダムにポート番号が割り当てられる。
これはエフェメラルポートと呼ばれる。
セキュリティグループの設定はステートフルであるため、例えばSSHサーバであればインバウンドの22番だけ許可すればよく、アウトバウンドの許可設定は不要である。
ネットワークALCの設定はステートレスであるため、例えばSSHサーバであればインバウンドの22番だけでなく、アウトバウンドの1024〜65535の許可設定も必要である。
セキュリティグループとネットワークALCの使い分け
ネットワークACLではステートレスであるため、ポート単位の設定は難しくなる。
よって、ネットワークACLではIPアドレス制限の設定を行い、ポート単位の設定はセキュリティグループで行うのが適切な使い方である。