亚马逊AWS官方博客

排查新版 EC2 串行控制台的启动和联网问题

解决生产问题是系统和网络管理员的主要职责之一。事实上,我一直发现这是基础设施工程中最有趣的内容之一。根据需要深入研究遇到的问题,您不仅能够(最终)圆满解决问题,而且在此过程中还可以学到许多正常情况下无法接触的东西。

操作系统当然也存在这样的机会。随着时间推移,操作系统会变得越来越复杂,管理员必须要掌握无数的配置文件和设置。尽管基础架构即代码和自动化大大改善了服务器的预置和管理,但错误和故障总是难免出现,导致系统无法正常启动。问题的种类数不胜数:缺少硬件驱动程序、文件系统配置错误、网络配置无效、权限不正确等等。而更糟糕的是,许多问题实际上会将管理员拒之门外,让他们无法登录、诊断问题以及执行适当的修复措施。唯一的选择是与服务器建立带外连接。此外,尽管客户可以查看 EC2 实例的控制台输出,但在此之前,他们无法与其进行交互。

今天,我非常高兴地宣布推出 EC2 串行控制台,它通过与您的 Amazon Elastic Compute Cloud (EC2) 实例建立串行连接,从而轻松、安全地排查启动和网络连接问题。

EC2 串行控制台简介
EC2 串行控制台适用于基于 AWS Nitro 系统的 EC2 实例。它支持所有主要的 Linux 发行版、FreeBSD、NetBSD、Microsoft Windows 和 VMWare。

无需任何能够正常运行的网络配置,即可在 AWS 管理控制台中使用基于浏览器的外壳程序或通过到托管的控制台服务器的 SSH 连接,从而连接到实例。无需在您的实例上运行 sshd 服务器:只需为 root 账户分配一个密码,因为您将需要使用此密码来登录。然后,您可以输入命令,如同使用直接连接到实例串行端口的键盘和显示器一样操作。

此外,您还可以触发操作系统特定的流程:

  • 在 Linux 上,您可以触发 Magic SysRq 命令以生成崩溃转储、终止进程等。
  • 在 Windows 上,您可以使用应急管理服务 (EMS) 和特殊管理控制台 (SAC) 中断启动进程,然后以安全模式启动。

获取对实例控制台的访问权限是一项特权操作,应受到严格控制,因此默认情况下不允许在账户级别访问 EC2 串行控制台。在您的账户中允许此访问权限后,它将适用于此账户中的所有实例。借助服务控制策略AWS Identity and Access Management (IAM) 权限,管理员还可以分别在组织级别和实例级别实施控制。正如您期望的那样,与 EC2 串行控制台的所有通信都已加密,并且我们会为每个会话生成一个唯一的密钥。

下面我们用 Linux 来做一个快速演示。使用其他操作系统时的过程也相似。

通过 AWS 管理控制台连接到 EC2 串行控制台
首先,我启动了一个 Amazon Linux 2 实例。登录到该实例后,我决定管理其以太网接口的网络配置 (/etc/sysconfig/network-scripts/ifcfg-eth0),设置一个完全虚构的静态 IP 地址。请不要在生产实例上尝试此操作!

然我重启实例。几秒钟后,尽管实例已在 EC2 控制台中启动并运行,并且端口 22 已在其安全组中打开,但我无法使用 SSH 连接到该实例。

$ ssh -i ~/.ssh/mykey.pem ec2-user@ec2-3-238-8-46.compute-1.amazonaws.com
ssh: connect to host ec2-3-238-8-46.compute-1.amazonaws.com port 22: Operation timed out

EC2 串行控制台力挽狂澜!

首先,我需要在我的账户中允许访问控制台。只需在 EC2 设置中勾选一个框即可完成此操作。

启用控制台

然后在 EC2 控制台中右键单击实例的名称,再选择 Monitor and troubleshoot(监控和问题排查),然后选择 EC2 Serial Console(EC2 串行控制台)。

这时将打开一个新窗口,确认实例 ID 和要连接的串行端口号。我只需单击 Connect(连接)。

这时将会在我的浏览器中打开一个新选项卡。单击 Enter,我将看到熟悉的登录提示。

Amazon Linux 2
Kernel 4.14.225-168.357.amzn2.x86_64 on an x86_64
ip-172-31-67-148 login:

root 身份登录,进入熟悉的 shell 提示界面,我顿时放心不少。

为此会话启用 Magic SysRq (sysctl -w kernel.sysrq=1),我首先列出可用的命令 (CTRL-0 + h),然后要求提供内存报告 (CTRL-0 + m)。您可以单击下面的图片以查看大图。

正在连接到控制台

太棒了! 这在解决复杂问题时肯定会派上用场。当然这里不需要这样做:我快速恢复网络接口的正常配置,然后重新启动网络堆栈。

尝试再次连接到实例,我可以看到问题已经解决。

$ ssh -i ~/.ssh/mykey.pem ec2-user@ec2-3-238-8-46.compute-1.amazonaws.com

__|   __|_  )
_|   (    / Amazon Linux 2 AMI
___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-67-148 ~]$

下面我快速演示以下使用 AWS 命令行界面时的等效命令。

通过 AWS CLI 连接到 EC2 串行控制台
这同样简单。首先,我将实例密钥对的 SSH 公钥发送到串行控制台。请务必要添加 file:// 前缀。

$ aws ec2-instance-connect send-serial-console-ssh-public-key --instance-id i-003aecec198b537b0 --ssh-public-key file://~/.ssh/mykey.pub --serial-port 0 --region us-east-1

然后,我以 <instance id>.port<port number> 为用户名,通过 ssh 连接到串行控制台,并且收到登录提示。

$ ssh -i ~/.ssh/mykey.pem i-003aecec198b537b0.port0@serial-console.ec2-instance-connect.us-east-1.aws

Amazon Linux 2
Kernel 4.14.225-168.357.amzn2.x86_64 on an x86_64
ip-172-31-67-148 login:

登录后,Magic SysRq 已经可用,我可以用 ~B+command 触发它。我还可以使用 ~. 终止控制台会话。

开始使用 EC2 串行控制台
正如您看到的那样,EC2 串行控制台让您能够更方便地调试和修复 EC2 实例上出现的复杂启动和网络问题。您可以立即在以下 AWS 区域开始使用此控制台,且不会产生额外费用:

  • 美国东部(弗吉尼亚北部)美国西部(俄勒冈)美国东部(俄亥俄)
  • 欧洲(爱尔兰)欧洲(法兰克福)
  • 亚太地区(东京)亚太地区(悉尼)亚太地区(新加坡)

请立即试用,并向我们提供反馈。我们一直期待您的反馈。 您可以通过您的常用 AWS Support 联系人,或者通过 面向 Amazon EC2 的 AWS 论坛发送反馈。

– Julien