如何排查当我配置 SSM Agent 以使用代理来管理我的 Amazon EC2 实例时遇到的问题?

上次更新时间:2021 年 4 月 20 日

当我将代理与 SSM Agent 结合使用以通过 AWS Systems Manager 来管理 Amazon Elastic Compute Cloud (Amazon EC2) 实例时,我遇到了错误。如何排查代理问题?

简短描述

您可以使用 Systems Manager 来管理您的 Amazon EC2 实例。但如果实例位于代理后面,则必须将 SSM Agent 配置为通过您的代理与 Amazon 终端节点进行通信。如果 SSM Agent 配置不正确,您将收到与以下类似的错误消息:

Post https://ssm.RegionID.amazonaws.com/: proxyconnect tcp: dial tcp xxx.xxx.xxx.xxx:yyyy: i/o timeout

解决方法

要排查代理问题,请执行以下步骤:

验证 EC2 实例是否可以访问您的代理服务器

EC2 Windows 实例

您可以使用以下 Windows PowerShell 命令来验证与代理之间的连接。在以下示例中,请将 hostname 替换为您的代理主机名,然后将 port 替换为您的代理端口。

> Test-NetConnection hostname -port port

预期输出:

ComputerName     : hostname
RemoteAddress    : xxx.xxx.xxx.xxx
RemotePort       : port
InterfaceAlias   : Ethernet
SourceAddress    : YYY.YYY.YYY.YYY
TcpTestSucceeded : True
PS C:\Windows\system32>

EC2 Linux 实例

您可以使用以下 telnet 或 netcat 命令来验证与代理之间的连接。在以下示例中,请将 hostname 替换为您的代理主机名,然后将 port 替换为您的代理端口。

Telnet

$ telnet hostname port

预期输出:

Trying xxx.xxx.xxx.xxx...
Connected to hostname.
Escape character is '^]'.

Netcat

$ nc -vz hostname port'

预期输出:

Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to xxx.xxx.xxx.xxx:YYYY.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

注意:Amazon EC2 实例没有预装 Netcat。要手动安装 Netcat,请参阅 Nmap 网站上的 Ncat

验证您的 EC2 实例是否可以通过代理服务器到达 Systems Manager 终端节点

运行以下命令以确认您的实例可以通过代理服务器到达 Systems Manager 终端节点。收到 http 错误代码 4xx 表示您可以通过代理服务器到达终端节点。

注意:在以下命令示例中,请将 RegionID 替换为您的 AWS 区域,将 hostname 替换为您的代理主机名,并将 port 替换为您的代理端口。

EC2 Windows 实例

> (invoke-webrequest https://ssm.RegionID.amazonaws.com -DisableKeepAlive -UseBasicParsing -Method head -Proxy http://hostname:port )

预期输出:

invoke-webrequest : The remote server returned an error: (404) Not Found.

EC2 Linux 实例

$  curl -k --proxy http://hostname:port -m 5 -s -o /dev/null -w "%{http_code}" https://ssm.RegionID.amazonaws.com

预期输出:

404

验证 SSM Agent 是否配置为使用您的代理信息

EC2 Windows 实例

您必须检查 SSM Agent 日志,以验证是否应用了代理设置,如以下示例所示。运行以下命令:

> type C:\ProgramData\Amazon\SSM\Logs\amazon-ssm-agent.log | findstr -i "proxy"

预期输出:

2021-03-18 19:06:16 INFO Getting IE proxy configuration for current user: The operation completed successfully.
2021-03-18 19:06:16 INFO Getting WinHTTP proxy default configuration: The operation completed successfully.
2021-03-18 19:06:16 INFO Proxy environment variables:
2021-03-18 19:06:16 INFO http_proxy: hostname:port
2021-03-18 19:06:16 INFO https_proxy:
2021-03-18 19:06:16 INFO no_proxy: 169.254.169.254

有关更多信息,请参阅配置 SSM Agent 以将代理用于 Windows Server 实例

EC2 Linux 实例

首先运行以下命令,以通过检查进程环境变量来验证 SSM Agent 当前是否使用所需的代理变量:

sudo cat /proc/$(pidof amazon-ssm-agent)/environ | xargs -0 -L1 -I{} echo {}

预期输出:

[root@host123~]# sudo cat /proc/$(pidof amazon-ssm-agent)/environ | xargs -0 -L1 -I{} echo {}
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
http_proxy=http://Hostname:Port
https_proxy=http://Hostname:Port
no_proxy=169.254.169.254

然后,如果输出不包含代理变量,则根据您的实例类型,按照以下指南验证和更新相关文件。

基于 Ubuntu 14.04 等 upstart 环境的 EC2 Linux 实例

验证 amazon-ssm-agent.override 文件是否包含所需的配置。输入以下命令并确认您的输出与示例预期输出一致。有关更多信息,请参阅配置 SSM Agent 以使用代理 (upstart)

重要提示:如果您更新了 amazon-ssm-agent.override 文件,请务必在编辑该文件后重新启动 SSM Agent。

$ cat  /etc/init/amazon-ssm-agent.override

HTTP 代理服务器的预期输出:

env http_proxy=http://hostname:port
env https_proxy=http://hostname:port
env no_proxy=169.254.169.254

HTTPS 代理服务器的预期输出:

env http_proxy=http://hostname:port
env https_proxy=https://hostname:port
env no_proxy=169.254.169.254

基于 Ubuntu 16.04 或更高版本并使用快照安装了 SSM Agent 的 EC2 Linux 实例

输入以下命令并确认代理信息与示例预期输出一致。有关更多信息,请参阅配置 SSM Agent 以使用代理 (systemd)

重要提示:如果您更新了 amazon-ssm-agent.override 文件,请务必在编辑该文件后重新启动 SSM Agent。

$ cat /etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d/override.conf

HTTP 代理服务器的预期输出:

[Service]
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=http://hostname:port"
Environment="no_proxy=169.254.169.254"

HTTPS 代理服务器的预期输出:

[Service]
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=https://hostname:port"
Environment="no_proxy=169.254.169.254"

基于 Amazon Linux 2 的 EC2 Linux 实例

输入以下命令并确认代理信息与示例预期输出一致。有关更多信息,请参阅配置 SSM Agent 以使用代理 (systemd)

重要提示:如果您更新了 amazon-ssm-agent.override 文件,请务必在编辑该文件后重新启动 SSM Agent。

$ cat /etc/systemd/system/amazon-ssm-agent.service.d/override.conf

HTTP 代理服务器的预期输出:

[Service]
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=http://hostname:port"
Environment="no_proxy=169.254.169.254"

HTTPS 代理服务器的预期输出:

[Service]
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=https://hostname:port"
Environment="no_proxy=169.254.169.254"

基于其他操作系统的 EC2 Linux 实例

输入以下命令并确认代理信息与示例预期输出一致。有关更多信息,请参阅配置 SSM Agent 以使用代理 (systemd)

重要提示:如果您更新了 amazon-ssm-agent.override 文件,请务必在编辑该文件后重新启动 SSM Agent。

$ cat /etc/systemd/system/amazon-ssm-agent.service.d/amazon-ssm-agent.override

HTTP 代理服务器的预期输出:

[Service]
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=http://hostname:port"
Environment="no_proxy=169.254.169.254"

HTTPS 代理服务器的预期输出:

[Service]
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=https://hostname:port"
Environment="no_proxy=169.254.169.254"

这篇文章对您有帮助吗?


您是否需要账单或技术支持?