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ゲートウェイを伴い、生きている間じゅう時間課金が発生して個人プロジェクトではつらいので、プライベートサブネットを作らない方法を検討していました。
assignPublicIP を true
にすると、
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
を指定して作成しないようにしました。