EC2 AutoScalingGroup 在实例终止后保留 EBS 卷

问题描述 投票:0回答:1

我有一个使用 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()
,但这两个看起来都像是黑客。

amazon-ec2 aws-cdk amazon-ebs
1个回答
0
投票

当 Application Auto-Scaling 终止 Amazon EC2 实例时,默认情况下它不会自动删除附加到该实例的 Amazon Elastic Block Store (EBS) 卷。此行为是设计使然,原因如下:

  1. 数据持久性:EBS 卷旨在提供比 EC2 实例的生命周期更长的持久存储。当实例终止时,用户可能仍希望保留 EBS 卷上的数据以供将来使用、分析、备份或附加到另一个实例。

  2. 安全和数据保护:在实例终止时自动删除 EBS 卷可能会导致意外数据丢失。通过不自动删除 EBS 卷,AWS 增加了一层保护,防止意外数据删除。

  3. 灵活性:用户有不同的需求和用例。有些人可能希望将数据保留在 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');

© www.soinside.com 2019 - 2024. All rights reserved.