fu3ak1's tech days

何事もシンプルに。主にAWS関連の記事を書いています

NAT Gatewayを定期的に削除/作成するCloudFormationテンプレート

作りました。詳しい使い方はREADME.mdに記載しています。

github.com

以前書いた記事のとおり、VPC上には停止できずに存在するだけで料金がかかってしまうリソースがいくつかありますが、NAT Gatewayもそのうちの1つです。1時間あたり0.062USDの料金がかかります。これはEC2で言うとt3.medium(1時間あたり0.0544USD)より少し高いくらいですね。

t3.mediumのインスタンスをあげっぱなしって考えると、ちょっと高く感じないでしょうか?(私がケチなだけ?) 検証用であまり料金を使いたくない場合や、VPCを多く作成する場合はもったいないかなという印象です。

それに加え、NAT Gateway(=インターネットに通信する経路)って24時間365日で必要な場合ってあまり無いのかなという印象です。検証用であれば作業中のみ、パッチ適用などであれば夜間の一時的など。

ということでもう少し気軽にNAT Gatewayの削除/作成を出来たら良いなと思いテンプレートを作成してみました。ELBのように細かな設定がある訳でも無いので定期的に削除しても問題ないかと思います。

テンプレートの動作について

下の図の赤枠部分を削除・作成しているだけです。デフォルトでは平日(祝日含まず)の24時に削除を行い、平日の朝6:00に作成処理が行われます。CloudWatch Eventを使用してLambdaを定期的に実行しています。

※EIPの削除(解放)は定期的に実行していません。解放中わずかに料金が発生しますが(1時間あたり0.005USD)、固定のIPとして確保したい要件が多いと思いそうしています。

f:id:fu3ak1:20200728133119p:plain
「NAT Gatewayありの状態(平日日中)」

f:id:fu3ak1:20200728133238p:plain
「NAT Gatewayなしの状態(平日夜間、土日祝日)」

NAT Gatewayはルートテーブルとセットで使用するため、ルートテーブルの設定追加と削除も合わせて実行しています。 CloudFormationテンプレートのインプット値としては、作成、削除の時刻、対象のリソースを決定するために以下の3種類を入力するようにしています。 ※GitHubのREADME.mdにも記載しています。

  1. NAT Gatewayに付与するElastic IPの割り当てID
  2. NAT Gatewayを配置するサブネットID
  3. NAT Gatewayへ宛先0.0.0.0/0でルーティングを設定するルートテーブルID

先ほどの図で言うと下記青枠3か所のIDになります。

f:id:fu3ak1:20200728134955p:plain
テンプレートで指定するID3か所

どれくらい安くなるのか?

7月の平日夜間(6時間)、土日祝日にNAT Gatewayを削除していた場合、月あたり22.7USDほど安くなります!うーん、そこまでですね。でもこれでも半額以下です。NAT Gatewayが多くて困ったって方や少しでも料金を減らしたい方、いかがでしょうか。

EC2とRDSの自動停止も

NAT Gatewayではなく、EC2とRDSを定期的に停止・起動するテンプレートもあります。ご参考まで。

github.com