1.はじめに
以下記事に感化され、
開発環境のNAT GatewayをNAT InstanceにしてAWS利用費を削減した話
確かに、開発環境や学習用環境はNAT GatewayをNAT Instanceに代えたらAWS利用費を削減できそう!
と思い手順を検証してみました。
某C社様のブログにはいつもお世話になっております。
あと、公式ドキュメントの手順で簡単にできるだろうと思っていたら
案外、躓くポイントがありました。
NATインスタンスとは?
- NATインスタンスの基本
AWS公式ドキュメント:NAT インスタンス- NAT インスタンスにはインターネットアクセスが必要
- パブリックサブネットに存在し、パブリック IP アドレスまたは Elastic IP アドレスを持っている必要がある。
- NAT AMI を作成し、NAT インスタンスのセキュリティグループを作成してから起動する。
- NATゲートウェイとNATインスタンスの比較については以下を参照
AWS公式ドキュメント:NAT ゲートウェイと NAT インスタンスを比較する
2. 事前準備
2.1. VPC を作成する
-
VPC作成します。
-
Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。
-
[VPC の作成] を選択し、「VPC など」 を選択します。
- VPC 名を入力:Nat-test
- アベイラビリティーゾーンの数:1
- パブリックサブネットの数:1
- プライベートサブネットの数:1
2.2. セキュリティグループを作成
-
セキュリティグループ名:Nat-instance-sg
-
インバウンドルール:
タイプ ポート ソース ssh 22 マイIP http 80 プライベートサブネットのCIDR https 443 プライベートサブネットのCIDR
2.3. NAT AMIを作成
警告
AWS公式ドキュメントの手順には、この後NAT AMIを作成すると書いてありますが、
インスタンスをAMIにして再作成しなくても、手順のコマンド実行すれば
NATインスタンスとして機能するため割愛します。
※イメージ化するとお金が余計にかかってしまうデメリットもあります。
3.NAT インスタンスの作成
-
インスタンスを起動します。
項目 値 名前 Nat-instance-1 AMI Amazon Linux 2023 インスタンスタイプ T3.micro ネットワーキング設定 VPC、パブリックサブネットを選択 パブリックIPの自動割当て 有効 セキュリティグループ Nat-instance-sg -
ssh接続し、次のコマンドを実行して、iptables を有効にします。
sudo yum install iptables-services -y sudo systemctl enable iptables sudo systemctl start iptables
-
viを使用し、設定ファイルを作成します。
-
次のコマンドを実行します。
netstat -i
-
プライマリENI名を控えておきます。
プライマリENI:enX0
-
次のコマンドを実行して、NAT を設定します。
sudo /sbin/iptables -t nat -A POSTROUTING -o enX0 -j MASQUERADE sudo /sbin/iptables -F FORWARD sudo service iptables save
-
プライベートルートテーブルのルートを追加します。
送信先 ターゲット 0.0.0.0/0 Nat-instance-1(i-098ecb6fcdedf6204) -
送信元/送信先チェックを無効にします。
4. NAT インスタンスをテストする
4.1. テスト準備
-
プライベートサブネットにインスタンスを作成します。
項目 値 名前 test-private-ec2 AMI Amazon Linux 2023 インスタンスタイプ T3.micro ネットワーキング設定 VPC、プライベートサブネットを選択 -
test-private-ec2用のセキュリティグループを作成
インバウンドルールタイプ ソース すべてのICMP ipv4 VPCのCIDR -
「Nat-instance-sg」のインバウンドルールにICMPへの許可を追加します。
インバウンドルールタイプ ソース すべてのICMP ipv4 VPCのCIDR
4.2. NATインスタンスでgoogle.comにpingを送信
4.3. プライベートEC2からgoogle.comにpingを送信
-
Natインスタンスに接続します。
以下コマンド実行#.sshディレクトリへ移動します。 cd .ssh #キーペアを配置 #ローカルのキーペア「Nat-test.pem」の中身をコピーして保存します。 vi Nat-test.pem #権限を修正して使用可能にします。 chmod 400 Nat-test.pem
-
プライベートサブネットのec2にssh接続します。
警告
AWS公式ドキュメントの手順には、NAT インスタンスから、プライベートサブネットのインスタンスに接続するコマンドとして以下が提供されています。
ssh ec2-user@private-server-private-ip-address
このコマンドでは下記エラーが発生してssh接続できない為、注意が必要です。
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
.
ssh -i "Nat-test.pem" ec2-user@10.0.129.147
-
NATインスタンス宛にpingを実行します。
ping 10.0.1.217
-
google.com宛にpingを実行します。
ping google.com
NATインスタンス経由でインターネットに接続出来ました
以上でNATインスタンスの作成およびテスト手順は終わりです。
5. 終わりに
公式ドキュメントの手順では、所々エラーが発生する箇所があって大変でした(汗
※特に、NATインスタンスからプライベートインスタンスへのssh接続のところ
何と言っても、NATインスタンスを使うメリットは費用が安いことです。
顧客に提供する環境で使えるかというと、保守等の人件費とか色々あると思うのでそこは要検討です。
この記事がお役に立てれば幸いです。
お読みいただきありがとうございました!
6.参考文献
【Developers IO】
開発環境のNAT GatewayをNAT InstanceにしてAWS利用費を削減した話
【AWS公式ドキュメント】
NAT インスタンス
NAT ゲートウェイと NAT インスタンスを比較する