创建Auto Scaling Group时,如果在未启用生命周期挂钩之前启动实例,可能导致一些问题,需要在启用挂钩之前等待实例就绪。解决方法是在启动实例之前,创建一个Lifecycle Hook并等待。以下是使用AWS CDK创建Lifecycle Hook和等待实例全部就绪的示例代码:
const { AutoScalingGroup, CfnLifecycleHook } = require('aws-cdk-lib/aws-autoscaling');
const { Duration } = require('aws-cdk-lib');
const { Stack, App } = require('aws-cdk-lib');
const app = new App();
const stack = new Stack(app, 'my-stack');
const asg = new AutoScalingGroup(stack, 'my-asg', {
instanceType: 't3.micro',
machineImage: 'ami-0c55b159cbfafe1f0',
desiredCapacity: 2,
maxCapacity: 4,
minCapacity: 2,
});
const lifecycleHook = new CfnLifecycleHook(stack, 'my-lifecycle-hook', {
lifecycleTransition: 'autoscaling:EC2_INSTANCE_LAUNCHING',
autoScalingGroupName: asg.autoScalingGroupName,
defaultResult: 'CONTINUE',
heartbeatTimeout: Duration.minutes(10).toSeconds(),
});
asg.addLifecycleHook(lifecycleHook.node.defaultChild as CfnLifecycleHook);
asg.scaleOnDemand('my-scale-on-demand', {
cooldown: Duration.seconds(60),
maxCapacity: 4,
minCapacity: 2,
estimatedInstanceWarmup: Duration.minutes(5),
});
// Wait until all instances are ready
asg.connections.allowDefaultPortFromAnyIpv4();