AWSでプライベートサブネットを利用していると、
- OSアップデート
- パッケージインストール
- 外部リポジトリアクセス
- 一時的なインターネット通信
などのためにNAT Gatewayが必要になることがあります。
しかし、NAT Gatewayは利用有無に関係なく時間課金が発生するため、開発環境や検証環境では意外とコストがかかります。
そこで今回は、
必要な時だけCloudFormationでRegional NAT Gatewayを作成し、不要になったらスタックごと削除する
という運用方法を紹介します。
想定環境
既に以下の環境が存在しているものとします。
VPC
├─ Public Subnet 1
├─ Public Subnet 2
├─ Private Subnet 1
├─ Private Subnet 2
├─ Private Route Table 1
└─ Private Route Table 2
プライベートサブネットからのインターネットアクセスはまだ構成されていません。
構成図
CloudFormation実行前
CloudFormation実行後
Regional NAT Gatewayを利用することで、
- AZごとのEIP管理
- AZカバレッジ管理
をAWSへ任せることができます。
Regional NAT Gatewayとは
従来のNAT Gatewayでは、
AZ-A → NAT Gateway-A
AZ-B → NAT Gateway-B
のようにAZごとにNAT Gatewayを作成する必要がありました。
一方、Regional NAT Gatewayでは、
VPC
└─ Regional NAT Gateway
として構成でき、AWSが内部的にAZカバレッジを管理します。
また、コンソールで表示される
Elastic IP (EIP) 割り当て方法
○ 自動
に相当する構成となります。
注意事項
本テンプレートは既存のRoute Tableへ
0.0.0.0/0 → Regional NAT Gateway
を追加します。
そのため、既に
0.0.0.0/0
のルートが存在する場合は作成に失敗します。
事前にRoute Tableを確認してください。
CloudFormationテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: Temporary Regional NAT Gateway for existing private route tables
###############################################################################
# Parameters
###############################################################################
Parameters:
VpcId:
Type: AWS::EC2::VPC::Id
Description: Target VPC
PrivateRouteTable1Id:
Type: String
Description: Existing private route table ID 1
Default: rtb-xxxxxxxxxxxxxxxxx
PrivateRouteTable2Id:
Type: String
Description: Existing private route table ID 2
Default: rtb-xxxxxxxxxxxxxxxxx
###############################################################################
# Resources
###############################################################################
Resources:
###########################################################################
# Regional NAT Gateway
###########################################################################
RegionalNatGateway:
Type: AWS::EC2::NatGateway
Properties:
ConnectivityType: public
AvailabilityMode: regional
VpcId: !Ref VpcId
Tags:
- Key: Name
Value: temporary-regional-nat-gateway
###########################################################################
# Route Table 1
###########################################################################
PrivateDefaultRoute1:
Type: AWS::EC2::Route
DependsOn:
- RegionalNatGateway
Properties:
RouteTableId: !Ref PrivateRouteTable1Id
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref RegionalNatGateway
###########################################################################
# Route Table 2
###########################################################################
PrivateDefaultRoute2:
Type: AWS::EC2::Route
DependsOn:
- RegionalNatGateway
Properties:
RouteTableId: !Ref PrivateRouteTable2Id
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref RegionalNatGateway
###############################################################################
# Outputs
###############################################################################
Outputs:
NatGatewayId:
Description: Regional NAT Gateway ID
Value: !Ref RegionalNatGateway
スタック作成
CloudFormationコンソールから
CloudFormation
↓
スタックの作成
↓
新しいリソースを使用
を選択します。
パラメータには以下を入力します。
| パラメータ | 例 |
|---|---|
| VpcId | vpc-0123456789abcdef0 |
| PrivateRouteTable1Id | rtb-0123456789abcdef0 |
| PrivateRouteTable2Id | rtb-abcdef0123456789 |
作成完了まで数分程度です。
スタック削除
作業終了後はスタックを削除します。
CloudFormation
↓
対象スタック
↓
削除
CloudFormationが自動的に
- Route削除
- NAT Gateway削除
を実施します。
削除完了後はNAT Gatewayの時間課金も停止します。
NATインスタンスという選択肢もある
NAT Gateway以外に、EC2を利用したNATインスタンスという方法もあります。
Internet
|
IGW
|
NAT Instance
|
Private Subnet
メリット
- 小さいEC2で構築可能
- 利用量が少ない場合は安価
- インスタンス停止で課金停止可能
デメリット
- OS管理が必要
- パッチ適用が必要
- 冗長化を自分で設計する必要がある
- 障害対応も自分で行う必要がある
本番環境ではNAT Gatewayが一般的ですが、個人環境や小規模環境ではNATインスタンスも十分選択肢になります。
まとめ
開発環境や検証環境では、NAT Gatewayを常時起動しておく必要がないケースも少なくありません。
CloudFormation化しておけば、
- 数クリックで作成
- 数クリックで削除
- Git管理可能
- 再利用可能
となり、必要な時だけNAT Gatewayを利用できます。
特にRegional NAT Gatewayを利用すると、AZやEIPの管理をAWSへ任せられるため、よりシンプルな構成で運用できます。

