AWS基礎

#前提
AWS（NAT構築）について学んだことを書いていきます。

#本題
#NAT構築
プライベートサブネットに配置したサーバーは、インターネットから接続できないため、安全。
しかし、インターネットと一切通信できないと、サーバーのアップデートやソフトウェアのインストールの際に不便。
この問題を解決するのがNAT。
NATは、プライベートサブネット→インターネットの向きの通信だけを許可する。

##NATの用途と必要性
ここまでパブリックサブネットとプライベートサブネットを構築し、以下のように配置した。

・パブリックサブネット内にWebサーバー
・プライベートサブネット内にDBサーバー
これからDBサーバーにデータベースソフトをインストールし、Webサーバーから利用できるようにする。
データベースとしてMariaDBを使う。
そこで、yumコマンドを使ってMariaDBをインストールするのだが、ここで一つ問題がある。
DBサーバーは、プライベートサブネットにあるため、インターネットに接続できない。
つまり、yumなどのコマンドを使って、ソフトウエアをダウンロードできない。
もちろん、踏み台サーバーを経由し必要なソフトウェアを一つずつ、scpコマンドなどでコピーすることもできる。
しかしそれでは手間がかかりすぎてしまう。

###NATの仕組み
この問題を解決するソリューションの一つが、NAT（Network Address Translation）。
NATは、IPアドレスを変換する装置で、2つのネットワークインターフェースを持つ。
片側のインタフェースには、一般にパブリックIPアドレスを設定し、インターネットに接続可能な構成にしておく。
そして、もう片側のインタフェースにはプライベートIPアドレスを設定し、プライベートサブネットに接続する。
プライベートサブネットに存在するホスト（サーバーやクライアント）がインターネットにパケットを送信しようとしたとき、NATはパケットの送信元IPアドレスを自身のパブリックIPアドレスに置換する。
こうすることで、送信元がプライベートIPアドレスではなくNATがもつパブリックIPアドレスに変わるため、インターネットに出ていくことができる。
パケット送信元IPアドレスが置換されているため、接続先からはNATが接続してきているように見える。
そのため応答パケットは、このNATに戻ってくる。
NATは、戻ってきた応答パケットの宛先を、元のホストのIPアドレスに置換しプライベートサブネットに転送する。
このようにNATがIPアドレスを置換することによって、プライベートサブネットに存在するホストは、インターネットと通信できるようになる。
NATを用いると、プライベートサブネットからインターネットに接続できるが、逆にインターネットからプライベートサブネットの方向に接続することはできない。
そのため、サブネットにパブリックIPアドレスを割り当ててインターネットとの通信を許すよりも、セキュリティを高められる。
※NATには、IPアドレスだけを置換するものとIPアドレスとポート番号の両方を置換するものの２種類ある。
後者の構成の場合、1つのパブリックIPアドレスを複数のホストで共有できる。
より正確に言うと、前者をNATと呼び、後者はNAPT（Network Address and Port Translation）やIPマスカレードとよんで区別することもある。
しかし近年では、どちらもNATと呼ばれる。

このNATを構築する方法として、AWSではNATゲートウェイという機能が提供されており、非常に簡単にNATを利用することができるようになっている。

###NATインスタンスとNATゲートウェイ
AWSでNATを構成する場合、2つの方法がある。

１、NATインスタンス
NATソフトウェアがあらかじめインストールされたAMIから起動したEC2インスタンスを使う方法。
EC２インスタンスを作成するときにコミュニティAMIでami-vpc-natを選択しインストールすると、NAT機能つきのEC2インスタンスを作れる。
NATインスタンスは、AmazonLinuxをベースとしてLinuxOSのため、そのEC２インスタンスにNAT以外のソフトウェアをインストールすることもできる。
NATインスタンスの性能は、EC2インスタンスのスペックによって決まる。
また、通常のEC２インスタンスと同様に、利用していないときは停止することもできる。

２、NATゲートウェイ
NATゲートウェイは、NAT専用に構成された仮想的なコンポーネント。
配置するサブネットを選ぶだけで構成できる。
NATゲートウェイは、NATインスタンスと違い、負荷に応じてスケールアップする。
料金は時間あたりと転送バイト（ギガバイト当たり）の転送量で決まる。
※NATゲートウェイはNATインスタンスと違って停止という操作はない。
利用しないときは破棄するしかない。

どちらを使っても良いのだが、構築のしやすから２のNATゲートウェイを利用することにする。

###パブリックサブネットとプライベートサブネットをNATゲートウェイで接続
１、NATゲートウェイを配置する
NATゲートウェイは、インターネットから接続可能な場所であるパブリックサブネットに配置して起動する。

２、デフォルトゲートウェイを設定
NATゲートウェイの準備ができたらプライベートサブネットからインターネット宛のパケットがNATゲートウェイを経由するようにルートテーブルを変更。

##NATゲートウェイを通じた疎通確認
DBサーバーにログインし、インターネットに対してHTTPやHTTPSで接続できるかどうかを調査すれば、NATゲートウェイが正常に動作しているかどうかを確認できる。
###curlコマンドで確認
AmazonLinux２では、デフォルトでtelnetコマンドがインストールされていないため、代わりにコマンドを使うことにする。
curlは、HTTPやFTPでファイルをダウンロードしたりアップロードしたりするコマンド。
例えば、下記のコマンドを実行すると、www.kantei.go.jpのトップページを取得し、コマンドラインに表示できる。

```
$ curl www.kantei.go.jp
```
Webサーバーを踏み台にしDBサーバーにログインし、上記のコマンドを入力することでHTMLが表示されるはず。
HTMLを取得できれば、NATゲートウェイが機能しており、HTTPで通信できていることがわかる。
※NATゲートウェイを使う必要がなくなったら、削除するとよい。
NATゲートウェイは稼働時間と転送バイト単位の両方で課金されるため、全く通信していなくても稼働していれば料金がかかるため。
また、NATゲートウェイを削除しておけばプライベートIPアドレスを持っているインスタンスがインターネットと勝手に通信することもないため、セキュリティも高められる。

#まとめ
NATゲートウェイを用いて、プライベートサブネットからインターネットに接続する方法について記述した。
NATゲートウェイを構成すれば、プライベートサブネットからでもインターネットに接続できるため、あたかもパブリックIPアドレスが割り当てられているような使い勝手になる。
しかも、インターネットからプライベートサブネットには接続できないため、サーバーにパブリックIPアドレスを割り当てるよりも、ずっと安全。
このNATゲートウェイを構築したことで、プライベートサブネットに配置されたDBサーバーで、yumコマンドを使いソフトウェアをインストールできるようになった。