背景
NAT Gatewayは、プライベートサブネットからインターネットへの通信を可能にするために使用されます。しかし、NatGatewayが常に起動されていると、使用されていない時間帯でも課金されるため、コストが高額になってしまいます。
指定された時間帯にのみNAT Gatewayを起動し、必要がなくなったら自動的に削除することで、無駄なコストを削減することを検討しました。例えば、平日の9時から18時までの間にNAT Gatewayを起動して、それ以外の時間帯は自動的に削除することで、年間で数百ドル程度のコストメリットが得られる可能性があります。
「ScheduledNatGateway」Constructの開発
「ScheduledNatGateway」は、AWS CDKを使用して、決まった時刻に対象のパブリックサブネットにNatGatewayを生成及び削除するlambdaを作成するConstructです。また、プライベートサブネットに紐づけるルートテーブルに0.0.0.0/0宛にNatGatewayを指すルートを自動で設定します。
このConstructは開発環境での使用を想定しており、シングルAZ対応となっています。
このライブラリを使用するためには、AWS CDKがインストールされている必要があります。AWS CDKのインストール方法は、公式ドキュメントを参照してください。
Construct Hubのリンクはこちら
インストール方法
「ScheduledNatGateway」はnpmパッケージとして公開されています。以下のコマンドを使用して、インストールすることができます。
$ npm install scheduled-natgateway
使い方
以下のように、CDKのStack内で「ScheduledNatGateway」を使用することができます。
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { ScheduledNatGateway } from 'scheduled-natgateway';
const app = new cdk.App();
const stack = new cdk.Stack(app, 'MyStack');
// Create a VPC with two subnets (public and private)
const vpc = new ec2.Vpc(stack, 'MyVpc', {
cidr: '10.0.0.0/16',
subnetConfiguration: [
{
cidrMask: 24,
name: 'public',
subnetType: ec2.SubnetType.PUBLIC,
},
{
cidrMask: 24,
name: 'private',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
],
});
// Create a NAT Gateway in the public subnet on a schedule
const scheduledNatGateway = new ScheduledNatGateway(stack, 'NatGateway', {
publicSubnetId: vpc.publicSubnets[0].subnetId,
privateSubnetId: vpc.privateSubnets[0].subnetId,
createSchedule: '0 22 * * ? *',
deleteSchedule: '0 10 * * ? *',
});
上記の例では、毎日22時(UTC: JST7時)にNatGatewayを生成し、毎日10時(UTC: JST19時)にNatGatewayを削除するための「ScheduledNatGateway」コンストラクターが呼び出されています。引数には、対象となるパブリックサブネットのID、プライベートサブネットのID、生成する/削除する時刻のcron式が必要です。
結論
「ScheduledNatGateway」を使用することで、AWS CDKを使用して簡単にNatGatewayを自動生成/削除することができます。CDKを使用している場合は、ぜひ使ってみてください!