在尝试启动 Amazon EC2 实例时,它会停止或终止,如何对其进行故障排除?

2 分钟阅读
0

在尝试启动 Amazon Elastic Compute Cloud(Amazon EC2)实例时,它会终止或无法启动。

简短描述

以下原因是 Amazon EC2 实例显示 InternalError(内部错误)消息的最常见原因:

  • 您的 Amazon Elastic Block Store(Amazon EBS)卷未正确附加到实例。
  • 附加到实例的 EBS 卷处于错误状态。
  • 加密 EBS 卷已附加到实例。

如果您的实例没有启动,且没有显示错误代码,请在 AWS 命令行界面(AWS CLI)中运行 describe-instances 命令。然后,指定实例 ID。在 JSON 响应中检查由该命令返回的 StateReason(说明原因)消息。

**注意:**请在 AWS CLI 中输入所有命令。如果在运行 AWS CLI 命令时收到错误,请确保您使用的 AWS CLI 为最新版本

解决方法

EBS 卷未正确附加到实例

您必须将 EBS 根卷以 /dev/sda1/dev/xvda 的格式附加到实例,具体取决于在 API 中定义了哪一个。您不能拥有第二个具有重复或冲突设备名称的 EBS 卷。否则,您将无法停止或启动实例。块设备名称冲突只会影响基于 Xen 的实例类型(c4、m4、t2 等)。块设备名称冲突不会影响基于 Nitro 的实例(c5、m5、t3 等)。

1.    运行 describe-instances API 以验证 StateReason(说明原因)错误消息和错误代码:

$ aws ec2 describe-instances --instance-id i-xxxxxxxxxxxxxxx --region us-east-1 --query "Reservations[].Instances[].{StateReason:StateReason}" --output json

**注意:**请将 us-east-1 替换为您的 AWS 区域。将 i-xxxxxxxxxxxxxxx 替换为您的实例 ID。

如果存在设备名称冲突,您将看到与以下消息类似的输出:

[
    [{
        "StateReason": {
            "Code": "Server.InternalError",
            "Message": "Server.InternalError: Internal error on launch"
        }
    }]
]

2.    打开 Amazon EC2 控制台,然后选择您无法启动的实例。

3.    在 Description(描述)选项卡上,验证并确保设备名称列在设备中。Block devices(块设备)字段会显示所有已附加卷的设备名称。

4.    确认根设备已正确附加,并且没有列出具有相同名称或名称冲突的设备

5.    如果存在具有重复或冲突名称的设备,应分离存在冲突的卷,并对其进行重命名。然后,重新附加具有已更新设备名称的卷

一个附加的 EBS 卷处于错误状态

1.    运行 describe-instances API 以验证 StateReason(说明原因)错误消息和错误代码:

$ aws ec2 describe-instances --instance-id i-xxxxxxxxxxxxxxx --region us-east-1 --query "Reservations[].Instances[].{StateReason:StateReason}" --output json

**注意:**请将 us-east-1 替换为您的 AWS 区域。将 i-xxxxxxxxxxxxxxx 替换为您的实例 ID。

如果存在处于错误状态的已附加 EBS 卷,您将看到与以下消息类似的输出:

[
    [{
        "StateReason": {
            "Code": "Server.InternalError",
            "Message": "Server.InternalError: Internal error on launch"
        }
    }]
]

2.    打开 Amazon EC2 控制台,选择 Volumes(卷),然后验证卷的状态是否为错误。您的选项因处于错误状态的卷是根卷还是辅助卷而有所不同。

如果处于错误状态的卷是辅助卷,则应分离该卷。现在,您可以启动该实例。

如果处于错误状态的卷是根卷,并且您有该卷的快照,请完成以下步骤:

分离该卷

从快照创建一个新卷

使用原始实例的设备名称,将新卷连接到该实例。启动实例。

**注意:**如果您没有处于错误状态的根卷的现有快照,则无法重新启动该实例。您必须启动一个新实例,安装相关的应用程序,然后将其配置为替换旧实例。

附加的卷已加密且存在不正确的 AWS Identity and Access Management(IAM)权限或策略

1.    运行 describe-instances API 以验证 StateReason(说明原因)错误消息和错误代码:

$ aws ec2 describe-instances --instance-id i-xxxxxxxxxxxxxxx --region us-east-1 --query "Reservations[].Instances[].{StateReason:StateReason}" --output json

**注意:**请将 us-east-1 替换为您的 AWS 区域。将 i-xxxxxxxxxxxxxxx 替换为您的实例 ID。

如果存在附加到实例的加密卷,并且存在权限或策略问题,您将收到客户端错误。您将看到与以下消息类似的输出:

[
    [{
        "StateReason": {
            "Code": "Client.InternalError",
            "Message": "Client.InternalError: Client error on launch"
        }
    }]
]

2.    确保想要启动实例的用户拥有正确的 IAM 权限。如果您通过其他服务(如 EC2 Auto Scaling)间接启动实例,还需要确保使用以下配置:

注意:要验证卷是否已加密,请打开 Amazon EC2 控制台,然后选择。已加密的卷会在加密列中显示为已加密


相关信息

在启动附加了加密卷的实例时,实例立即停止运行并显示“client error on launch”(启动时出现客户端错误)错误

为什么我无法启动我的 EC2 实例?

AWS KMS 中的密钥策略

排查实例启动问题 – 实例立即终止

相关视频

AWS 官方
AWS 官方已更新 1 年前