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.

asked 2 years ago247 views
1 Answer
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
answered 8 months ago
AWS
SUPPORT ENGINEER
reviewed 8 months ago

You are not logged in. Log in to post an answer.

A good answer clearly answers the question and provides constructive feedback and encourages professional growth in the question asker.

Guidelines for Answering Questions