在尝试启动 Amazon EC2 实例时,它会停止或终止,如何对其进行故障排除?
在尝试启动 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”(启动时出现客户端错误)错误
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 10 个月前