我有一个使用 AMI 的自动扩展组,该 AMI 具有与其关联的 EBS 卷。每次该组扩展时,都会重新创建这些 EBS 卷。
另外由于某些原因,我对扩展组服务器的生命周期限制为 24 小时。
我发现,虽然 EC2 实例可以很好地进行自我清理,但它会使 EBS 卷处于分离状态。在这个月里,这导致我的 EBS 存储成本激增,因为创建的每个卷的大小为 1 tb。
我正在使用 CDK 创建我的扩展组,但我似乎找不到任何方法来设置所创建资源的保留策略。
有人有办法在实例终止时销毁 EBS 卷吗?
const scalingGroup = new AutoScalingGroup(this, 'ServerScalingGroup', {
vpc,
role,
securityGroup,
minCapacity: 2,
maxCapacity: 20,
requireImdsv2: true,
instanceType: InstanceType.of(InstanceClass.C7I, InstanceSize.XLARGE),
machineImage: MachineImage.lookup({
windows: true,
name: options.ami
}),
healthCheck: HealthCheck.elb({
grace: cdk.Duration.minutes(5)
}),
maxInstanceLifetime: cdk.Duration.days(1),
cooldown: cdk.Duration.minutes(2)
});
我在这里看到两个潜在的解决方案,使用
notifications
或使用 addLifecycleHook()
,但这两个看起来都像是黑客。
当 Application Auto-Scaling 终止 Amazon EC2 实例时,默认情况下它不会自动删除附加到该实例的 Amazon Elastic Block Store (EBS) 卷。此行为是设计使然,原因如下:
数据持久性:EBS 卷旨在提供比 EC2 实例的生命周期更长的持久存储。当实例终止时,用户可能仍希望保留 EBS 卷上的数据以供将来使用、分析、备份或附加到另一个实例。
安全和数据保护:在实例终止时自动删除 EBS 卷可能会导致意外数据丢失。通过不自动删除 EBS 卷,AWS 增加了一层保护,防止意外数据删除。
灵活性:用户有不同的需求和用例。有些人可能希望将数据保留在 EBS 卷上以用于存档目的,而另一些人可能会使用这些卷将数据快速引导到新实例上。 AWS 为用户提供了灵活性,让他们可以决定在实例终止后如何处理 EBS 卷。
但是,AWS 允许用户根据自己的偏好和要求配置此行为。启动 EC2 实例时,您可以指定是否希望在实例终止时删除附加的 EBS 卷。这是通过为附加到实例的每个 EBS 卷设置“终止时删除”标志来完成的。如果此标志设置为 true,则当实例终止时,EBS 卷将自动删除。可以通过 AWS 管理控制台、AWS CLI 或 AWS 开发工具包配置此设置。
使用 CDK,也可以控制此设置。这是示例代码:
import * as cdk from '@aws-cdk/core';
import * as ec2 from '@aws-cdk/aws-ec2';
class DeleteOnTerminationStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Define an Amazon Machine Image (AMI)
const ami = ec2.MachineImage.latestAmazonLinux();
// Create an EC2 instance
const instance = new ec2.Instance(this, 'DeleteOnTerminationInstance', {
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
machineImage: ami,
vpc: new ec2.Vpc(this, 'DeleteOnTerminationVPC', { maxAzs: 2 }), // Create a new VPC or use an existing one
blockDevices: [{
deviceName: '/dev/sdh',
volume: ec2.BlockDeviceVolume.ebs(50, {
deleteOnTermination: true, // Enable the "Delete on Termination" flag
encrypted: true, // Optional: to enable encryption
// You can specify other properties of the EBS volume here
}),
}],
});
}
}
const app = new cdk.App();
new DeleteOnTerminationStack(app, 'DeleteOnTerminationStack');