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

3 分钟阅读
0

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

解决方法

托管实例是与 Systems Manager 一起用作托管节点的 EC2 实例。

要确认您的 EC2 实例是否满足成为托管实例的先决条件,请运行 Systems Manager Automation 文档 AWSSupport-TroubleshootManagedInstance。然后,验证您的 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 端点和限额

**注意:**在示例中,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 版本,请参阅检查 SSM Agent 版本号

要验证默认主机管理配置的设置,请按照以下步骤完成操作:

  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 代入此角色。

有关详细信息,请参阅向 Systems Manager 实例配置文件(控制台)添加权限

验证与 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 官方已更新 9 个月前