You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java SDK停止ELB中EC2实例时实例被终止的问题咨询

回答你的EC2实例停止后被终止的问题

这确实是一种可能出现的行为,但它不是EC2的默认行为——问题大概率出在你的实例的「实例启动关机行为」配置上,或者如果实例属于Auto Scaling组的话,也可能是Auto Scaling的策略在起作用。

为什么停止后会被终止?

主要有两个常见原因:

  • 实例的InstanceInitiatedShutdownBehavior属性被设为terminate:这个属性控制当实例主动发起关机(比如通过你的Java SDK调用stopInstances,或者实例内部执行关机命令)时,AWS会执行的操作。默认值是stop,但如果被修改为terminate,停止操作就会直接触发实例终止。
  • 实例属于Auto Scaling组(ASG):如果你的EC2实例是Auto Scaling组的一部分,当实例进入stopped状态时,Auto Scaling会认为这个实例不健康,会自动终止并替换它——这是ASG保持期望容量的默认策略。

如何阻止实例被终止,保持停止状态?

分两种情况处理:

1. 调整实例的关机行为配置

你可以通过AWS控制台、CLI或者你的Java SDK修改这个属性,把它改回stop:

用Java SDK(以AWS SDK for Java 2.x为例)的代码示例:

import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.ModifyInstanceAttributeRequest;
import software.amazon.awssdk.services.ec2.model.AttributeValue;

public class ModifyShutdownBehavior {
    public static void main(String[] args) {
        String instanceId = "i-xxxxxxxxx"; // 替换成你的实例ID
        try (Ec2Client ec2 = Ec2Client.create()) {
            ModifyInstanceAttributeRequest request = ModifyInstanceAttributeRequest.builder()
                    .instanceId(instanceId)
                    .instanceInitiatedShutdownBehavior(AttributeValue.builder().value("stop").build())
                    .build();
            ec2.modifyInstanceAttribute(request);
            System.out.println("实例关机行为已修改为stop");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

验证修改是否成功:

可以调用describeInstances接口,检查实例的InstanceInitiatedShutdownBehavior值是否为stop:

// 简化示例
DescribeInstancesResponse response = ec2.describeInstances(r -> r.instanceIds(instanceId));
String behavior = response.reservations().get(0).instances().get(0).instanceInitiatedShutdownBehavior();
System.out.println("当前关机行为:" + behavior);

2. 如果实例属于Auto Scaling组

你需要调整Auto Scaling组的配置,避免它终止停止状态的实例:

  • 暂停Auto Scaling组的终止进程:可以通过控制台或者SDK调用suspendProcesses方法,暂停Terminate进程(注意:这会让ASG不再自动终止任何实例,需要根据你的业务场景评估)。
  • 修改ASG的健康检查设置:如果ASG的健康检查把stopped状态判定为不健康,你可以调整健康检查的类型或者阈值,或者配置ASG忽略特定状态的实例。不过更推荐的是,如果需要长期保持实例停止,考虑把实例从ASG中移除,再修改关机行为。

总结

先检查实例的InstanceInitiatedShutdownBehavior属性,确保它是stop;如果实例在Auto Scaling组里,还要调整ASG的策略。这样就能让你的实例在调用停止API后保持停止状态,而不是被终止。

内容的提问来源于stack exchange,提问作者AsteriK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:23