AWS CDK v2でNATインスタンスがあるのにIsolatedサブネットとして認識された話

このエントリーはコモン・クリエーション合同会社の提供でお送りします

ギョームの話だから一応クレジットを入れて免罪符にしておく


AWS CDK v2を使って、既存VPCのサブネットを取得する話。
ぶっちゃけるとデフォルトVPC。

  • VPC
    • Public Subnet
      • ap-northeast-1a
      • ap-northeast-1c
      • ap-northeast-1d
    • Isolated Subnet
      • ap-northeast-1a
      • ap-northeast-1c
      • ap-northeast-1d
    • Private Subnet with NAT
      • ap-northeast-1a

のような構成で、Isolated SubnetPrivate Subnet with NATは手作業で作られた状態。
NATはNATゲートウェイではなく、NATインスタンスを使っていて、コストをケチっている。

ここで、以下のようなVPCモジュールがあるとする。

import { aws_ec2 } from "aws-cdk-lib";
import { Construct } from "constructs";
import { Options } from "../lib/option";

export interface VpcOptions extends Options {}

export class VPC {
  public vpc: aws_ec2.IVpc;
  public publicSubnets: aws_ec2.SelectedSubnets;
  public privateSubnets: aws_ec2.SelectedSubnets;

  constructor(scope: Construct, option: VpcOptions) {
    this.vpc = aws_ec2.Vpc.fromLookup(scope, "VPC", {
      isDefault: true,
    });
    
    this.publicSubnets = this.vpc.selectSubnets({
      subnetType: aws_ec2.SubnetType.PUBLIC,
    });

    this.privateSubnets = this.vpc.selectSubnets({
      subnetType: aws_ec2.SubnetType.PRIVATE_WITH_EGRESS,
    });
  }
}

これを使ってcdk deployをすると、

Error: There are no 'Private' subnet groups in this VPC. Available types: Isolated,Public

のエラーで死ぬ。

CDKのソースを読んでみると、NATゲートウェイ云々は書かれているが、NATインスタンスでもOKとは明記されていない。
ただし、VPC作成でnatGatewayProviderを指定すればNATインスタンスにできるので、この指定がダメとも考えづらい。
cdk.context.jsonを消せというissueの回答もあったが、特に変化なし。

あれこれして解決した方法としては、対象のサブネットのタグに

aws-cdk:subnet-type: Private

を指定して、CDKを騙せばうまくいく。
なんかもにょる。

CleanShot_2023-01-17_00.00.43.png