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

如何通过SSH让Node.js连接远程Amazon EC2上的Elasticsearch

Got it, let's get your Node.js app on EC2 Ubuntu connected to that remote Elasticsearch instance on EC2 Linux. Here are two solid approaches you can take, depending on your security preferences:

方法1:直接远程连接(适合同一AWS VPC内的场景)

这种方式让你的Node app直接访问Elasticsearch实例的网络地址,适合两个EC2实例在同一个VPC里的情况(安全性相对可控)。

步骤1:配置Elasticsearch允许远程访问

登录到运行Elasticsearch的EC2 Linux服务器,修改ES的配置文件:

  • 打开配置文件(通常路径是 /etc/elasticsearch/elasticsearch.yml)
  • 找到并修改以下配置项:
    # 允许绑定到所有网卡(或者指定EC2的私有IP更安全)
    network.host: 0.0.0.0
    # 单节点环境下的发现配置
    discovery.seed_hosts: ["127.0.0.1", "<你的ES-EC2私有IP>"]
    
  • 如果你之前设置了ES的用户名密码(生产环境必须这么做!),确保xpack.security.enabled: true已经开启
  • 重启Elasticsearch服务:
    sudo systemctl restart elasticsearch
    

步骤2:配置ES-EC2的安全组

在AWS控制台里,给运行Elasticsearch的EC2实例的安全组添加一条入站规则:

  • 端口:9200
  • 来源:选择你Node.js项目所在EC2 Ubuntu的私有IP(或者安全组ID,更灵活)
  • 协议:TCP

步骤3:修改Node.js客户端配置

首先注意:旧的elasticsearch包已经被官方废弃了,建议升级到官方维护的@elastic/elasticsearch包,安装命令:

npm install @elastic/elasticsearch

然后修改你的客户端初始化代码:

const { Client } = require('@elastic/elasticsearch');

const esClient = new Client({
  // 替换成ES-EC2的私有IP(同一VPC)或公网IP(如果跨VPC/公网访问)
  node: 'http://<ES-EC2-IP>:9200',
  // 如果ES开启了账号密码验证,加上这部分
  auth: {
    username: 'elastic', // 默认用户名是elastic
    password: '你的ES管理员密码'
  },
  log: 'trace' // 生产环境建议改成'error'或'warn',避免日志过载
});
方法2:通过SSH隧道连接(最高安全级,无需暴露ES端口)

如果你不想把Elasticsearch的9200端口暴露给外部,用SSH隧道转发流量是更安全的选择,相当于把远程ES的端口映射到Node所在EC2的本地端口。

步骤1:在Node所在的EC2 Ubuntu上建立SSH隧道

用你的密钥文件建立本地端口转发,把Ubuntu EC2的9200端口映射到远程ES-EC2的9200端口:

# 替换成你的密钥路径、ES-EC2的IP(公网或私有IP)
ssh -i /path/to/your-aws-key.pem -L 9200:localhost:9200 ec2-user@<ES-EC2-IP>
  • 加上-fN参数可以让隧道在后台运行:
    ssh -fN -i /path/to/your-aws-key.pem -L 9200:localhost:9200 ec2-user@<ES-EC2-IP>
    
  • 为了防止隧道意外断开,可以用autossh工具自动重连,安装命令:sudo apt install autossh,然后运行:
    autossh -M 0 -fN -i /path/to/your-aws-key.pem -L 9200:localhost:9200 ec2-user@<ES-EC2-IP>
    

步骤2:Node.js客户端配置

这时候你可以完全沿用之前连接本地ES的配置,因为隧道已经把远程端口映射到本地了:

const { Client } = require('@elastic/elasticsearch');

const esClient = new Client({
  node: 'http://localhost:9200',
  // 如果ES有账号密码,同样加上auth配置
  auth: {
    username: 'elastic',
    password: '你的ES管理员密码'
  },
  log: 'trace'
});
验证连接

不管用哪种方法,都可以在Node所在的EC2上先测试连通性:

# 方法1用这个
curl http://<ES-EC2-IP>:9200
# 方法2用这个
curl http://localhost:9200

如果返回ES的节点信息,说明网络连通没问题,再启动Node项目测试即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:19