こんにちは、Mashです。
本記事は私自身がAWSをお勉強で触ってみた経験を共有するシリーズ Mash式AWSチュートリアル です。
今回はAmazon VPC編の第4回となります。
前回記事の最後に前フリをいれましたが、今回はプライベートサブネットに構築したインスタンスを、セキュアにインターネットへアクセスさせたい場合の対応方法について学んでいきたいと思います。
それではいきましょう!
前回のおさらい
前回記事までのチュートリアルで構築した環境図は下記のとおりです。

インターネットゲートウェイへのルーティングを持たないサブネット = プライベートサブネットを作成し、外部との接点がないEC2を構築することができました。
課題:パッチ適用、パッケージインストールなどができない
EC2のセキュリティレベルを向上させるためにプライベートサブネットを構成したわけですが、例えばOSのセキュリティアップデートやパッケージのインストールなど、一時的にでもインターネットへ接続する必要がでてくるシーンが多くあります。
このような要件がある場合、AWSでは基本的には NATゲートウェイ というサービスを利用することになります。
What is NAT Gateway?
NATゲートウェイの基本情報を整理します。
NATゲートウェイとは
繰り返しとなりますが、NATゲートウェイはプライベートサブネット上のEC2がインターネットにアクセスするためのゲートウェイコンポーネントです。
ざっくり、ポイントとなる仕様は以下の通りです。
送信方向のみ許可するゲートウェイ
NATゲートウェイは、プライベートサブネット上のインスタンスからインターネットへの送信方向通信(+戻りの通信)のみが許可されたゲートウェイです。
この仕様のため、外部からの攻撃からインスタンスを守ることが可能です。
インターネットゲートウェイ(IGW)は双方向の通信が可能コンポーネントなので、この点が大きく異なります。
自動拡張する
NATゲートウェイはAWSのマネージドサービスであり、帯域幅が 5Gbpsから45Gbps で自動拡張してくれます。
もしこれ以上の帯域幅が必要な場合は、NATゲートウェイを複数展開し負荷分散して対応する必要があります。
セキュリティグループは設定できない
NATゲートウェイにはセキュリティグループを関連付けることはできません。
NATゲートウェイに対するトラフィックを管理したい場合は、ネットワークACLというセキュリティ機能を利用します。
※ネットワークACLについてはまた別途
他にも細かな点はありますが、NATゲートウェイを利用する上で最低限知っておきたい仕様は以上になります。
NATゲートウェイを配置した構成図はこのようになります。

NATゲートウェイを利用することによって、プライベートサブネットからインターネット方向の通信のみ通すことができるようになります。
利用料金
NATゲートウェイの料金を見積もる場合、2つの観点が必要になります。
プロビジョニング時間
NATゲートウェイを作成し、利用可能状態となっている時間で課金されます。
1時間あたり0.062USDとなります(本記事執筆時点の為替計算で1時間6.5円)。
データ転送量
NATゲートウェイを通過するデータ量で課金されます。
こちらはリージョンにより単価が異なるようで、AWS公式サイトによると東京リージョンでは1GBあたり0.062USDとなります。
無料枠は?
残念ながら、NATゲートウェイには無料枠はありません。
NATゲートウェイはプロビジョニング時間による課金がありますので、必要なタイミングにだけ作成し、利用後は削除する という運用にしてもよいかもしれません。
もちろん学習目的のみなさんについても、実機検証後は必ず削除するようご注意ください!
削除し忘れていた場合、
6.5円/1h × 24h × 30d = 4680円
の請求が来てしまいますよ!
NATゲートウェイをためしてみる
それではNATゲートウェイを作成していきましょう。
前提確認として、プライベートサブネットのEC2からインターネットへ接続できないことをみておきます。
[ec2-user@ip-10-0-1-91 ~]$ curl https://chiritsumo-life.com
curl: (7) Failed to connect to chiritsumo-life.com port 443: Connection timed out
想定通りcurlの応答がありませんね。
NATゲートウェイ作成
AWS管理コンソール VPC画面へアクセスし、左側メニュー [NATゲートウェイ] を選択します。
画面右の [NATゲートウェイを作成] ボタンをクリックします。

NATゲートウェイ作成画面 で必要なパラメータを定義していきます。
Nameはお好みでつけましょう。
サブネットは、VPC内のパブリックサブネットを選択します。
そして、NATゲートウェイはElastic IP(EIP)が必要になります。おそらく作成したことがないかと思いますので、[Elastic IPの割り当て] ボタンをクリックして進めます。


ルーティング設定
NATゲートウェイが作成できましたので、プライベートサブネットのルーティングを変更していきます。
AWSコンソール左側メニュー [ルートテーブル] から前回作成したプライベートサブネット用のルートテーブルを選択し、画面下部 [ルート] タブを確認しましょう。
VPC内のルーティング(local)しかありませんね。

[ルートの編集] ボタンをクリックします。
VPC内アドレス以外のすべて通信をNATゲートウェイに向けるよう設定します。
設定を投入したら [ルートの保存] をクリックします。


NATゲートウェイの必要な設定は以上です。
再掲になりますが、このような構成になりました。

動作確認
それではNATゲートウェイ作成前に試したcurlコマンドを再度実行してみます。
[ec2-user@ip-10-0-1-91 ~]$ curl https://chiritsumo-life.com
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"/>
# 以下略
HTMLが返ってきましたね。
インターネットへ接続できています!
NATゲートウェイとEIPの削除
NATゲートウェイの動作が確認できましたので、課金対象となる不要なリソースは削除します。
NATゲートウェイの削除
まずはNATゲートウェイの削除です。
AWS管理コンソールのVPCページの NATゲートウェイ へアクセスします。
削除対象のNATゲートウェイを選択した状態で、画面右上 アクション から [NATゲートウェイを削除] をクリックします。

確認画面が表示されます。
「削除」と入力した上で [削除] ボタンをクリックします。


これでNATゲートウェイの削除は完了です。
EIPの削除
もうひとつ。
NATゲートウェイ作成時につくったEIPも課金対象となってしまいますのでリリースします。
※EIPについてはまた別途
AWS管理コンソールはVPCページにアクセスしている状態だと思いますので、左側メニュー [Elastic IP] をクリック。
削除対象のEIPを選択した状態で、 アクション から [Elastic IPアドレスの解放] をクリックします。

確認画面が表示されます。
[解放] ボタンをクリックします。


EIPのリリースも完了です。
※EC2の停止もお忘れなく!
まとめ
NATゲートウェイを構成することで、プライベートサブネット上のインスタンスからも、セキュアにインターネットアクセスすることが可能になります。
作成しただけで課金されてしまいますので、AWS学習目的の場合は今後利用することがないかと思いますが、実利用では重要なコンポーネントです。
ぜひ今回の手順は頭の片隅にインプットしておきましょう!
今回は以上です。
それじゃあまたね。