You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接失败?


原因分析及解决办法

核心原因

  1. 服务依赖连锁反应:AL2023的user-data脚本默认以root身份运行,systemctl enable命令会更新systemd的服务依赖配置,部分场景下会触发sshd服务的重启流程,重启过程中sshd会短暂关闭22端口,此时外部SSH连接会被拒绝。
  2. 资源耗尽:t4g.nano仅0.5GB内存,安装docker、启动服务加上systemd的操作会占用大量内存,sshd进程可能因内存不足被系统OOM Killer终止,直接导致端口22无服务监听。

解决办法

  1. 调整脚本顺序,延迟systemctl操作
    在脚本末尾添加延迟,给sshd足够的初始化时间,再执行systemctl命令:
    # 优化后的docker安装脚本
    yum install -y docker
    
    service docker start
    # 延迟60秒,等待sshd稳定
    sleep 60
    systemctl enable docker.service containerd.service
    
  2. 改用兼容的服务启用方式
    避免直接使用systemctl enable,改用AL2023兼容的chkconfig命令:
    # 替代systemctl enable的方式
    chkconfig docker on
    chkconfig containerd on
    
  3. 升级实例规格
    临时升级到t4g.micro(1GB内存),避免因资源不足导致服务中断。
  4. 检查系统日志
    实例启动5分钟后,通过AWS控制台查看系统日志,确认是服务重启还是OOM导致的连接失败,定位具体问题。

内容的提问来源于stack exchange,提问作者DJ House

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:01:05