AWS EC2实例user-data含systemctl命令致SSH连接被拒原因咨询
问题背景
AWS配置
运行的AWS EC2实例信息如下:
- 实例类型:
t4g.nano - AMI:
al2023-ami-2023.3.20240122.0-kernel-6.1-arm64(AL2023) - 安全组已配置允许个人IP的SSH访问
- sshd已安装并运行
- 已分配有效的SSH密钥对
- 已分配公网IP
本地配置
使用MacOS v13.6.2系统,ssh版本:
$ ssh -V OpenSSH_9.0p1, LibreSSL 3.3.6
问题现象
无user-data时
EC2实例未配置user-data,可正常通过SSH连接,命令示例:
$ ssh -i "my-key-pair.pem" ec2-user@ec2-{ip}.compute-1.amazonaws.com
连接正常。
含user-data时
EC2实例的user-data脚本包含特定命令时,出现连接拒绝错误,调试命令及输出:
$ ssh -vvv -i "my-key-pair.pem" ec2-user@ec2-{ip}.compute-1.amazonaws.com OpenSSH_9.0p1, LibreSSL 3.3.6 debug1: Reading configuration data /Users/dj/.ssh/config debug1: /Users/dj/.ssh/config line 1: Applying options for * debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 21: include /etc/ssh/ssh_config.d/* matched no files debug1: /etc/ssh/ssh_config line 54: Applying options for * debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '/Users/dj/.ssh/known_hosts' debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> '/Users/dj/.ssh/known_hosts2' debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling debug1: Connecting to ec2-{ip}.compute-1.amazonaws.com port 22. ssh: connect to host ec2-{ip}.compute-1.amazonaws.com port 22: Connection refused
排查后发现,只要脚本包含systemctl命令就会触发问题,示例脚本:
# 示例:在user-data中安装docker yum install -y docker service docker start systemctl enable docker.service systemctl enable containerd.service
疑问
为何user-data脚本中的systemctl命令会导致SSH连接失败?
原因分析及解决办法
核心原因
- 服务依赖连锁反应:AL2023的user-data脚本默认以
root身份运行,systemctl enable命令会更新systemd的服务依赖配置,部分场景下会触发sshd服务的重启流程,重启过程中sshd会短暂关闭22端口,此时外部SSH连接会被拒绝。 - 资源耗尽:t4g.nano仅0.5GB内存,安装docker、启动服务加上systemd的操作会占用大量内存,sshd进程可能因内存不足被系统OOM Killer终止,直接导致端口22无服务监听。
解决办法
- 调整脚本顺序,延迟systemctl操作
在脚本末尾添加延迟,给sshd足够的初始化时间,再执行systemctl命令:# 优化后的docker安装脚本 yum install -y docker service docker start # 延迟60秒,等待sshd稳定 sleep 60 systemctl enable docker.service containerd.service - 改用兼容的服务启用方式
避免直接使用systemctl enable,改用AL2023兼容的chkconfig命令:# 替代systemctl enable的方式 chkconfig docker on chkconfig containerd on - 升级实例规格
临时升级到t4g.micro(1GB内存),避免因资源不足导致服务中断。 - 检查系统日志
实例启动5分钟后,通过AWS控制台查看系统日志,确认是服务重启还是OOM导致的连接失败,定位具体问题。
内容的提问来源于stack exchange,提问作者DJ House
相关产品推荐
相关产品推荐

