如何在 AWS EC2 实例之间发送和接收数据?

Posted

技术标签:

【中文标题】如何在 AWS EC2 实例之间发送和接收数据?【英文标题】:How to send and receive data among AWS EC2 instances? 【发布时间】:2020-02-16 16:08:02 【问题描述】:

我有两个工人和一个参数服务器,即总共 3 个 ec2 实例。我需要在 3 个实例之间进行通信(同时发送和接收数据包)。

所有三个实例都具有相同的安全组配置:

Parameter-server 实例运行如下代码:

import socket

TCP_IP = '0.0.0.0'
port = 8080
s = 0
MAX_WORKERS = 2

###other codes

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Connecting to port : ", port)
s.bind((TCP_IP, port))
s.listen(1)
conn, addr = s.accept()
print('Connection address:', addr)
conn, addr = s.accept()
print('Connection address:', addr)
k=0
while 1:
   size = safe_recv(8,conn)
   size = pickle.loads(size)
   data = safe_recv(size,conn)  

   ###other codes

   conn.sendall(size)
   conn.sendall(global_var_vals.value)
    ###Other codes
conn.close()
s.close()

Worker 实例运行以下代码:

import socket

TCP_IP = '<parameter-server ip>'
port = 8081 #for worker-1, 8082 for worker-2
port_main = 8080


###other codes

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, port_main))
#receiving the variable values
recv_size = safe_recv(8, s)
recv_size = pickle.loads(recv_size)
recv_data = safe_recv(recv_size, s)
var_vals = pickle.loads(recv_data)
s.close()

###Other codes

# Opening the socket and connecting to server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, port))
while not mon_sess.should_stop():
   ###other codes

   s.sendall(send_size)
   s.sendall(send_data)
   #receiving the variable values
   recv_size = safe_recv(8, s)
   recv_size = pickle.loads(recv_size)
   recv_data = safe_recv(recv_size, s)
   var_vals = pickle.loads(recv_data)
   ###Other codes
s.close()

但是当我运行这段代码时,它显示连接超时

我也尝试通过telnet连接,但是除了22端口,其他端口显示如下错误:

> telnet <parameter-server ip> 8080
Trying <parameter-server ip>...
telnet: Unable to connect to remote host: Connection timed out

但是对于 22 端口,它显示:

> telnet <parameter-server ip> 22
Trying <parameter-server ip>...
Connected to <parameter-server ip>
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

如何在实例之间建立连接?提前致谢。

【问题讨论】:

确保您可以从其他实例 ping 每个实例。然后从图片中删除您的应用程序并使用已知应用程序(例如 netcat)来测试这些端口上的连接性。 PS,在解决此问题之前,您应该使用默认的 VPC NACL,即使在解决后,您也可能不应该自定义 NACL。 你找到问题了吗? 【参考方案1】:

实例是否在同一个 VPC 子网中?如果没有,请检查 NACL 规则以确保您也让您需要的端口通过子网 NACL。

【讨论】:

我根据您的问题假设您没有明确创建一个,因此您使用的是默认子网,该子网应该与允许所有流量通过的子网相关联。但请通过 AWS 管理控制台确认。 同时检查 Ubuntu 防火墙并确保它没有阻止除端口 22 之外的所有端口。运行此命令的输出是什么:“sudo iptables -L”? Chain INPUT (policy ACCEPT)\\ target prot opt source destination \\ Chain FORWARD (policy ACCEPT)\\ target prot opt source destination \\ Chain OUTPUT (policy ACCEPT)\\ target prot opt source目的地\\这是@Ashman的输出,“\\”用于换行 您从参数服务器本身验证,一旦您启动脚本,即从参数服务器本身 telnet 127.0.0.1 8080,您可以连接到端口 8080? 否,telnet 127.0.0.1 8080 也返回“telnet:无法连接到远程主机:连接被拒绝”

以上是关于如何在 AWS EC2 实例之间发送和接收数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置从 AWS EC2 实例到 *** 的连接?

如何设计在 AWS 上运行的服务器监控系统

为啥从我的 Windows EC2 实例发送的 CloudWatch Logs 没有显示在 AWS 控制台上?

如何连接nodejs sequelize aws rds mysql数据库和ec2实例

在我的 EC2 实例中使用 AWS Glue 和 Mysql

如何在 AWS EC2 实例上激活 GPU 的使用?