上次更新时间: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 {}
预期输出:
# 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 代理服务器的预期输出:
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=http://hostname:port"
Environment="no_proxy=169.254.169.254"
HTTPS 代理服务器的预期输出:
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 代理服务器的预期输出:
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=http://hostname:port"
Environment="no_proxy=169.254.169.254"
HTTPS 代理服务器的预期输出:
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 代理服务器的预期输出:
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=http://hostname:port"
Environment="no_proxy=169.254.169.254"
HTTPS 代理服务器的预期输出:
Environment="http_proxy=http://hostname:port"
Environment="https_proxy=https://hostname:port"
Environment="no_proxy=169.254.169.254"