本文更新于2023年8月,更新了EC2创建向导中选择IAM Role选项位置的截图为2023年新UI截图。目前AWS海外区和中国区的EC2创建向导界面均为本版本界面。
本文针对Amazon Linux、Redhat Enterprise Linux、Ubuntu等已经内置了SSM Agent的AMI镜像,对于Debian等没有预装SSM Agent的AMI,可参考本文对Debian进行配置。
一、Session Manager简介
Session Manager是System Manager(以下简称SSM)里边的管理套件其中的一个组件。它是一项Region级别的区域性服务。使用Session Manager在特定系统上可以快速免密钥登录EC2。
1、使用Session Manager的前提
几个前提:
- EC2系统上安装了System Manager Agent,简称SSM Agent;
- EC2上附带了Session Manager所需要的IAM Role角色;
- EC2具有外网访问权限,可以连接到本区域的Session Manager服务;
- EC2没有外网访问权限,但是本VPC内配置了Session Manager的VPC Endpoint,可以从私有子网Private Subnet连接到本区域的Session Manager服务;
- 如果希望从开发者本机(云下笔记本)使用Session Manager登录到EC2,那么使用者环境需要安装AWSCLI、配置正确的密钥,并安装Session Manager插件;
- 在以上全过程中,EC2无须打开外网TCP 22端口的访问权限,所有操作将通过EC2上安装的SSM Agent传递到EC2上。
2、默认支持Session Manager的系统
在创建EC2时候选择以下的AWS官方AMI,已经内置System Manager Agent的,支持使用Session Manager包括:
- Amazon Linux 2/2023 以及未来更高版本;
- Ubuntu 18.04/22.04 以及更高;
- Windows Server 2016/2019/2022 以及更高版本。
3、需要额外安装System Manager Agent才能支持Session Manager的操作系统
以下操作系统默认不包含System Manager Agent,需要额外手工安装Agent:
- AWS控制台上创建EC2界面官方的Debian11镜像
- 社区的CentOS镜像
- 社区其他非官方制作者发布的镜像
- 从IDC的VMware和OpenStack导入到云端的镜像
SSM Agent是开源的,如果您对在EC2内安装管理控制端有疑虑,请从如下Github地址获取SSM的代码:
https://github.com/aws/amazon-ssm-agent
安装Agent的步骤如下:
https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/sysman-manual-agent-install.html
本文按照使用Amazon Linux 2系统编写,已经内置System Manager Agent,无需再手动安装。
二、为EC2创建Session Manager需要的IAM角色并绑定到EC2
1、创建IAM角色
进入IAM服务,点击左侧的角色Role
按钮,点击右侧的创建角色Create role
按钮。如下截图。

在Trusted entity type
位置选择Amazon Web Service service
,在User case
使用场景下选择第一项EC2
,然后点击右下角的Next
按钮下一步。如下截图。

在搜索Policy策略界面,输入关键词core
,这个时候会搜索出来名为AmazonSSMManagedInstanceCore
的策略。选中这个策略,然后点击右下角下一步。如下截图。

在创建IAM角色的最后一步,输入角色的名称,例如SSM-from-2023
。然后跳过本页面所有设置,直接将滚轴移动到页面最末尾,点击创建按钮。如下截图。

由此一个名为SSM-from-2023
的EC2 Role就创建好了。
2、新创建EC2时候选择Session manager需要的IAM角色
本章节介绍新创建一台EC2时候,要在创建向导中展开高级菜单,然后赋予EC2相应IAM角色。如果是修改一台现有已经存在的EC2的IAM Role,请跳过本章节参考下一个章节。
首先进入EC2控制台,点击创建EC2按钮。如下截图。

在创建向导第一步,输入EC2的名称,例如mylinux
,如下截图。

在选择操作系统AMI镜像位置,依次选择架构是64-bit(Arm)
,然后选择Amazon Linux 2023
操作系统。如下截图。

在选择机型和密钥的界面上,机型选择t4g.nano,密钥选择本区域已经从创建好的密钥,也可以不选择。因为Session Manager是不依赖登录密钥的,因此可以完全不任何密钥也可以登录。如下截图。

向下滚动屏幕来到网络设置界面。Session Manager要求本机能够访问外部互联网,也就访问本区域的System Manager服务。因此本EC2可以创建在Public Subnet,也可以创建在Private Subnet并搭配NAT Gateway允许访问外部网络。在创建EC2时候,创建向导会随机选择子网。如果需要额外指定,请点击下图中的编辑按钮,然后自行选定子网。如下截图。

在选择EC2安全规则组一步,无需开放任何端口,即便将所有入栈端口都关闭,也可以使用SSM。如下截图。

默认的磁盘参数无须修改。点击页面最下方的高级设置。如下截图。

在高级设置中,找到IAM Instance profile
的设置,然后搜索并选中上一步创建的IAM Role的名字。最后可以点击右下角创建实例Launch instance
按钮了。如下截图。

至此创建EC2完成。
3、现存EC2如何增补IAM Role
如果在以前创建EC2时候,没有绑定Session Manager对应的IAM Role,那么如何后期增加这个角色呢?方法如下。
进入EC2控制台,选中要修改的EC2,点击操作按钮,在安全菜单中,找到修改IAM Role的按钮。如下截图。

在弹出的IAM Role设置界面上,选择本文第一步创建的IAM Role,然后点击保存。如下截图。

需要注意的是,之前没有绑定过任何IAM Role的EC2在新绑定IAM Role后,需要等待数分钟才能生效。如果不希望等待很久,则可以重启EC2,则会立刻出发新的IAM Role生效。
三、在AWS控制台上使用Session Manager连接到EC2
在EC2 Linux创建时候,需要等待1-2分钟,待其健康状态变为2/2 checks Passed
也就是检查通过后,才可开始连接。如果创建的EC2 Windows系统,则启动时间较长,需要等4-5分钟。选中EC2,点击右上方的连接按钮。如下截图。

在新弹出的窗口中,选择连接方式是Session Manager
,并点击连接。如下截图。

如果之前的配置不正确,这一步将提示无法检测SSM Agent,也就无法连接。
连接成功。如下截图。

Session Manager也可以用于Windows操作系统。登录到Windows以后提供的不是GUI图形界面,而是提供Windows Powershell。您可以通过Powershell安装软件、调整配置。如下截图。

四、在云下客户机(如开发者笔记本)使用AWS CLI的Session Manager插件登录到EC2
在云下的开发环境,例如开发者本机,如果安装了AWSCLI工具,那么也可以通过Session Mangaer连接到EC2。为此,需要安装AWS CLI的插件,下载地址和文档说明在这里:
在以上文档中,可以分别找到Windows、Linux和MacOS的版本。
环境安装好之后,连接到EC2之前还需要获取本EC2的Instance ID。查看Instance ID可以通过EC2控制台网页获得,也可以在CLI上执行aws ec2 describe-instances
也可以看到Instance ID。获取Instance ID后,执行如下命令:
aws ssm start-session --target i-0b35c6823Ieeafc7O --region --cn-northwest-1
即可登录到EC2。如下截图是在MacOS下的AWSCLI使用Session Manager登录到Windows EC2后的Powershell界面。

此方法可在安装有AWSCLI的本地开发者电脑上上,跨平台远程登录到Linux、Windows的EC2系统上,Linux会打开默认shell,而Windows系统就会打开Powershell。
五、配置SSM登录后的操作日志(可选)
进入SSM控制台,找到左侧的节点管理,在其中找到Session Manager。如下截图。

进入SSM模块后,查看属性选项。如下截图。

在设置界面下,向下滚动页面,即可看到S3存储桶和自动加载脚本的设置。如下截图。

Shell Profile的作用是在登录后自动执行脚本,可根据实际需要进行配置。
查看S3存储桶内,即可看到Session Manager登录的日志。如下截图。

将日志下载到本地后,打开可以看到其中的内容就是SSH日志。

六、使用AWSCLI+Session Manager插件转发内网端口到开发者本地(可选)
接下来进一步拓展使用场景,有时候还需要从开发者本机访问云上VPC内的数据库。这时候能访问到EC2是不够的,最好从开发者本机能直接访问VPC内的数据库。这种场景可以使用Session Manager的端口转发来实现。
首先在开发者的环境上安装好AWSCLI,并安装好Session Manager插件。接下来确认下VPC内要转发的RDS的Endpoint名称,然后构建如下命令:
aws ssm start-session \
--target i-123456xxxxxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["mydb.example.ap-east-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["56789"]}'
启动完毕后,即可将RDS的Endpoint映射到本地的56789端口。另外,此窗口不能关闭,否则SSH转发会断开链接。
接下来使用如下命令即可连接到RDS。注意命令中需要使用127.0.0.1的IP地址表示本机,不能使用localhost,否则mysql客户端可能会查找本机的socket文件而不是通过网络接口连接。
mysql -h 127.0.0.1 -P 56789 -u admin -p
输入RDS的admin账户的密码即可完成登录。
七、在受限制的纯内网环境下使用Session Manager
本文的网络环境是默认VPC、或者是具有出向流量路由可以通达互联网的环境来编写的。如果您的网络环境是不能连接互联网的纯内网,请参考这篇文章。
八、参考文档
安装Session Manager插件:
使用Session Manager端口转发:
https://github.com/peteragility/ssm-port-forward
完。