🤑

NatInstanceProviderV2を使ってCDK でNATInstanceを作成する

2024/07/28に公開

概要

こちらの記事で NatInstanceProviderを使ってCDKでNATInstanceを作る方法の紹介がされていました。記事にもあるようにNatInstanceProviderは廃止予定でNatInstanceProviderV2を使う必要があります。
https://zenn.dev/rrrraaaaa6/articles/ce8af85303433b

元々NatInstanceを手軽に作れないかというところに関心があったので、deprecatedでないNatInstanceProviderV2を使って自分でNatInstanceの構築をしてみたい思い、やってみました。

注意事項:
他の記事にもありますが、NatInstanceを積極的に勧めたい意図はありません。検証環境やちょっとしたPoCなどで生じる「NATGateway高いよね〜という課題に対する解決策を持つことができるのか」、というのがNatInstanceへのモチベーションになります。

CDKのソースコード

変更点は、

  • NatInstanceProviderをNatInstanceProviderV2に変更
  • instanceをinstanceV2に変更
    たったこれだけでした。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import {
  InstanceClass,
  InstanceSize,
  InstanceType,
  NatInstanceProviderV2,
  NatTrafficDirection,
  Peer,
  Port,
  Vpc,
} from "aws-cdk-lib/aws-ec2";

export class CdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const provider = NatInstanceProviderV2.instanceV2({
      instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.MICRO),
      defaultAllowedTraffic: NatTrafficDirection.OUTBOUND_ONLY,
    });

    const vpc = new Vpc(this, "NatInstanceProviderV2VPC", {
      natGateways: 1,
      natGatewayProvider: provider,
    });

    provider.securityGroup.addIngressRule(
      Peer.ipv4(vpc.vpcCidrBlock),
      Port.tcp(443)
    );
  }
}

内容に差がないですが、こちらのリポジトリに置いておきます。
https://github.com/kodai305/cdk-nat-instance-provider-v2

作成されたリソースについて

あっさりと今回の目的は達成できたのですが、これだと参考にした元記事と変わらなさすぎるのでどういうリソースができるか出来るか軽くみて行きたいと思います。

今回作成するリソースはこのような構成です。

リソースマップ

  • PrivateSubnetとPublicSubnetが2つできています
  • このリソースマップで見ると、PrivateSubnetからはインターネットに繋がっていないようにも見えます

PrivateSubnetと関連付けされたルートテーブル

  • ルートテーブルでは、0.0.0.0/0宛の通信が、EC2のENIに向いています
  • 今回の設定では、NAT1つなので、2つのPrivateSubnetが同一のEC2のENI向きになっています

EC2(NatInstance)

  • EC2の一覧で今回作成したEC2を確認することができます。
  • 特記する事項がないのでスクリーンショットは省略します。

AWSコストの面でどれくらいメリットが出るか

NatInstanceの料金は、おおよそ、

  • インスタンスタイプ
  • 通信量
  • 起動時間
    で決まります。中身はEC2なのでどのインスタンスタイプにするのかで料金が決まり、通信量は従量課金で課金されます。

起動時間と書いたのが、NATGatewayと大きく異なる点かと思います。
NATGatewayにはスケジュール停止などの概念はないので基本的には常時起動させておくことになり、無理やり夜間のみ止めるとなるとリソースを削除するしか選択肢がありません。

一方でNatInstanceはEC2なので夜間や休日に停止してコストを抑えることが可能です。

検証環境やちょっとしたPoC

で使うことを前提と考えると通信量は無視(考慮してもNATGatewayと差が出ない)して料金の比較をすると、

NatInstanceの料金

  • 約$12/month (t4g.small)
    NATGatewayの料金
  • 約$45/month (1台)

とインスタンスタイプ次第ではあるものの70%ほど節約効果があります。

NAT Instancesのコストに関して詳しく書かれているこちらの記事も参考になると思います。
https://zenn.dev/tsumita7/articles/lets-get-started-nat-instance-2023

まとめ

以上が、CDKでNatInstanceを構築する方法の紹介になります。
実際に動かしてみると思っていたよりもとても簡単に構築することができました。
繰り返しになりますが、NatInstanceの本番環境での利用目的を推奨はしていませんが、コストを抑えることのできる手段の1つとして知っていると役に立つケースもあるのかなと思います。

この記事が誰かの参考になれば幸いです!!

Discussion