aws-ecs-pattern の ApplicationBalancedFargetService でのコスト削減法

CDKで @aws-cdk/aws-esc-pattern を使ってサクッとFagateで安くコンテナ建てたかったのですが、

    import * as ecr from '@aws-cdk/aws-ecr';
    import * as ecsPatterns from '@aws-cdk/aws-ecs-patterns';
    import * as ecs from '@aws-cdk/aws-ecs';

    const service = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Fargate', {
      taskImageOptions: {
        image: ecs.ContainerImage.fromEcrRepository(ecr.Repository.fromRepositoryName(this, 'Repository', 'my_repository'))
      },
      cpu: 512,
      memoryLimitMiB: 1024,
    });

とかやると、プライベートサブネットでコンテナが建ちます。 プライベートサブネットは自動的にNATゲートウェイを伴い、生きている間じゅう時間課金が発生して個人プロジェクトではつらいので、プライベートサブネットを作らない方法を検討していました。

assignPublicIPtrue にすると、 taskSubnets のデフォルトが変わると記載がある

Type: SubnetSelection (optional, default: Public subnets if assignPublicIp is set, otherwise the first available one of Private, Isolated, Public, in that order.)

ので、 true にしてデプロイしてみたところ、空のプライベートサブネットができてしまいました。

NATゲートウェイを作成しない正解は、VPCを直接生成することのようです。

    import * as ec2 from '@aws-cdk/aws-ec2';
    import * as ecr from '@aws-cdk/aws-ecr';
    import * as ecs from '@aws-cdk/aws-ecs';
    import * as ecsPatterns from '@aws-cdk/aws-ecs-patterns';

    const vpc = new ec2.Vpc(this, 'VPC', { 
      natGateways: 0,
      subnetConfiguration: [
        { cidrMask: 24, subnetType: ec2.SubnetType.PUBLIC, name: 'ingress' }
      ] });

    const service = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Fargate', {
      taskImageOptions: {
        image: ecs.ContainerImage.fromEcrRepository(ecr.Repository.fromRepositoryName(this, 'Repository', 'asset_tracker'))
      },
      cpu: 512,
      memoryLimitMiB: 1024,
      assignPublicIp: true,
      vpc
    });

このように vpc を直接していすると、そのコンストラクタで natGateways の数を直接指定できます。 この場合、PUBLICなサブネットと、ISOLATEDなサブネット(外との通信不可; プライベートサブネットでは中から外への通信はOK) ができますが、 ISOLATEDなサブネットの方には現状何も置いていないので、 subnetConfiguration を指定して作成しないようにしました。