⚠️ このエントリーは1年以上前に作成されたものです。情報の賞味期限切れにご注意ください。
このエントリーはコモン・クリエーション合同会社の提供でお送りします
ギョームの話だから一応クレジットを入れて免罪符にしておく
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
 
 
 - Public Subnet
 
のような構成で、Isolated SubnetとPrivate 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,
    });
  }
}TypeScriptこれを使ってcdk deployをすると、
Error: There are no 'Private' subnet groups in this VPC. Available types: Isolated,PublicPlaintextのエラーで死ぬ。
CDKのソースを読んでみると、NATゲートウェイ云々は書かれているが、NATインスタンスでもOKとは明記されていない。
ただし、VPC作成でnatGatewayProviderを指定すればNATインスタンスにできるので、この指定がダメとも考えづらい。cdk.context.jsonを消せというissueの回答もあったが、特に変化なし。
あれこれして解決した方法としては、対象のサブネットのタグに
aws-cdk:subnet-type: PrivatePlaintextを指定して、CDKを騙せばうまくいく。
なんかもにょる。


