シェルスクリプトでNATGatewayを自動で作成or削除してみた
privateサブネットにあるEC2インスタンスをインターネット接続するためにNatGatewayを利用するかと思いますが、作成したままですとお金がかかり(※1)、かといって必要なときだけ作成、削除するのは面倒なので、シェルスクリプトを作成しました。
※1 NatGatewayの利用料金について
東京リージョンでNatGatewayを作成して、特に利用せず30日間保持した場合は$32.4かかります。
なお、利用料金は別になります。詳細は下記のサイトを参考にしてみてください。
目次
・環境
・前提条件
・シェルスクリプトの解説
・実行結果
環境
OS:CentOS7
aws cli:2.4.23
シェル:bash
前提条件
前提として、以下の事前準備が必要となります。
- privateサブネットとprivateサブネットへ追加するルートテーブル
- aws cliのインストール&IAMユーザーの認証情報
シェルスクリプトの解説
実行する際は、引数に"enable"もしくは"disable"を指定して実行してください。
- enable:EIP,NatGateway作成&ルートテーブルへ追加
- disable:EIP,NatGateway&ルートテーブルから削除
#!/bin/bash case "$1" in "enable") ############# Create NATGateway ############## ALLOCATION=$(aws ec2 allocate-address | grep AllocationId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/') aws ec2 create-nat-gateway --subnet-id {サブネットID} --allocation-id $ALLOCATION --tag-specifications ResourceType=natgateway,Tags=[{"Key=Name,Value={Natgateway名}"}] sleep 210 NETWORK_INTERFACE=$(aws ec2 describe-addresses | grep NetworkInterfaceId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/') aws ec2 create-route --route-table-id {ルートテーブルID} --destination-cidr-block 0.0.0.0/0 --network-interface-id $NETWORK_INTERFACE ;; ############################################## "disable") ############# Delete NATGateway ############## aws ec2 delete-route --route-table-id {ルートテーブルID} --destination-cidr-block 0.0.0.0/0 ALLOCATION=$(aws ec2 describe-nat-gateways --filter Name=state,Values=available | grep AllocationId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/') NATGATEWAY=$(aws ec2 describe-nat-gateways --filter Name=state,Values=available | grep NatGatewayId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/') aws ec2 delete-nat-gateway --nat-gateway-id $NATGATEWAY sleep 210 aws ec2 release-address --allocation-id $ALLOCATION ;; ############################################## *) echo "Please enter enable or disable.";; esac
・Natgateway作成&ルートテーブルへ追加
ALLOCATION=$(aws ec2 allocate-address | grep AllocationId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/')
NatGatewayを作成する前にまずEIPを作成します。
NatGatewayを作成する際に、作成したEIPの割り当てIDを指定する必要がありますので、変数に代入しています。
aws ec2 create-nat-gateway --subnet-id {サブネットID} --allocation-id $ALLOCATION --tag-specifications ResourceType=natgateway,Tags=[{"Key=Name,Value={NatGateway名}"}]
NatGatewayを作成しています。
事前に作成されているprivateサブネットのサブネットIDを指定します。
NatGateway名は任意の名前を付けてください。
sleep 210
NatGatewayの作成に少々時間がかかりますので、ルートテーブルへの追加までsleepコマンドで一時停止します。
NETWORK_INTERFACE=$(aws ec2 describe-addresses | grep NetworkInterfaceId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/')
先ほど作成したNatgatewayのネットワークインターフェースIDを取得します。
aws ec2 create-route --route-table-id {ルートテーブルID} --destination-cidr-block 0.0.0.0/0 --network-interface-id $NETWORK_INTERFACE
事前に作成したprivateサブネットのルートテーブルへNatGatewayを追加します。
・Natgateway削除&ルートテーブルから削除
aws ec2 delete-route --route-table-id {ルートテーブルID} --destination-cidr-block 0.0.0.0/0
privateサブネットのルートテーブルからNatGatewayを削除します。
ALLOCATION=$(aws ec2 describe-nat-gateways --filter Name=state,Values=available | grep AllocationId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/') NATGATEWAY=$(aws ec2 describe-nat-gateways --filter Name=state,Values=available | grep NatGatewayId | awk '{print$2}' | sed 's/^.*"\(.*\)".*$/\1/')
作成したNatGatewayを削除するためにEIPの割り当てIDとNATGatewayのIDをそれぞれ変数に代入しています。
aws ec2 delete-nat-gateway --nat-gateway-id $NATGATEWAY
NatGatewayを削除します。
sleep 210
ここも時間がかかりますので、一時停止します。
aws ec2 release-address --allocation-id $ALLOCATION
最後にEIPを開放します。