为什么我的 EC2 实例在 Systems Manager 中未显示为托管节点或显示“连接丢失”状态?

4 分钟阅读
0

我的 Amazon Elastic Compute Cloud(Amazon EC2)实例要么断开了连接,要么未显示在 AWS Systems Manager 控制台的 Fleet Manager 下。

解决方法

托管实例是托管节点为 Systems Manager 的 EC2 实例。

要确认您的 EC2 实例是否满足成为托管实例的先决条件,请运行 AWSSupport-TroubleshootManagedInstance Systems Manager Automation 文档。然后,验证您的 EC2 实例是否满足下列要求。

**重要事项:**在整个故障排除步骤中,选择您的 EC2 实例所在的 AWS 区域。

验证 SSM Agent 是否已安装并在实例上运行

确认操作系统支持 Systems Manager 后,验证 AWS Systems Manager Agent(SSM Agent)是否已安装并在实例上运行。

SSM Agent 已预安装在某些 Linux、macOS 和 Windows 亚马逊机器映像(AMI)上。要在未预安装代理的情况下手动安装 SSM Agent,请参阅下列文档:

要验证 SSM Agent 是否正在运行,请使用操作系统特定的命令检查代理状态

验证 SSM Agent 后,运行 ssm-cli 对托管实例可用性进行故障排除。

验证与端口 443 上的 Systems Manager 端点的连接

要验证与端口 443 上的 Systems Manager 端点的连接,必须先考虑操作系统和子网设置。有关按区域划分的 Systems Manager 端点列表,请参阅 AWS Systems Manager endpoints and quotas

**注意:**在示例中,AWS Systems Manager 会话管理器需要 ssmmessages 端点。

EC2 Linux 实例

使用 Telnet 或 Netcat 命令验证与 EC2 Linux 实例端口 443 上端点的连接。

**注意:**运行命令时,请将 RegionID 替换为您实例的区域。

Telnet 命令:

telnet ssm.RegionID.amazonaws.com 443
telnet ec2messages.RegionID.amazonaws.com 443
telnet ssmmessages.RegionID.amazonaws.com 443

Telnet 连接示例:

root@111800186:~# telnet ssm.us-east-1.amazonaws.com 443
Trying 52.46.141.158...
Connected to ssm.us-east-1.amazonaws.com.
Escape character is '^]'.

要退出 Telnet,请按住 Ctrl 键并按 ] 键。输入 quit,然后按 Enter

Netcat 命令:

nc -vz ssm.RegionID.amazonaws.com 443
nc -vz ec2messages.RegionID.amazonaws.com 443
nc -vz ssmmessages.RegionID.amazonaws.com 443

Netcat 未预安装在 EC2 实例上。要手动安装 Netcat,请参阅 Nmap 网站上的 Ncat

EC2 Windows 实例

使用下列 Windows PowerShell 命令来验证与 EC2 Windows 实例端口 443 上端点的连接。

Test-NetConnection ssm.RegionID.amazonaws.com -port 443
Test-NetConnection ec2messages.RegionID.amazonaws.com -port 443
Test-NetConnection ssmmessages.RegionID.amazonaws.com -port 443

公有子网

Systems Manager 端点是公有端点。要解决从公有子网中的实例连接到端点时出现的问题,请确认是否存在以下情况:

私有子网

使用私有 IP 地址私密访问 Amazon EC2 和 Systems Manager API。要解决从私有子网中的实例连接到端点时出现的问题,请确认是否存在以下情况:

  • 实例的路由表将互联网流量路由到 NAT 网关。
  • VPC 端点已配置为访问 Systems Manager 端点。

有关详细信息,请参阅如何创建 VPC 端点,才能在不连接互联网的情况下使用 Systems Manager 管理私有 EC2 实例?

**注意:**每个接口端点都会在提供的子网中创建一个弹性网络接口。

作为私有子网的安全最佳实践,请验证下面的设置:

  • 附加到 VPC 端点网络接口的安全组允许来自附加到实例的安全组的 TCP 端口 443 入站流量。
  • 附加到实例的安全组允许 TCP 端口 443 出站流量流向 VPC 端点网络接口的私有 IP 地址。

验证默认主机管理配置的设置

注意:如果您未使用默认主机管理配置,请跳至验证是否已将正确的 IAM 角色附加到实例部分。

当您配置默认主机管理配置时,Systems Manager 会自动管理没有 AWS Identity and Access Management(IAM)实例配置文件的 EC2 实例。当您配置此功能时,Systems Manager 有权管理您的区域和账户中的所有实例。如果您的用例权限不足,请向默认主机管理配置创建的默认 IAM 角色添加策略。

所有关联的实例必须使用实例元数据服务版本 2(IMDSv2)。要检查您的 IMDSv2 配置,请参阅当 IMDSv1 的使用量为零时检查实例是否切换为 IMDSv2

SSM Agent 版本 3.2.582.0 或更高版本中提供默认主机管理配置功能。要验证 SSM Agent 版本,请参阅 Checking the SSM Agent version number

要验证默认主机管理配置的设置,请完成下面的步骤:

  1. 打开 Systems Manager 控制台
  2. 在导航窗格中,选择 Fleet Manager
  3. 账户管理下拉列表中,选择默认主机管理配置
  4. 确认已启用启用默认主机管理配置设置。

也可以使用以下 AWS 命令行界面(AWS CLI)命令来验证默认主机管理配置的设置:

**注意:**运行命令时,请将 AccountID 替换为您的 AWS 账户 ID。

aws ssm get-service-setting \
--setting-id arn:aws:ssm:RegionID:AccountID:servicesetting/ssm/managed-instance/default-ec2-instance-management-role

设置好默认主机管理配置后,您将收到类似于以下内容的响应:

{
  "ServiceSetting": {
    "SettingId": "/ssm/managed-instance/default-ec2-instance-management-role",
    "SettingValue": "service-role/AWSSystemsManagerDefaultEC2InstanceManagementRole",
    "LastModifiedDate": 1679492424.738,
    "LastModifiedUser": "arn:aws:sts::012345678910:assumed-role/role/role-name",
    "ARN": "arn:aws:ssm:ap-southeast-1:012345678910:servicesetting/ssm/managed-instance/default-ec2-instance-management-role",
    "Status": "Customized"
  }
}

**注意:**如果 SettingValue 的值为 $None,则说明默认主机管理配置未配置成功。

验证默认主机管理配置是否正在使用适当的 IAM 角色

设置默认主机管理配置时,AWSSystemsManagerDefaultEC2InstanceManagementRole 角色是推荐的 IAM 角色。若要使用其他角色,请确保该角色附加了 AmazonSSMManagedEC2InstanceDefaultPolicy IAM 策略。

如果已将实例配置文件附加到 EC2 实例,请删除所有允许 ssm:UpdateInstanceInformation 操作的权限。在使用默认主机管理配置权限之前,SSM Agent 会尝试使用实例配置文件权限。当您允许实例配置文件中的 ssm:UpdateInstanceInformation 操作时,您的实例不会使用默认主机管理配置权限。

验证是否已将正确的 IAM 角色附加到实例

注意:如果使用的是默认主机管理配置,请跳至验证与 IMDS 的连接部分。

要对 Systems Manager 端点发出 API 调用,必须将 AmazonSSMManagedInstanceCore 策略附加到与实例关联的 IAM 角色。如果使用的是自定义 IAM 策略,请确认您的自定义策略使用的是 AmazonSSMManagedInstanceCore 中的权限。此外,请确保 IAM 角色的信任策略允许 ec2.amazonaws.com 代入此角色。

有关详细信息,请参阅 Add permissions to a Systems Manager instance profile (console)

验证与 IMDS 的连接

SSM Agent 必须与实例元数据服务(IMDS)进行通信,以获取有关实例的必要信息。要测试连接,请运行以下 Netcat 命令:

nc -vz 169.254.169.254 80

要验证是否为现有实例设置了 IMDS,请执行以下任一步骤:

  • 打开 Amazon EC2 控制台。在导航窗格中,选择实例,选择您的实例,然后选择操作实例设置修改实例元数据选项。在对话框中,实例元数据服务必须为已启用

  • 在 AWS CLI 中,运行 describe-instances CLI 命令。

    aws ec2 describe-instances --query "Reservations[*].Instances[*].MetadataOptions" --instance-ids i-012345678910

    输出示例:

    [
      [
        {
          "State": "applied",
          "HttpTokens": "optional",
          "HttpPutResponseHopLimit": 1,
          "HttpEndpoint": "enabled",
          "HttpProtocolIpv6": "disabled",
          "InstanceMetadataTags": "disabled"
        }
      ]
    ]
    

    注意: "HttpTokens": "optional" 表示同时支持 IMDSv1 和 IMDSv2。"HttpTokens": "required" 表示支持 IMDSv2。"HttpEndpoint": "enabled" 表示 IMDS 已启用。

如果在实例上使用代理,则代理可能会阻止与元数据 URL 的连接。为避免这种情况,请确保将 SSM Agent 配置为使用代理,并为元数据 URL 设置 no_proxy。要将 SSM Agent 配置为使用代理,请参阅以下文档:

其他故障排除

如果您的实例仍未显示为托管节点或在 Systems Manager 中显示连接丢失,请继续排查 SSM Agent 日志中存在的问题:

  • Linux 和 macOS: SSM Agent 日志位于 /var/log/amazon/ssm 中。
  • Windows: SSM Agent 日志位于 %PROGRAMDATA%\Amazon\SSM\Logs 中。

如果您的实例未向 SSM Agent 报告,请尝试使用 RDP(Windows)或 SSH(Linux)登录,以收集日志。如果无法收集日志,则必须停止实例并分离根卷。然后,将根卷附加到与辅助卷位于同一可用区的另一个实例,从而获取日志。

相关信息

将 Amazon Elastic Block Store(Amazon EBS)卷挂载到实例

将 Amazon EBS 卷与 Linux 实例分离

使 Amazon EBS 卷可在 Linux 上使用

使 Amazon EBS 卷可在 Windows 上使用

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