AL@のTech Blog

個人用備忘録

シェルスクリプトでNATGatewayを自動で作成or削除してみた

privateサブネットにあるEC2インスタンスをインターネット接続するためにNatGatewayを利用するかと思いますが、作成したままですとお金がかかり(※1)、かといって必要なときだけ作成、削除するのは面倒なので、シェルスクリプトを作成しました。

 

※1 NatGatewayの利用料金について
東京リージョンでNatGatewayを作成して、特に利用せず30日間保持した場合は$32.4かかります。
なお、利用料金は別になります。詳細は下記のサイトを参考にしてみてください。

https://aws.amazon.com/jp/vpc/pricing/

 

目次

・環境
・前提条件
シェルスクリプトの解説
・実行結果

 

環境

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を開放します。