注:截止2023年7月,EC2 Instance Connect
功能只在海外区域可用,Session Manager
在海外区和中国区都可用。
一、背景
Debian是常用主流Linux系统之一,Ubuntu就是源自Debian体系发展出来的。Debian在云端使用频度不如CentOS/Ubuntu广泛。在AWS云上提供的EC2 AMI中,可在创建EC2向导界面直接选择Debian 11。
不过,这个Debian 11的AMI镜像虽然是AWS官方维护的,但是其自身没有集成System Manager Agent,也没有集成EC2 Instance Connect插件。因此,在EC2控制台上,点击Connect按钮,无论选择EC2 Instance Connect还是选择Session Manager,都会提示无法连接,如下截图。
EC2 Session Manager 无法连接的报错现象如下:
EC2 Instance Connect 无法连接的报错现象如下:
为了解决这个问题,就需要在Debian 11上安装这两个Agent,并且建议通过Userdata方式在创建EC2时候注入到EC2中,以更轻松的轻松。
二、准备EC2 Userdata脚本相关脚本(可选)
本章节为所有脚本的梳理和准备过程,如果您希望直接使用整理好的脚本,可跳过本章节,直接使用下一个章节中已经准备好的脚本。
1、准备Session Manager Agent的脚本
使用X86_64处理器的机型上执行如下命令即可完成安装和部署。
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb
dpkg -i amazon-ssm-agent.deb
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
wget https://s3.amazonaws.com/amazoncloudwatch-agent/debian/amd64/latest/amazon-cloudwatch-agent.deb
dpkg -i -E amazon-cloudwatch-agent.deb
使用Graviton处理器的ARM机型上执行如下命令即可完成安装和部署。
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm64/amazon-ssm-agent.deb
dpkg -i amazon-ssm-agent.deb
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
dpkg -i -E amazon-cloudwatch-agent.deb
2、从源代码构建EC2 Instance Connection的deb安装包
使用EC2 Instance Connection功能需要在EC2上安装软件包,在Redhat/CentOS/Amazon Linux上,使用yum即可安装。在Ubuntu上使用apt上即可安装。
但是,AWS官方没有给Debian系统提供现成的软件源。由此,我们需要从源代码构建安装包。一旦构建好后,未来可以复用,不需要重复构建。
首先启动一台Debian11系统,使用SSH通过网络登陆上去(注意安全组不要开放到0.0.0.0/0
,这样很不安全)。准备好后,安装deb包构建工具,从github下载代码,然后在本EC2上构建。
apt install devscripts dpkg-dev -y
git clone https://github.com/aws/aws-ec2-instance-connect-config.git
cd aws-ec2-instance-connect-config
./bin/make_deb.sh 1.1 18
以上命令即可构建debian11操作系统使用的EC2 Instance Connection包。
在构建的末尾,可能会提示签名错误,例如如下信息:
gpg: skipped "Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>": No secret key
gpg: /tmp/debsign.hoxHY2K8/ec2-instance-connect_1.1.19.dsc: clear-sign failed: No secret key
debsign: gpg error occurred! Aborting....
debuild: fatal error at line 1112:
running debsign failed
这不会影响已经完成的构建,此时已经可以在当前目录中找到ec2-instance-connect_1.1.19_all.deb
,安装即可使用。
dpkg -i ec2-instance-connect_1.1.19_all.deb
为了方便后续部署,我们将这个软件包从构建环境里边复制出来,放到可下载的地址中,方便后续安装调用。
三、创建EC2并使用Userdata脚本完成以上Agent的安装
1、创建EC2并输入Userdata
进入EC2控制台,点击创建Intance,输入EC2的名称。在选AMI界面,点击Quick Start
按钮,从操作系统清单的最右侧选中Debian
,然后下方选择默认的Debian 11
操作系统镜像。最后选择系统架构是x86_64
或者arm
架构。如下截图。
点击高级配置,输入userdata如下。如下截图。
使用X86_64处理器的机型:
#! /bin/bash
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb
dpkg -i amazon-ssm-agent.deb
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
wget https://blogimg.bitipcman.com/workshop/EC2-debian/ec2-instance-connect_1.1.19_all.deb
dpkg -i ec2-instance-connect_1.1.19_all.deb
Graviton的ARM机型:
#! /bin/bash
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm64/amazon-ssm-agent.deb
dpkg -i amazon-ssm-agent.deb
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
wget https://blogimg.bitipcman.com/workshop/EC2-debian/ec2-instance-connect_1.1.19_all.deb
dpkg -i ec2-instance-connect_1.1.19_all.deb
其他EC2配置按正常要求配置即可。由此开机完成。
2、测试连接
进入EC2控制台界面,可查看刚创建的EC2的状态,可点击刷新按钮更新状态。需要等待EC2的Status check
显示为绿色的2/2 checks passed
,即开始连接。选中EC2后,点击页面上方的Connect按钮。如下截图。
在弹出的Connect to instance
界面上,点击左侧第一项Connect using EC2 Instance Connect
,下方的用户名会自动带出本AMI对应的用户名。例如CentOS、Redhat Enterpriser Linux、Amazon Linux的默认用户名是ec2-user
,Ubuntu系统的默认用户名是ubuntu
,Debian系统的默认用户名是admin
。这个用户名是自动带出来的,不需要修改。最后点击右下角连接按钮。如下截图。
可看到EC2 Instance Connect连接成功。如下截图。
接下来再测试Session Manager。点击第二个标签页Session Manager
,然后点击右下角的Connect
按钮。如下截图。
可看到EC2 Session Manager连接成功。如下截图。
测试成功。至此实验完成。
四、参考文档
Debian Server 上的 SSM Agent 的快速安装命令
https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/agent-install-deb.html
支持EC2 Instance Connect 的AMI
EC2 Instance Connection 安装
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html
Github上的EC2 Instanc的Connect源码