Skip to content

SSM Agent 手动部署教程

AWS Systems Manager Agent (SSM Agent) 是一款可以在EC2实例上安装和配置的Amazon软件,它使Systems Manager能够更新、管理和配置这些实例。SSM Agent处理来自Systems Manager服务的请求,然后按照文档中的指定运行这些请求。

  • 远程命令执行 (Run Command)
  • 会话管理 (Session Manager)
  • 补丁管理 (Patch Manager)
  • 状态管理 (State Manager)
  • 参数存储访问 (Parameter Store)

在开始安装SSM Agent之前,请确保满足以下条件:

  1. 已创建EC2实例(Ubuntu 24.04 或 Rocky Linux 10)
  2. 实例可以访问外网(通过Internet Gateway或NAT Gateway)
  3. 实例运行在支持的AWS区域
  4. 具有SSH访问实例的权限
  5. 具有AWS管理控制台的访问权限

AWS为不同的操作系统和架构提供了SSM Agent安装包。你可以从以下官方文档获取最新的安装包地址:

Ubuntu系统:

Rocky Linux系统:

所有Linux系统通用文档:

在安装SSM Agent之前,必须先配置IAM角色和实例配置文件,使EC2实例具有与Systems Manager通信的权限。

  1. 登录AWS管理控制台
  2. 导航至IAM服务:https://console.aws.amazon.com/iam/
  3. 在左侧导航栏中选择 Roles
  4. 点击 Create role 按钮
  1. Select trusted entity 页面:
    • 选择 AWS service
    • Use case 部分选择 EC2
    • 点击 Next
  1. Add permissions 页面的搜索框中输入:AmazonSSMManagedInstanceCore
  2. 勾选 AmazonSSMManagedInstanceCore 策略(这是AWS托管策略)
  3. 点击 Next

AmazonSSMManagedInstanceCore策略说明:

此策略包含SSM Agent核心功能所需的最小权限,包括:

  • 与Systems Manager服务通信
  • 发送实例状态信息
  • 执行远程命令
  • 建立Session Manager会话
  1. Role name 字段输入角色名称,例如:EC2-SSM-Role
  2. (可选)添加描述:IAM role for EC2 instances to communicate with Systems Manager
  3. (可选)添加标签
  4. 点击 Create role

对于新实例:

  1. 在启动EC2实例时,在 Configure instance details 页面
  2. IAM role 下拉菜单中选择刚创建的角色 EC2-SSM-Role

对于现有实例:

  1. 导航至EC2控制台:https://console.aws.amazon.com/ec2/
  2. 选择目标实例
  3. 点击 Actions > Security > Modify IAM role
  4. 从下拉列表中选择 EC2-SSM-Role
  5. 点击 Update IAM role

重要提示: 如果在实例运行时附加IAM角色,可能需要等待几分钟或重启SSM Agent才能生效。

Ubuntu 24.04系统使用Snap包管理器来安装SSM Agent。

使用SSH连接到Ubuntu实例:

ssh -i /path/to/your-key.pem ubuntu@your-instance-public-ip
sudo apt update

Ubuntu 24.04使用Snap包来安装SSM Agent:

sudo snap install amazon-ssm-agent --classic

注意: 大多数Ubuntu AWS AMI已预装SSM Agent。如果已安装,可以跳过此步骤。

sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service
sudo systemctl enable snap.amazon-ssm-agent.amazon-ssm-agent.service
sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service

预期输出应显示服务状态为 active (running)

● snap.amazon-ssm-agent.amazon-ssm-agent.service - Service for snap application amazon-ssm-agent.amazon-ssm-agent
Loaded: loaded (/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service; enabled; preset: enabled)
Active: active (running) since Thu 2024-11-27 10:30:00 UTC; 5min ago
Main PID: 1234 (amazon-ssm-agen)
Tasks: 15 (limit: 1234)
Memory: 50.0M
CPU: 2s
CGroup: /system.slice/snap.amazon-ssm-agent.amazon-ssm-agent.service
└─1234 /snap/amazon-ssm-agent/current/amazon-ssm-agent
sudo snap list amazon-ssm-agent

停止服务:

sudo systemctl stop snap.amazon-ssm-agent.amazon-ssm-agent.service

重启服务:

sudo systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent.service

更新到最新版本:

sudo snap refresh amazon-ssm-agent

切换到候选通道(获取最新功能):

sudo snap switch --channel=candidate amazon-ssm-agent
sudo snap refresh amazon-ssm-agent

Rocky Linux使用DNF包管理器来安装SSM Agent的RPM包。

使用SSH连接到Rocky Linux实例:

ssh -i /path/to/your-key.pem rocky@your-instance-public-ip

SSM Agent需要Python 2或Python 3才能正常工作:

python3 --version

如果未安装Python 3,运行:

sudo dnf install python3 -y

对于x86_64架构(AMD64):

sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

对于ARM64架构(Graviton):

sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_arm64/amazon-ssm-agent.rpm

注意: 虽然URL包含 ec2-downloads-windows 目录,但这是Rocky Linux的正确全球安装包地址。

使用区域特定的安装包(可选)

Section titled “使用区域特定的安装包(可选)”

如果需要从特定AWS区域下载以提高速度,可以使用区域特定的URL。

格式:

sudo dnf install -y https://s3.REGION.amazonaws.com/amazon-ssm-REGION/latest/linux_amd64/amazon-ssm-agent.rpm

示例(us-east-2区域):

sudo dnf install -y https://s3.us-east-2.amazonaws.com/amazon-ssm-us-east-2/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl start amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent
sudo systemctl status amazon-ssm-agent

预期输出应显示服务状态为 active (running)

● amazon-ssm-agent.service - amazon-ssm-agent
Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; preset: disabled)
Active: active (running) since Thu 2024-11-27 10:30:00 UTC; 5min ago
Main PID: 2345 (amazon-ssm-agen)
Tasks: 18 (limit: 4096)
Memory: 55.0M
CPU: 1.5s
CGroup: /system.slice/amazon-ssm-agent.service
└─2345 /usr/bin/amazon-ssm-agent
sudo yum info amazon-ssm-agent

或者:

rpm -qa | grep amazon-ssm-agent

停止服务:

sudo systemctl stop amazon-ssm-agent

重启服务:

sudo systemctl restart amazon-ssm-agent

查看日志:

sudo tail -f /var/log/amazon/ssm/amazon-ssm-agent.log

手动更新SSM Agent:

sudo dnf update -y amazon-ssm-agent

完成SSM Agent的安装后,需要验证实例是否已成功注册到Systems Manager并可以正常管理。

测试1:检查实例是否出现在队列管理器中

Section titled “测试1:检查实例是否出现在队列管理器中”
  1. 登录AWS管理控制台
  2. 导航至Systems Manager:https://console.aws.amazon.com/systems-manager/
  3. 在左侧导航栏中,选择 Fleet Manager(队列管理器)(在 Node Management 下)
  4. 等待5-10分钟让实例注册
  5. 你的实例应该出现在托管实例列表中

预期结果: 你应该能看到实例ID、平台类型、IP地址和 Online 状态。

使用AWS CLI验证实例是否已成功注册:

aws ssm describe-instance-information --output table

预期输出示例:

--------------------------------------------------------------
| DescribeInstanceInformation |
+------------------------------------------------------------+
|| InstanceInformationList ||
|+------------------------+----------------------------------+|
|| InstanceId | i-0123456789abcdef0 ||
|| PingStatus | Online ||
|| PlatformName | Ubuntu ||
|| PlatformVersion | 24.04 ||
|| PlatformType | Linux ||
|| AgentVersion | 3.2.2086.0 ||
|| IsLatestVersion | True ||
|+------------------------+----------------------------------+|

SSM Agent 3.1.501.0及更高版本包含内置的诊断工具。

Ubuntu系统:

sudo /snap/amazon-ssm-agent/current/ssm-cli get-diagnostics --output table

Rocky Linux系统:

sudo /usr/bin/ssm-cli get-diagnostics --output table

预期输出应显示所有检查项都为 Success

┌───────────────────────────────────┬─────────┬──────────────────────────────────────┐
│ Check │ Status │ Note │
├───────────────────────────────────┼─────────┼──────────────────────────────────────┤
│ EC2 IMDS │ Success │ IMDS is accessible and has instance │
│ │ │ id i-xxx in Region us-east-1 │
├───────────────────────────────────┼─────────┼──────────────────────────────────────┤
│ Hybrid instance registration │ Skipped │ Instance does not have hybrid │
│ │ │ registration │
├───────────────────────────────────┼─────────┼──────────────────────────────────────┤
│ Connectivity to ssm endpoint │ Success │ ssm.us-east-1.amazonaws.com is │
│ │ │ reachable │
├───────────────────────────────────┼─────────┼──────────────────────────────────────┤
│ Connectivity to ec2messages │ Success │ ec2messages.us-east-1.amazonaws.com │
│ endpoint │ │ is reachable │
├───────────────────────────────────┼─────────┼──────────────────────────────────────┤
│ Connectivity to ssmmessages │ Success │ ssmmessages.us-east-1.amazonaws.com │
│ endpoint │ │ is reachable │
└───────────────────────────────────┴─────────┴──────────────────────────────────────┘

测试4:通过Session Manager连接实例

Section titled “测试4:通过Session Manager连接实例”
  1. 在Systems Manager控制台中,选择 Session Manager
  2. 点击 Start session
  3. 选择你的实例
  4. 点击 Start session
  5. 应该会打开一个新的浏览器标签页,显示一个交互式shell

预期结果: 你应该能够通过浏览器访问实例的shell,无需SSH密钥。

测试通过Run Command在实例上执行远程命令。

使用AWS CLI:

Ubuntu示例:

aws ssm send-command \
--instance-ids "i-0123456789abcdef0" \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["echo Hello from SSM Agent", "uname -a", "df -h"]' \
--output text

Rocky Linux示例:

aws ssm send-command \
--instance-ids "i-0123456789abcdef0" \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["echo Hello from SSM Agent", "cat /etc/os-release", "free -h"]' \
--output text

命令将返回一个 CommandId。使用以下命令查看执行结果:

aws ssm list-command-invocations \
--command-id "COMMAND-ID-FROM-ABOVE" \
--details

预期结果: 命令应成功执行,输出包含命令的执行结果。

使用Run Command在实例上安装Nginx,测试SSM Agent执行复杂任务的能力。

Ubuntu系统安装Nginx:

aws ssm send-command \
--instance-ids "i-0123456789abcdef0" \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["sudo apt update -y", "sudo apt install nginx -y", "sudo systemctl start nginx", "sudo systemctl enable nginx", "sudo systemctl status nginx", "curl -I http://localhost"]' \
--comment "Install and start Nginx on Ubuntu" \
--output text

Rocky Linux系统安装Nginx:

aws ssm send-command \
--instance-ids "i-0123456789abcdef0" \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["sudo dnf install nginx -y", "sudo systemctl start nginx", "sudo systemctl enable nginx", "sudo systemctl status nginx", "curl -I http://localhost"]' \
--comment "Install and start Nginx on Rocky Linux" \
--output text

验证Nginx安装:

  1. 记录返回的 CommandId
  2. 查看命令执行详情:
aws ssm get-command-invocation \
--command-id "YOUR-COMMAND-ID" \
--instance-id "i-0123456789abcdef0"
  1. 在浏览器中访问实例的公网IP地址,应该看到Nginx的欢迎页面

预期结果:

  • 命令执行状态为 Success
  • Nginx服务运行正常
  • 可以通过HTTP访问Nginx欢迎页面

如果以上所有测试都通过,说明SSM Agent已正确安装和配置,可以:

  • 实例已成功注册到Systems Manager
  • IAM权限配置正确
  • 网络连接正常
  • 可以远程管理和执行命令

如果SSM Agent安装后无法正常工作,以下是常见问题及解决方案。

问题1:实例未出现在Fleet Manager中

Section titled “问题1:实例未出现在Fleet Manager中”

可能原因和解决方案:

原因1:SSM Agent未运行

检查SSM Agent状态:

Ubuntu:

sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service

Rocky Linux:

sudo systemctl status amazon-ssm-agent

如果未运行,启动服务:

Ubuntu:

sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service

Rocky Linux:

sudo systemctl start amazon-ssm-agent

原因2:IAM实例配置文件缺失或权限不足

验证实例是否附加了IAM角色:

aws ec2 describe-instances \
--instance-ids i-0123456789abcdef0 \
--query 'Reservations[0].Instances[0].IamInstanceProfile'

如果输出为空,说明未附加IAM角色。参考前面的IAM角色配置部分附加角色。

验证IAM角色是否包含 AmazonSSMManagedInstanceCore 策略:

aws iam list-attached-role-policies --role-name EC2-SSM-Role

原因3:网络连接问题

SSM Agent需要能够连接到以下端点:

  • ssm.region.amazonaws.com
  • ec2messages.region.amazonaws.com
  • ssmmessages.region.amazonaws.com

验证网络连接:

curl -I https://ssm.us-east-1.amazonaws.com
curl -I https://ec2messages.us-east-1.amazonaws.com
curl -I https://ssmmessages.us-east-1.amazonaws.com

如果连接失败,检查:

  • 实例是否有公网IP或位于有NAT Gateway的私有子网
  • 安全组是否允许出站HTTPS(443端口)流量
  • NACL是否阻止流量

原因4:实例元数据服务(IMDS)不可用

验证IMDS可访问:

curl http://169.254.169.254/latest/meta-data/instance-id

如果失败,启用IMDS:

aws ec2 modify-instance-metadata-options \
--instance-id i-0123456789abcdef0 \
--http-tokens optional \
--http-endpoint enabled

原因5:等待时间不足

SSM Agent注册可能需要5-10分钟。等待更长时间后再检查。

如果附加IAM角色到正在运行的实例,重启SSM Agent:

Ubuntu:

sudo systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent.service

Rocky Linux:

sudo systemctl restart amazon-ssm-agent

问题2:SSM Agent状态显示”Connection Lost”

Section titled “问题2:SSM Agent状态显示”Connection Lost””

解决方案:

  1. 检查SSM Agent日志文件

Ubuntu:

sudo journalctl -u snap.amazon-ssm-agent.amazon-ssm-agent.service -f

Rocky Linux:

sudo tail -f /var/log/amazon/ssm/amazon-ssm-agent.log
sudo tail -f /var/log/amazon/ssm/errors.log
  1. 查找错误信息,常见错误:

错误示例1: RegistrationFailed: Failed to register the instance

  • 检查IAM角色权限
  • 验证实例元数据服务是否可用

错误示例2: Unable to connect to Systems Manager endpoint

  • 检查网络连接
  • 验证安全组和NACL规则
  1. 重启SSM Agent并观察日志

错误信息: “The instance you selected isn’t configured to use Session Manager”

解决方案:

  1. 确认IAM角色包含Session Manager所需权限

IAM角色需要包含以下权限(AmazonSSMManagedInstanceCore已包含):

{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
  1. 检查VPC端点(如果使用私有子网)

如果实例在私有子网中,需要创建以下VPC端点:

  • com.amazonaws.region.ssm
  • com.amazonaws.region.ec2messages
  • com.amazonaws.region.ssmmessages
  1. 验证端点的安全组允许443端口入站流量

解决方案:

  1. 检查命令输出和错误:
aws ssm get-command-invocation \
--command-id "COMMAND-ID" \
--instance-id "i-0123456789abcdef0"
  1. 验证实例资源是否充足:
# 检查CPU使用率
top
# 检查内存使用
free -h
# 检查磁盘空间
df -h
  1. 增加命令超时时间:
aws ssm send-command \
--instance-ids "i-0123456789abcdef0" \
--document-name "AWS-RunShellScript" \
--timeout-seconds 600 \
--parameters 'commands=["your-command"]'

解决方案:

查看当前版本:

Ubuntu:

snap list amazon-ssm-agent

Rocky Linux:

rpm -qa | grep amazon-ssm-agent

更新到最新版本:

Ubuntu:

sudo snap refresh amazon-ssm-agent

Rocky Linux:

sudo dnf update -y amazon-ssm-agent
sudo systemctl restart amazon-ssm-agent

或使用Run Command批量更新:

aws ssm send-command \
--instance-ids "i-0123456789abcdef0" \
--document-name "AWS-UpdateSSMAgent"

使用自动化运行手册进行故障排查

Section titled “使用自动化运行手册进行故障排查”

AWS提供了自动化运行手册来诊断SSM Agent问题:

aws ssm start-automation-execution \
--document-name "AWSSupport-TroubleshootManagedInstance" \
--parameters "InstanceId=i-0123456789abcdef0"

这个运行手册会自动检查:

  • SSM Agent安装状态
  • IAM权限配置
  • 网络连接性
  • 服务端点可达性

如果需要更详细的日志来诊断问题:

Ubuntu系统:

  1. 停止SSM Agent
sudo systemctl stop snap.amazon-ssm-agent.amazon-ssm-agent.service
  1. 修改日志配置
sudo cp /snap/amazon-ssm-agent/current/seelog.xml.template /var/snap/amazon-ssm-agent/current/seelog.xml
sudo sed -i 's/minlevel="info"/minlevel="debug"/g' /var/snap/amazon-ssm-agent/current/seelog.xml
  1. 启动SSM Agent
sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service

Rocky Linux系统:

  1. 停止SSM Agent
sudo systemctl stop amazon-ssm-agent
  1. 修改日志配置
sudo cp /etc/amazon/ssm/seelog.xml.template /etc/amazon/ssm/seelog.xml
sudo sed -i 's/minlevel="info"/minlevel="debug"/g' /etc/amazon/ssm/seelog.xml
  1. 启动SSM Agent
sudo systemctl start amazon-ssm-agent

查看详细日志:

Rocky Linux:

sudo tail -f /var/log/amazon/ssm/amazon-ssm-agent.log