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

GitLab流水线通过SSH连接EC2实例超时问题排查求助

GitLab流水线SSH连接EC2超时排查

问题描述

尝试通过.pem密钥文件,借助GitLab流水线建立与EC2实例的SSH连接,gitlab-ci.yml的Deploy阶段配置如下:

"Deploy":
  stage: deploy
  before_script:
    - apk update && apk add openssh
    - echo "$AWS_EC2_KEY" > Main.pem
    - chmod 0400 Main.pem

  script:
    - cat Main.pem
    - echo $AWS_EC2_HOST
    - echo "docker info" | ssh -o StrictHostKeyChecking=no -i Main.pem ec2-user@$AWS_EC2_HOST

执行时出现Operation timed out(连接超时)错误,已验证环境变量和.pem文件内容正确,本地机器执行相同操作可成功连接,需排查流水线中SSH连接异常的原因。

可能的原因及排查方向

  • EC2安全组未开放GitLab Runner的IP访问
    本地能连接是因为你的公网IP在安全组允许列表内,但GitLab Runner(共享或自托管)的IP不在EC2实例安全组的入站规则里,导致请求被拦截。
    排查:查看EC2安全组入站规则,确认是否允许GitLab Runner的公网IP访问22端口;若使用共享Runner,临时测试可开放0.0.0.0/0(生产环境不推荐),长期方案建议改用自托管Runner并将其IP加入安全组。

  • GitLab Runner所在网络限制出站访问
    若为自托管Runner,其所在网络可能有防火墙或NAT规则,禁止出站访问EC2的22端口。
    排查:在Runner所在机器手动执行相同SSH命令,验证是否能连接;若失败,检查Runner网络的出站防火墙规则。

  • EC2实例使用私有IP且Runner无法访问VPC内网
    如果AWS_EC2_HOST填写的是EC2私有IP,而GitLab Runner不在同一VPC、也无VPN/专线连接到VPC,自然无法访问。
    排查:确认AWS_EC2_HOST为EC2公网IP;若需使用私有IP,需将Runner部署到VPC内,或通过VPC对等连接打通网络。

  • SSH命令的用户或端口不匹配
    不同EC2 AMI的默认SSH用户名不同(比如Ubuntu是ubuntu,Amazon Linux是ec2-user),若流水线中用户名错误,或EC2修改了SSH端口但命令未指定,也会引发超时。
    排查:核对EC2实例的SSH用户名和端口,若端口非默认22,在SSH命令中添加-p 自定义端口参数。

  • 密钥文件写入格式异常
    若AWS_EC2_KEY环境变量存储时将换行符转义为\n,执行echo "$AWS_EC2_KEY" > Main.pem会导致密钥文件格式错误,进而引发连接问题(虽大概率是权限/密钥错误,但也需排查)。
    排查:在流水线script中保留cat Main.pem步骤,对比输出的密钥格式与本地文件是否一致,检查是否存在换行丢失或转义错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:53:34