hero_picture
Cover Image for ECS Managed InstanceをSpot Instanceで動かして得してみる

ECS Managed InstanceをSpot Instanceで動かして得してみる

クラウドソリューション事業部の中村です。

Amazon ECSの機能であるECS Managed InstanceがSpot Instanceに対応しました。

Spot Instanceが利用可能になったことにより、運用管理を気にせず、最大90%引きで利用可能になります。

早速、ECS Managed InstanceをSpot Instanceで動かしてみようと思います。

Amazon ECS Managed Instances now supports Amazon EC2 Spot Instances

構成について

vLLMをECSで動かすシンプルな構成です。

言語モデルのホスティングには GPU が必要となるため、Capacity ProviderでGPUインスタンスを指定します。

AWS CDKで構築

AWS CDK v2.219.0からManagedInstancesCapacityProviderが利用できるようになりました。

そのため、今回はAWS CDKを使用して構築していきます。

AWS CDK v2.219.0 Relese note

class ManagedInstancesCapacityProvider (construct) · AWS CDK

1const miCapacityProvider = new ecs.ManagedInstancesCapacityProvider(this, 'MiSpotCapacityProvider', {
2  capacityProviderName: 'vllm-spot-cp',
3  ec2InstanceProfile: instanceProfile,
4  infrastructureRole,
5  securityGroups: [ecsSecurityGroup],
6  subnets: vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }).subnets,
7  instanceRequirements: {
8    vCpuCountMin: 4,
9    memoryMin: cdk.Size.gibibytes(16),
10    acceleratorTypes: [ec2.AcceleratorType.GPU],
11    acceleratorManufacturers: [ec2.AcceleratorManufacturer.NVIDIA],
12    acceleratorCountMin: 1,
13    excludedInstanceTypes: [
14      'g4*',
15    ]
16  },
17});

しかし、現時点(2025/12/29)では、ManagedInstancesCapacityProviderはSpot Instanceの指定ができません。

そのためaddPropertyOverrideを使用します。

すでにPRは提出されています、開発者の皆様ありがとうございます。

feat(ecs): add capacityOptionType (Spot support) to ManagedInstancesCapacityProvider L2 construct

1const cfnCapacityProvider = miCapacityProvider.node.defaultChild as ecs.CfnCapacityProvider;
2cfnCapacityProvider.addPropertyOverride(
3  'ManagedInstancesProvider.InstanceLaunchTemplate.CapacityOptionType',
4  'SPOT'
5);
6cluster.addManagedInstancesCapacityProvider(miCapacityProvider);

動作確認

CloudFrontにアクセスして動作確認します。

親みたいな返事が来て困惑していますw

マネジメントコンソール上からもECS Managed InstanceとSpot Instanceで動作していることが確認できました。

感想・ハマりどころ

配分戦略がない

Spot Fleet のような配分戦略がありません。

一度だけですがg6.12xlargeが起動した時はびっくりしました。

そのため、必要に応じて最大値 (vCpuCountMax / memoryMax) を指定するのが良さそうです。

1const miCapacityProvider = new ecs.ManagedInstancesCapacityProvider(this, 'MiSpotCapacityProvider', {
2  instanceRequirements: {
3    vCpuCountMin: 4,
4+   vCpuCountMax: 8,
5    memoryMin: cdk.Size.gibibytes(16),
6+   memoryMax: cdk.Size.gibibytes(32),
7    acceleratorTypes: [ec2.AcceleratorType.GPU],
8    acceleratorManufacturers: [ec2.AcceleratorManufacturer.NVIDIA],
9    acceleratorCountMin: 1,
10  },
11});

Capacity Provider名の制約

スタック名に依存する話になりますが、スタック名がAWS,ECS,Fargate から始まる場合でcapacityProviderName を指定せずにランダムに生成すると、以下の制限に引っかかってデプロイできないので、ご注意ください。(一敗)

1The specified capacity provider name is invalid.
2Up to 255 characters are allowed, including letters (upper and lowercase), numbers, underscores, and hyphens.
3The name cannot be prefixed with "aws", "ecs", or "fargate".
4Specify a valid name and try again. 

まとめ

ECS Managed Instance で Spot Instance が使えるようになり、手軽にコストを抑えられるようになりました。

想定よりも大きいインスタンスが起動することもありますが、vCpuCountMaxmemoryMax といった上限を適切に設定しておけば、必要以上にリソースの大きなインスタンスが割り当てられることは避けられます。

また、AWS re:Invent 2025 では Lambda Managed Instance が発表されましたが、AWS 内で柔軟な実行環境をユーザーに委ねていく流れが進んでいるように感じます。個人的には、この流れにのって Infrentia / Tranium 搭載インスタンスも ECS Managed Instance に対応してくれると嬉しいところです。

ここまで読んでいただきありがとうございました。

https://github.com/mu7889yoon/examples/tree/main/ecs-managed-instance-spot


👉️ AWS Graviton のことなら acCloud にお任せください!
👉️ AWS Graviton のことなら acCloud にお任せください!