1. 为什么你的EC2需要SSM-Agent?从“手动登录”到“一键直达”

如果你刚开始用AWS的EC2,可能还在用老办法:每次想管理服务器,都得先找到那个长长的公网IP,然后用SSH客户端,输入密钥文件,吭哧吭哧连进去。麻烦不说,安全上也是个隐患——你得开放22端口,密钥文件还得保管好。我自己刚开始就这么干的,直到有一次密钥文件丢了,折腾了半天才恢复访问,那感觉真是糟透了。

后来我发现,AWS自家就提供了一个“官方后门”,或者说“管理高速公路”,那就是Systems Manager (SSM)。而SSM-Agent,就是跑在你EC2实例里的那个“接线员”。它的核心作用,是让你的实例能和AWS Systems Manager服务“通上话”。一旦通了话,好处就太多了:你可以在AWS控制台里直接打开一个基于浏览器的Shell,不用管IP,不用管密钥,点一下就能操作,这叫Session Manager。你还可以让SSM帮你批量执行命令、自动打补丁、管理配置,甚至不用公网IP,通过私网就能管理,安全性直接拉满。

简单来说,没装SSM-Agent,你的EC2就是个“哑巴”节点,很多高级的、省心的自动化管理功能都用不了。装了它,并且配置正确,你的实例就变成了一个“智能”节点,能接受云端的远程指令。我自己的生产环境现在全部标配SSM-Agent,运维效率提升了不止一个档次。所以,无论你是为了更方便地登录,还是为了后续的自动化运维,安装和配置好SSM-Agent都是AWS EC2管理里非常基础且关键的一步。

2. 安装前准备:IAM角色与权限,一步都不能错

很多朋友安装SSM-Agent失败,十有八九问题都出在这一步。SSM-Agent不是装上个软件包就完事了,它需要权限去和AWS的API“握手”。这个权限,就是通过IAM角色(Role) 赋予EC2实例本身的。你可以把这个角色理解成挂在实例脖子上的一张“工作证”,上面写明了这个实例能干什么。

2.1 创建并配置正确的IAM角色

首先,我们得去IAM控制台“制作”这张工作证。别直接用管理员权限的角色,那太危险了。我们遵循最小权限原则。

  1. 创建新角色:在IAM控制台,点击“角色”,然后“创建角色”。
  2. 选择可信实体:这一步很重要,要选 “AWS服务”,然后在下面选择 “EC2”。这意思是,这个角色是专门给EC2服务使用的。
  3. 附加权限策略:这是核心。点击“附加策略”,在搜索框里输入 AmazonSSMManagedInstanceCore这个策略是必须的,它包含了SSM-Agent与Systems Manager通信所需的所有基本权限。勾选它。
  4. (可选但推荐)附加CloudWatch策略:如果你还希望SSM-Agent能把日志和监控指标发到CloudWatch,方便统一查看和设置报警,可以再附加一个 CloudWatchAgentServerPolicy。我一般都会加上,后期排查问题看日志很方便。
  5. 命名并创建:给角色起个容易识别的名字,比如 MyEC2-SSM-Role,然后创建角色。

2.2 将角色绑定到你的EC2实例

角色做好了,得给你的EC2实例“佩戴”上。注意,这个操作只能在实例停止(Stopped) 状态下进行。如果你的实例正在运行,需要先停止它。

  1. 在EC2控制台,找到你的目标实例。
  2. 选中实例,点击上方 “操作” -> “安全” -> “修改IAM角色”
  3. 在弹出的窗口中,选择你刚刚创建的 MyEC2-SSM-Role,然后保存。

这里有个我踩过的坑:有时候在控制台改了角色,但实例内部并没有立即感知到。最稳妥的办法是,在修改完IAM角色并启动实例后,通过旧的SSH方式连进去(这是最后一次用SSH了),执行一条命令来强制刷新实例的元数据:sudo systemctl restart ec2-instance-connect 或者直接重启实例 sudo reboot。确保实例拿到了新的“工作证”。

3. 手把手安装SSM-Agent:针对不同Linux发行版

准备工作做扎实了,安装过程其实很快。AWS官方为不同的Linux发行版提供了详细的安装指南,但核心思路就两种:用系统包管理器(yum, apt)安装,或者直接下载安装包。下面我以最常用的几种系统为例。

3.1 Amazon Linux 2 / Amazon Linux 2023

这是AWS的亲儿子系统,安装最简单,因为SSM-Agent很可能已经预装了。我们先检查一下:

# 检查Agent状态
sudo systemctl status amazon-ssm-agent

如果看到 active (running),恭喜你,啥也不用干了。如果没安装或者没启动,就执行安装命令:

# 安装(对于Amazon Linux 2)
sudo yum install -y amazon-ssm-agent

# 对于Amazon Linux 2023,使用dnf
sudo dnf install -y amazon-ssm-agent

# 启动并设置开机自启
sudo systemctl start amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent

3.2 Ubuntu / Debian

对于Ubuntu,我们需要先添加AWS的软件源,然后再安装。

# 创建一个目录存放安装包
mkdir /tmp/ssm
cd /tmp/ssm

# 下载Ubuntu适用的.deb安装包
# 请根据你的系统架构(x86_64或arm64)和区域选择正确的链接,以下以us-east-1区域x86_64为例
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb

# 安装
sudo dpkg -i amazon-ssm-agent.deb

# 启动并设置开机自启
sudo systemctl start amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent

注意:对于Debian,步骤类似,但务必确认下载的安装包版本兼容你的Debian版本。更推荐的方法是,查看AWS官方文档,找到对应Debian版本的仓库配置方法。

3.3 RHEL / CentOS / Rocky Linux

对于RedHat系的系统,过程类似,但安装包是.rpm格式。

# 创建目录
mkdir /tmp/ssm
cd /tmp/ssm

# 下载RPM包(以x86_64为例)
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

# 安装
sudo yum install -y amazon-ssm-agent.rpm
# 或者使用 dnf (RHEL 8+/CentOS Stream/Rocky Linux 8+)
# sudo dnf install -y amazon-ssm-agent.rpm

# 启动并设置开机自启
sudo systemctl start amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent

安装完成后,别忘了再检查一次状态:sudo systemctl status amazon-ssm-agent。看到绿色的 active (running) 就表示Agent已经在欢快地运行了。

4. 安装后验证与初体验:从控制台直接登录

安装并启动成功,只是万里长征第一步。我们得验证它是否真的能和AWS云端服务正常通信。最直观的验证方法,就是去用用它。

  1. 等待注册:实例内部的Agent启动后,需要一点时间(通常1-2分钟)向Systems Manager服务注册自己。你可以通过查看Agent日志来确认:sudo tail -f /var/log/amazon/ssm/amazon-ssm-agent.log。看到类似 "Successfully registered the instance with AWS SSM using Managed instance-id" 的日志,就表示注册成功了。
  2. 在控制台查看:打开AWS Systems Manager控制台,在左侧导航栏找到 “实例与节点” -> “托管实例”。如果你的实例成功注册,应该会出现在这个列表里。状态应该是 “在线”
  3. 体验Session Manager(重磅功能):在“托管实例”列表里,选中你的实例,点击顶部的 “启动会话”。几秒钟后,一个基于浏览器的终端窗口就会弹出来!你现在已经成功登录到你的EC2实例了,完全不需要SSH密钥和22端口。你可以在这里执行任何命令,就像在本地终端一样。第一次用这个功能的时候,我真的有种“哇塞”的感觉,太方便了。

注意:如果你在“托管实例”列表里看不到你的实例,或者状态是“离线”,别着急,大概率是前面的IAM权限或者网络配置有问题。这就是我们接下来要重点排查的。

5. 深度故障排除:当SSM-Agent“失联”时该怎么办

Agent没起来,或者起来了但显示离线,是最让人头疼的。根据我多年的排错经验,问题基本集中在权限、网络和Agent自身配置这三块。我们按照从外到内、从简到繁的顺序来排查。

5.1 权限问题排查:读懂日志里的“拒绝访问”

权限问题是头号杀手。SSM-Agent的日志文件是我们最好的帮手,位置在 /var/log/amazon/ssm/amazon-ssm-agent.log。我们来看几个典型的错误:

  • 错误1: AccessDeniedException: Systems Manager's instance management role is not configured 这个错误非常明确,意思是AWS说你的账户还没为Systems Manager配置实例管理角色。这通常不是指你实例上绑定的IAM角色错了,而是指你整个AWS账户级别的服务相关角色没创建。 解决方法:去IAM控制台,看看有没有一个叫 AWSServiceRoleForAmazonSSM 的角色。如果没有,最简单的办法是,回到Systems Manager控制台,随便执行一个需要权限的操作(比如第一次使用Session Manager),AWS通常会提示你自动创建这个服务角色。点击同意创建即可。或者,你也可以通过CLI命令 aws iam create-service-linked-role --aws-service-name ssm.amazonaws.com 来创建。

  • 错误2: no EC2 instance role foundfailed to make EC2Metadata request 这个错误说明Agent根本没能从实例元数据服务(IMDS)获取到IAM角色的临时凭证。可能的原因有:

    1. 实例根本没绑定IAM角色。回去检查 2.2 步骤。
    2. 实例绑定的角色没有附加 AmazonSSMManagedInstanceCore 策略。回去检查 2.1 步骤。
    3. 实例的元数据服务版本(IMDSv2)配置了强制跳数限制,而Agent可能用了错误的方式访问。你可以尝试通过SSH登录实例,手动获取一下凭证来测试:curl -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -X PUT "http://169.254.169.254/latest/api/token" 先获取令牌,再用令牌访问元数据。

5.2 网络连接问题排查:能“上网”吗?

SSM-Agent需要能访问特定的AWS服务端点(Endpoint)。如果你的实例在私有子网,没有NAT网关,或者有严格的安全组、网络ACL出站规则限制,就可能连不上。

  • 检查安全组出站规则:实例所属的安全组,必须允许出站(Outbound) 流量访问 HTTPS (端口443)。目的地可以是 0.0.0.0/0(全网),或者更精确地,指向 com.amazonaws.<region>.ssmcom.amazonaws.<region>.ec2messages 等服务的接口VPC端点(如果用了的话)。
  • 私有子网与VPC端点:这是最佳实践。对于生产环境,实例放在没有互联网网关的私有子网是最安全的。这时,你需要为Systems Manager创建 VPC端点。主要需要三种类型:com.amazonaws.<region>.ssm(SSM服务本身)、com.amazonaws.<region>.ec2messages(用于消息传输)、com.amazonaws.<region>.ssmmessages(用于Session Manager流式消息)。创建这些端点后,私有子网里的实例就能通过AWS内部网络访问SSM服务,完全不需要经过公网。
  • 简单网络测试:你可以通过SSH登录实例,尝试用 curltelnet 测试连通性。例如:telnet ssm.<region>.amazonaws.com 443。如果连不通,就是网络层的问题。

5.3 Agent自身问题与高级调试

如果权限和网络都确认没问题,那就要深入Agent内部了。

  • 检查Agent进程和版本

    # 查看进程
    ps aux | grep amazon-ssm-agent
    # 查看版本
    sudo /opt/aws/amazon-ssm-agent/amazon-ssm-agent -version
    

    确保进程存在,并且版本不是太老。过老的版本可能存在已知bug。

  • 重启并跟踪完整日志: 有时候简单重启一下就能解决临时性问题:

    sudo systemctl restart amazon-ssm-agent
    # 重启后,实时跟踪所有日志,注意观察重启过程中的报错
    sudo tail -f /var/log/amazon/ssm/amazon-ssm-agent.log
    

    关注日志中是否有连接超时、DNS解析失败、证书错误等信息。

  • 手动运行调试模式(终极手段): 如果systemctl启动有问题,可以尝试停止服务后,以前台调试模式运行,这样所有输出都会直接打印在终端上,更容易看到第一时间报错。

    sudo systemctl stop amazon-ssm-agent
    sudo /opt/aws/amazon-ssm-agent/amazon-ssm-agent
    

    运行后,观察控制台输出。按 Ctrl+C 可以停止。根据错误信息再去搜索解决方案。

6. 进阶配置与最佳实践:让管理更丝滑

基础功能搞定后,我们可以看看一些能让运维体验更好的进阶配置。

  • 配置CloudWatch日志:让SSM-Agent把它的运行日志和通过Session Manager执行的命令日志都发送到CloudWatch Logs。这样你可以在一个统一的界面查看所有实例的运维历史,并且日志会被长期保存,方便审计和回溯。配置方法通常是在 /etc/amazon/ssm/amazon-ssm-agent.json 配置文件中指定CloudWatch日志组和流。不过更推荐使用统一的CloudWatch代理来收集。
  • 使用自定义Inventory:Systems Manager可以自动收集你实例的软硬件信息(如CPU、内存、已安装软件、网络配置等),形成资产清单。你可以定义自己的清单类型,比如收集特定路径下的配置文件版本。这对于掌握资产状态和合规性检查非常有用。
  • 与自动化文档结合:SSM的一个强大功能是“自动化文档”。你可以编写一个JSON或YAML文档,定义一系列操作(比如停止服务、更新代码、重启服务),然后通过SSM在单个或成百上千个实例上自动执行。SSM-Agent就是这些命令在实例上的执行者。把这套流程和CI/CD工具结合起来,就能实现非常稳健的自动化部署。
  • 安全加固:虽然Session Manager很方便,但也要注意权限控制。使用IAM策略精细控制哪些用户或角色可以启动会话、可以在哪些实例上执行命令。对于高权限操作,可以考虑启用会话日志记录并配合AWS CloudTrail进行全方位的操作审计。

我自己在团队中推行SSM后,最大的感受是运维的“入口”被统一和规范化了。新人不再需要申请和保管一堆密钥,老手也不用记住各个实例的IP。所有操作都有日志可查,安全性和效率得到了很好的平衡。安装和配置SSM-Agent的过程可能会遇到一些小波折,但一旦跑通,它绝对会成为你AWS运维工具箱中最值得信赖的工具之一。

更多推荐