ぺーぺーSEのテックブログ

備忘録用メモサイト

RSSを購読する

Amazon VPCまとめ

AWSVPC についてまとめる。

  • 用語整理
    • VPC
    • サブネット
    • ルートテーブル
    • セキュリティ
    • ゲートウェイ
    • DNS / NTP
    • Elastic IP (EIP)
    • VPCエンドポイント
    • ピアリング接続
    • VPN接続
  • 設定

用語整理

VPC

AWSアカウント内に作成する仮想的なネットワーク。
会社や自宅のLANみたいなもんだと思えばいい。
作成にあたり、以下のような特徴・注意点がある。

  • ネットマスクは Classless Inter-Domain Routing (CIDR) ブロック「/16」~「/28」の範囲(基本は「/16」にする)
  • 一度作成したVPCはサイズ変更不可能
  • テナンシーの設定
    • 1つの物理サーバを1ユーザで専有することをシングルテナンシー、複数ユーザで共有することをマルチテナンシーという * VPC内に作成されるインスタンスを専用テナンシーインスタンスにするには「ハードウェア専有」を、VPC内に作成されるインスタンスを作成時に指定されたテナンシー属性を使用するには「デフォルト」を選択する
    • 基本的には「デフォルト」でよい

『シングルテナンシーのメリット』

シングルテナンシーで作成した Dedicated Host は以下の事ができるようになる。

  • 「ライセンス持ち込み(Bring Your Own Licenses)」
    • サーバ単位の既存のライセンスであるWindows Server, SQL Server, SUSE Linux Enterprise Serverやその他のエンタープライズシステムや製品を、クラウドに持ち込める。
    • Dedicated Hostのソケット数や物理コア数を確認することができますので、実際のハードウェアに適するソフトウェアライセンスを取得・使用できる。
  • 「コンプライアンスや規制への準拠」
    • Dedicated Hostを配置することで、ユーザが完全に専有するハードウェア上で、アプリケーションを実行することができる。
  • 「利用の追跡」
    • AWS Configを使うことで 、各Dedicated Host上にあるインスタンスの開始・停止といった利用履歴を追跡することができる。
    • このデータは、ライセンスメトリクスの利用量との確認に使える。
  • 「インスタンス配置の制御」
    • 各Dedicated Host上のEC2インスタンスの配置を、細かい粒度で制御できる。

サブネット

VPC内に作成する仮想的なサブネット。
1つのサブネットは1つのアベイラビリティゾーン(AZ)に所属する。
作成にあたり、以下のような特徴・注意点がある。

  • サブネットで指定したIPアドレスの範囲のうち、最初の4つと最後の1つは使用できない
    • 10.0.0.0/24 のサブネットを例にして言うと、予約されているアドレスは以下の5つで利用可能なIPアドレスは251個
      • 10.0.0.0(ネットワークアドレス)
      • 10.0.0.1(VPC ルーター)
      • 10.0.0.2(DNS へのマッピング用)
      • 10.0.0.3(将来の利用のためにAWSで予約)
      • 10.0.0.255 (ネットワークブロードキャストアドレス)
  • サブネットのネットマスクにCIDR「/27」以上をつける
    • ELBを設置するサブネットには、サブネット全体で8個以上のIPアドレスの余りが必要
    • サブネット内にELB以外にもEC2インスタンスを配置することができるが、無計画にEC2を稼働させまくると、IPが不足してELBのスケールアウトができなくなる
  • 1 つのVPCに作成できるサブネットは 200 個
  • EC2で使っていたSecurityGroupは使えない!
    • EC2のSecurityGroupとVPC内で使うSecurityGroupは別物
    • EC2のSecurityGroupはInboundだけ設定できるが、VPCのSecurityGroupはOutboundまで制御することができる
  • すべてのサブネットは仮想敵なルータ( ルートテーブルネットワークACL )が設定されている必要がある

ルートテーブル

  • ルートテーブルは個々のサブネットに 1 つずつ設定できる
  • 1 つのルートデーブルを複数サブネットに適用できるが、 1 つのサブネットに複数ルートテーブル設定できない
  • 宛先アドレス( Destination )とターゲットとなるゲートウェイ・ネクストホップ( Target )を設定する

デフォルトのルートテーブルに メインルートテーブル(vpc内からvpc内へのルーティング)
「Destination:10.0.0.0/16(vpc)」 -「Target:local」
が設定されている。
送信先が「10.0.0.0/16(vpc)」のリクエストをルータがキャッチした場合「local」へルーティングする。
VPC内の該当サブネットからインターネットへ接続したい場合、
「Destination:0.0.0.0/0」-「Target:インターネットゲートウェイ」
を設定する。
作成にあたり、以下のような特徴・注意点がある。

  • ルートテーブルでは上の定義が優先される
  • VPC/サブネットからインターネットにアクセスするためにはパブリックサブネットである必要がある
    • この設定が有効でないとEC2のLinuxからyumすら実行できない

プライベートサブネットパブリックサブネット

設定項目としてこれらがVPCに備わっているのではなく、そのサブネットのルートテーブルの設定によってこれが決まる。
ルートテーブルで「0.0.0.0/0 」がインターネットゲートウェイに流れるような設定になっているのが「パブリックサブネット」、そうではないのが「プライベートサブネット」。

セキュリティ

VPCのセキュリティとしてネットワークACLセキュリティグループが使用できる。

ネットワークACL

ネットワークアクセスコントロールリスト( ネットワークACL )は、サブネットの仮想ファイアウォールとして機能し、インバウンドトラフィックとアウトバウンドトラフィックを ブラックリスト 式で制御する。
ネットワークACLがサブネットのインバウンド・アウトバウンドのトラフィックを制御するのに対し、セキュリティグループはインスタンス単位のインバウンド・アウトバウンドのトラフィックを制御する。
ステートレス Firewall なので 戻りのトラフィックも考慮する必要がある

セキュリティグループ

セキュリティグループは、インスタンスの仮想ファイアウォールとして機能し、インバウンドトラフィックとアウトバウンドトラフィックを ホワイトリスト 式で制御する。
VPC 内でインスタンスを起動した場合、そのインスタンスは最大5つのセキュリティグループに割り当てることができる。
セキュリティグループは、サブネットレベルでなくインスタンスレベルで動作する。
このため、VPC内のサブネット内のインスタンスごとに異なるセキュリティグループのセットに割り当てることがでる。
起動時に特定のグループを指定しないと、インスタンスは VPC のデフォルトのセキュリティグループに自動的に割り当てられる。
ステートフル Firewall なので 戻りのトラフィックは考慮する必要がない。

VPC Flow logs

  • ネットワークトラフィックをキャプチャし、 CloudWatch Logs へ Publish する機能
  • セキュリティグループとネットワーク ACL のルールで accept/reject されたトラフィックログを取得
  • ネットワークインターフェースを送信元 / 送信先とするトラフィックが対象
  • キャプチャウインドウと呼ばれる時間枠( 約 10 分)で収集・プロセッシング・保存
  • RDS、Redshift、ElastiCach、WorkSpacesのネットワークインターフェースのトラフィックも取得可能
  • Flow logs データは Amazon CloudWatch Logs と Amazon S3 に保存・閲覧・取得可能
  • VPC Flow logs は GuardDuty による脅威の検知と通知が可能

ゲートウェイ

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

VPCからインターネットを接続するためのゲートウェイ。
似た単語に「カスタマーゲートウェイ」「仮想プライベートゲートウェイ」があるが、これらはVPN接続するとき以外は関係ない。

NATゲートウェイ

サブネット内に作成するNATの仕組み。EIPを設定する必要がある。
「NAPインスタンス」もあるが、基本的にはNATゲートウェイでいい。参考
また、 IPv4の場合は NATゲートウェイだが、IPv6の場合はEgress-Only インターネットゲートウェイを利用する。

DNS / NTP

Amazon Provided DNS

VPCで用いることのできるDNSサーバ。
デフォルトではVPC内から名前解決を行う時はこのサーバを用いる。
VPC のインターネットゲートウェイを介して通信する必要があるインスタンスが利用できる DNS で、VPC が CIDR ブロック 10.0.0.0/16 ネットワークの場合 DNS サーバーの位置は 10.0.0.2 となる。(もしくは 169.254.169.253 ) VPC 内のインスタンスからのみ参照可能で、 VPN や専用線経由では参照できない。
以下の設定が可能。

  • Enable DNS resolution
    • 基本は Yes 。 No にすると DNS 機能が無効になる。
  • Enable DNS hostname
    • True にすると DNS 名が割り当てられる。

DHCPオプションセット

VPCで使われるDHCPサービスの定義を行うもの。
独自のDNS・NTP・NetBIOSサーバを構築・設定したい場合に使用する。
以下の設定が可能。

  • Name Tag
    • 定義を識別する名前
  • Domain Name
    • DHCPで配布するDNSドメイン名
    • デフォルトだとリージョンが判別可能なものが付けられる
    • Windowsの場合DNSサフィックスとして設定され、Linuxの場合resolv.confのsearchに設定される
  • Domain name servers
    • DHCPで配布するDNSサーバのIPアドレスを指定する、最大4つ
    • Windowsの場合参照先DNSサーバとして設定され、Linuxの場合resolv.confのnameserverに設定される
  • NTP servers
    • DHCPで配布するNTPサーバのIPアドレスを指定する、最大4つ
  • NetBIOS name servers
    • DHCPで配布するNetBIOSネームサーバ(WINSサーバ)のIPアドレスを指定する、最大4つ
  • NetBIOS node type
    • DHCPで配布するNetBIOSのノードタイプを指定する
    • 1、2、4、8から指定する

Amazon Time Sync Service

VPC 内で稼働する全てのインスタンスから利用できる NTP サーバ。( 169.254.169.123

Elastic IP (EIP)

  • プライベートIPについて
    • VPC でインスタンスを起動すると、サブネットのアドレス範囲内のプライマリプライベートIPアドレスがインスタンスのデフォルトのネットワークインターフェイス(eth0)に割り当てられる。
  • パブリックIPについて
    • すべてのサブネットに、そのサブネット内で起動されるインスタンスがパブリックIPアドレスを受け取るかどうかを決定する属性があり、デフォルトでは、デフォルト以外のサブネットではこの属性がfalseに設定されており、デフォルトのサブネットではこの属性がtrueに設定されている。
    • サブネットのパブリックIPのアドレス動作を変更するには「サブネットのアクション」の「自動割り当てパブリックIPの変更」から変更する
    • パブリック IP アドレスはデフォルトのネットワークインターフェイス(eth0)に割り当てられる。
    • パブリック IP アドレスとインスタンスとの関連付けを解除すると、そのアドレスは解放されて使用できなくなる。

固定のパブリックIPアドレスが必要な場合は、EIPアドレスを使用する。

Elastic Network Interface (ENI)

ENIは、VPC のインスタンスにアタッチできる仮想ネットワークインターフェイス。 ENIには以下の属性を含めることができる。 - プライマリプライベート IP アドレス。 - 1つ以上のセカンダリプライベート IP アドレス。 - プライベート IP アドレスごとに 1 つの Elastic IP アドレス。 - 1つのパブリック IP アドレス。 - eth0のElastic Network Interfaceについては、インスタンスを起動したときに自動的に割り当てることができる。 - ただし既存のネットワークインターフェイスを使用するのでなく、eth0のElastic Network Interfaceを作成する場合のみ。 - 1つまたは複数のセキュリティグループ。 - MAC アドレス。 - 送信元/送信先チェックフラグ。 - 説明。

VPCエンドポイント

VPCエンドポイントは、VPC 内のインスタンスからインターネットゲートウェイ・NAT デバイス・VPN 接続・AWS Direct Connect 接続を利用することなく直接AWS サービスや VPC エンドポイントサービスにプライベート接続できる機能を提供する。
ゲートウェイエンドポイントインターフェースエンドポイントAWS PrivateLink )があり、それぞれ以下のサービスを利用できる。

  • ゲートウェイエンドポイント
    • Amazon S3
    • DynamoDB
  • インターフェースエンドポイント(AWS PrivateLink)
    • Amazon API Gateway
    • Amazon CloudWatch
    • Amazon CloudWatch Events
    • Amazon CloudWatch Logs
    • AWS CodeBuild
    • Amazon EC2 API
    • Elastic Load Balancing API
    • AWS Key Management Service
    • Amazon Kinesis Data Streams
    • Amazon SageMaker ランタイム
    • AWS Secrets Manager
    • AWS Service Catalog
    • Amazon SNS
    • AWS Systems Manager
    • 他の AWS アカウントによってホストされるエンドポイントサービス
    • サポートされる AWS Marketplace パートナーサービス

ピアリング接続

VPC ピア接続は、プライベートIPアドレスを使用して2つの VPC 間でトラフィックをルーティングすることを可能にするネットワーク接続。
どちらのVPCのインスタンスも、同じネットワーク内に存在しているかのように、相互に通信できる。
VPCピア接続は、自分のVPC間、または、1つのリージョン内の他のAWS アカウントにあるVPCとの間に作成できる。

VPN接続

VPN接続の設定には「仮想プライベートゲートウェイ」と「カスタマーゲートウェイ」の2つを使用する。
また、ここでは「 VPN接続 」と記載しているが、AWS では Site-to-Site VPN という言葉で表現される。

仮想プライベートゲートウェイ( VGW

VPN接続においてのAmazon VPC側に配置するゲートウェイ。
複数のカスタマーゲートウェイからのVPN接続を受け付けることが可能。(「仮想プライベートゲートウェイ:カスタマーゲートウェイ」=「1:N」)
仮想プライベートゲートウェイとカスタマーゲートウェイはセットで作成する必要がある。

カスタマーゲートウェイ

VPN接続においてのユーザ側(自社のデータセンタなど)の定義を行う仮想的なVPN装置。
仮想プライベートゲートウェイとカスタマーゲートウェイはセットで作成する必要がある。

設定

自分なりのVPC設計方針。
ただし、RFC1918に沿う。
パブリックサブネット 2 つ、プライベートサブネット 2 つの構成で作ってみる。

(1)VPCの作成

「10.0.0.0/16」、「10.1.0.0/16」、「10.2.0.0/16」、、、
のように作成する。
CIDRブロックは最大の /16 確保する。

設定項目 設定値
ネームタグ sample-vpc
IPv4 CIDRブロック 10.0.0.0/16
IPv6 CIDRブロック なし
テナンシー デフォルト

この時、作成した VPC に対応する - メインルートテーブル が 1 つ - デフォルト ネットワーク ACL が 1 つ - DHCP オプションセット が自動で作成される。
放置でよい。

(2)サブネットの作成

VPCが「10.0.0.0/16」の場合、
「10.0.0.0/24」、「10.0.1.0/24」、「10.0.2.0/24」、、、
のように作成する。
VPCが「10.1.0.0/16」の場合、
「10.1.0.0/24」、「10.1.1.0/24」、「10.1.2.0/24」、、、
のように作成する。
ELBを用いる場合等、基本的に同一のサービスで2つのサブネットを作成し、異なるAZを設定する。
CIDRフロックを /24 に設定した理由は、 - /24 のサブネット数が 251 個 - VPC あたりのサブネット数がデフォルト 200 個 - ちょっと上限緩和で対応できる - 8 の倍数でカウントアップしやすい から。
以下のように作成する。

設定項目 設定値
ネームタグ sample-subnet-public0
VPC sample-vpc
アベイラビリティーゾーン ap-northeast-1a
IPv4 CIDRブロック 10.0.0.0/24
設定項目 設定値
ネームタグ sample-subnet-public1
VPC sample-vpc
アベイラビリティーゾーン ap-northeast-1c
CIDRブロック 10.0.1.0/24
設定項目 設定値
ネームタグ sample-subnet-private0
VPC sample-vpc
アベイラビリティーゾーン ap-northeast-1a
CIDRブロック 10.0.2.0/24
設定項目 設定値
ネームタグ sample-subnet-private1
VPC sample-vpc
アベイラビリティーゾーン ap-northeast-1c
CIDRブロック 10.0.3.0/24

作成したサブネットには VPC の - メインルートテーブル - デフォルト ネットワーク ACL が自動で付与されている。

(3)インターネットゲートウェイの作成とアタッチ

設定項目 設定値
ネームタグ sample-igw

「インターネットゲートウェイ」→「VPCにアタッチ」から sample-igwsample-vpc にアタッチする。

(4)ルートテーブルの更新

基本的に、同一VPC間、およびVPCからインターネットへのルーティングを設定する。

メインルートテーブルを放置して新規にルートテーブルを作成する。
sample-rt-public ルートテーブルを作成し、以下のように定義する。

Destination Target
10.0.0.0/16 local
0.0.0.0/0 sample-igw

ルートテーブルを上記のように設定したサブネットは「パブリックサブネット」となる。
これを先ほど作成した sample-subnet-public0 sample-subnet-public1 サブネットに関連付けする。

  • 対象サブネットの -> 「ルートテーブル」タブ -> 「ルートテーブルの関連付けの編集」ボタン -> sample-rt-public を選択

sample-rt-private ルートテーブルを作成し、以下のように定義する。️

=========ここ以降要修正===========

Destination Target
10.0.0.0/16 local
0.0.0.0/0

これを先ほど作成した sample-subnet-private0 sample-subnet-private1 サブネットに関連付けする。

  • 対象サブネットの -> 「ルートテーブル」タブ -> 「ルートテーブルの関連付けの編集」ボタン -> sample-rt-private を選択

(5)セキュリティ設定

設定簡易化のためネットワークACLは使用せず(全てのトラフィックを通す)、セキュリティグループを使用する。
ネットワークACLを使用する場合は、サブネット間で通信が発生しないところをブラックリストとして登録する用途として利用。
セキュリティグループは下記を作成する。

Security Group In-Bound Out-Bound
default-sg tcp/udp/icmp全通し 全通し
ssh-sg 22のみ通す 全通し
public-web-sg 80と443のみ通す 全通し
app-sg public-web-sgからは通す 全通し
db-sg app-sgからは通す 全通し

基本的な通信用のdefault-sgとSSH用のssh-sgを作成。
その他、サービスの入り口(public-web-sg)、アプリ層(app-sg)、DB層(db-sg)を作成。
一部まったく同じ設定だが、レイヤとセキュリティグループの区切りを合わせている。

ネットワークACLの更新

Nameタグに「sample-vpc-default-acl」とつける。

セキュリティグループの作成

以下の5つを作成する。
※デフォルトで1つ作成されているので、default-sgにリネームして再利用してもよい。

ネームタグ--- グループ名 説明 VPC
default-sg default-sg 任意 sample-vpc
ssh-sg ssh-sg 任意 sample-vpc
public-web-sg public-web-sg 任意 sample-vpc
app-sg app-sg 任意 sample-vpc
db-sg db-sg 任意 sample-vpc

それぞれのセキュリティグループに対して下記を設定する。

■インバウンドルール

Security Group タイプ プロトコル ポート 送信元
default-sg すべてのTCP TCP (6) すべて 0.0.0.0/0
すべてのUDP UDP (17) すべて 0.0.0.0/0
すべてのICMP ICMP (1) すべて 0.0.0.0/0
ssh-sg SSH (22) TCP (6) 22 自社・自宅のGIP/32
public-web-sg HTTP (80) TCP (6) 80 0.0.0.0/0
HTTPS (443) TCP (6) 443 0.0.0.0/0
app-sg すべてのトラフィック すべて すべて public-web-sg
db-sg すべてのトラフィック すべて すべて app-sg

■アウトバウンドルール

Security Group タイプ プロトコル ポート 送信元
default-sg すべてのトラフィック すべて すべて 0.0.0.0/0
ssh-sg すべてのトラフィック すべて すべて 0.0.0.0/0
public-web-sg すべてのトラフィック すべて すべて 0.0.0.0/0
app-sg すべてのトラフィック すべて すべて 0.0.0.0/0
db-sg すべてのトラフィック すべて すべて 0.0.0.0/0

参考