Run fleet with on demand instance across AZ

0

Hello,
I wanted to start EC2 fleet with on-demand instances only, and I wanted them to be distributed across availability zones. Unfortunately, I couldn't find a way to do that, and all the instances are always started in a single AZ.
That is not a problem with spot instances, as they spawn in all the AZ.
I was trying to try different allocation strategies and priorities, but nothing helped.
I was trying to do so in AWS-CDK, using both CfnEC2Fleet link as well as CfnSpotFleet link. Bellow is my code.
Is there way how to achieve that, or do I need to use something else?
Thank you.

const spotFleet = new CfnSpotFleet(stack, 'EC2-Fleet', {
    spotFleetRequestConfigData: {
        allocationStrategy: 'lowestPrice',
        targetCapacity: 8,
        iamFleetRole: fleetRole.roleArn,
        spotMaintenanceStrategies: {
            capacityRebalance: {
                replacementStrategy: 'launch-before-terminate',
                terminationDelay: 120,
            }
        },
        onDemandTargetCapacity: 4,
        instancePoolsToUseCount: stack.availabilityZones.length,
        launchTemplateConfigs: [{
            launchTemplateSpecification: {
                launchTemplateId: launchTemplate.launchTemplateId,
                version: launchTemplate.latestVersionNumber,
            },
            overrides: privateSubnets.map(subnet => ({
                availabilityZone: subnet.subnetAvailabilityZone,
                subnetId: subnet.subnetId,
            })),
        }],
    }
});

const ec2Fleet = new CfnEC2Fleet(stack, 'EC2-EcFleet', {
    targetCapacitySpecification: {
        totalTargetCapacity: 6,
        onDemandTargetCapacity: 6,
        defaultTargetCapacityType: 'on-demand',
    },
    replaceUnhealthyInstances: true,
    onDemandOptions: {
        allocationStrategy: 'prioritized',
    },
    launchTemplateConfigs: [{
        launchTemplateSpecification: {
            launchTemplateId: launchTemplate.launchTemplateId,
            version: launchTemplate.latestVersionNumber,
        },
        overrides: privateSubnets.map(subnet => ({
            availabilityZone: subnet.subnetAvailabilityZone,
            subnetId: subnet.subnetId,
        })),
    }]
});

Where launchTemplate is instance of LaunchTemplate and privateSubnets is array of Subnet instances, one for each AZ.

質問済み 2年前256ビュー
1回答
0

Hello!

On-Demand Fleets, unlike Spot Fleets, do not spread across availability zones by default. The best way you could achieve a similar effect with On-Demand instances would be to use On-Demand Capacity Reservations across multiple AZs.

Here's the CDK documentation on ODCRs:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.CfnCapacityReservation.html

You will want these capacity reservations to be referenced by the Launch Template you are using for your On-Demand Fleet. You can do that by adding them to the launchTemplateData portion of the template.

This guide goes through the steps for setting up such reservations and adding them to the template, though this uses the AWS CLI rather than the CDK: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-launch-on-demand-instances-using-targeted-capacity-reservations-walkthrough.html

One final note: Don't confuse these with the CfnCapacityReservationFleet object. These do create Capacity Reservation Fleets, but such fleets only exist in a single AZ. For multi-AZ setups, creating separate capacity reservations and referencing them in the launch template is best.

Hope this helps!

Mark_G
回答済み 9ヶ月前
AWS
サポートエンジニア
レビュー済み 9ヶ月前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン

関連するコンテンツ