需求

在 AWS 上部署了一个项目,包含四个 EC2 实例。其中一个为堡垒机实例,另外三个为业务实例。在子网的安全组中,关闭了 22 端口,只能通过 AWS 网页上的 Session Manager 访问堡垒机,再跳到其它业务机上。但 AWS 网页版的终端使用起来有很多限制,比如不能“选择即复制”,不能“右键快速粘贴”,会话无法保活等。 因此,希望可以使用桌面终端,比如 Mobaxterm,通过 Session Manager 来访问 EC2 实例。

解决方案

通过 AWS Command Line Interface(AWS CLI) 连接 Session Manager,经由 System Manager Agent(SSM Agent) 将所有操作转发给 EC2。

使用 Session Manager 的前提

  • EC2 实例安装了 SSM Agent
  • EC2 实例绑定了 IAM Role AmazonSSMManagedInstanceCore
  • EC2 可以直接或者通过 Session Manager 的 VPC Endpoint 连接 Session Mananger 服务 具体参照 AWS 官方文档进行设置。

安装配置 AWS CLI

首先参照 AWS 官方文档 安装或者更新 AWS CLI 的最新版本。

要通过 AWS CLI 启动 Session Manager 会话,还必须安装 Session Manager 插件,参照 AWS 官方文档

IAM 中创建 Access Key,记下 Key ID 和 Secret。

在本地终端中执行 aws configure,填入刚刚创建的 Access Key,Secret,和 EC2 实例所在的区域,比如us-east-1

1
2
3
4
5
palfans@lab:~/.aws$ aws configure
AWS Access Key ID []:
AWS Secret Access Key []:
Default region name []:
Default output format [None]:

在本地终端中执行aws ec2 describe-instances | grep InstanceId,获取到 EC2 实例ID,然后用aws ssm start-session --target <InstanceId>连接到 EC2。

1
2
3
4
5
6
7
palfans@lab:~/.aws$ aws ec2 describe-instances | grep InstanceId
                    "InstanceId": "i-09721fab06a6d0000",
palfans@lab:~/.aws$
palfans@lab:~/.aws$ aws ssm start-session --target i-09721fab06a6d0000

Starting session with SessionId: palfans-094975208f6800000
sh-5.2$

配置 Mobaxterm

现在已经可以通过 AWS CLI 访问 EC2,还需要支持 SSH,以便拥有更多功能的 Mobaxterm 等终端软件可以连接。

首先在堡垒机的~/.ssh/authorized_keys中添加公钥,之后就可以用私钥进行校验。

然后在 Mobaxterm 中新建一个 SSH 连接,Remote host 为 EC2 的 InstanceId,比如 i-09721fab06a6d0000。用户名为 ec2-user

Advanced SSH settings->Use private key中,选择对应的私钥文件。

Network settings->Proxy settings中,Proxy type为Local,Local proxy command为aws ssm start-session --target %host --document-name AWS-StartSSHSession --parameters 'portNumber=%port'

如果 AWS CLI 是安装在 Windows 附带的 WSL2 中,则 Local proxy command为wsl aws ssm start-session --target %host --document-name AWS-StartSSHSession --parameters 'portNumber=%port'

保存后即可在 Mobaxterm 中连接 EC2。