我正在尝试从 AWS Fargate 容器设置到 MongoDB Atlas 数据库的连接。VPC 对等连接已设置并正常运行,我可以从 AWS VPC 私有子网内的堡垒成功连接到 MongoDB Atlas 集群。但是,当我尝试从 Fargate 任务进行相同连接时,连接失败。
例如如果我尝试使用以下 mongo cli 命令连接:
mongo "mongodb+srv://user:[email protected]/database"
我收到以下错误。
MongoDB shell version v4.0.20
connecting to: mongodb://cluster0-shard-00-01.foo0.mongodb.net.:27017,cluster0-shard-00-02.tzhow.mongodb.net.:27017,cluster0-shard-00-00.foo0.mongodb.net.:27017/cxchat?authSource=admin&gssapiServiceName=mongodb&replicaSet=atlas-mdt101-shard-0&ssl=true
2020-09-09T13:16:46.295+0000 I NETWORK [js] Starting new replica set monitor for atlas-mdt101-shard-0/cluster0-shard-00-01.foo0.mongodb.net.:27017,cluster0-shard-00-02.foo0.mongodb.net.:27017,cluster0-shard-00-00.foo0.mongodb.net.:27017
2020-09-09T13:16:56.351+0000 W NETWORK [ReplicaSetMonitor-TaskExecutor] Unable to reach primary for set atlas-mdt101-shard-0
2020-09-09T13:16:56.351+0000 I NETWORK [ReplicaSetMonitor-TaskExecutor] Cannot reach any nodes for set atlas-mdt101-shard-0. Please check network connectivity and the status of the set. This has happened for 1 checks in a row.
2020-09-09T13:17:11.867+0000 W NETWORK [js] Unable to reach primary for set atlas-mdt101-shard-0
2020-09-09T13:17:11.867+0000 I NETWORK [js] Cannot reach any nodes for set atlas-mdt101-shard-0. Please check network connectivity and the status of the set. This has happened for 2 checks in a row.
*** It looks like this is a MongoDB Atlas cluster. Please ensure that your IP whitelist allows connections from your network.
2020-09-09T13:17:11.868+0000 E QUERY [js] Error: connect failed to replica set atlas-mdt101-shard-0/cluster0-shard-00-01.foo0.mongodb.net.:27017,cluster0-shard-00-02.foo0.mongodb.net.:27017,cluster0-shard-00-00.foo0.mongodb.net.:27017 :
相同的命令可以从私有子网(与分配给 ECS 容器的子网相同的子网)中的 VPC 中的 EC2 正常运行。
我知道 Fargate 网络有点不同。任务设置为 AWSVPC 作为 NetworkMode。错误表明 Mongo Atlas 端可能需要白名单条目,但我已经检查过,任务 IP 是 10.2.0.129,完全符合 Atlas 上分配的白名单 10.2.0.0/16。
有人尝试过使用 Fargate 或类似产品吗?我原本以为,鉴于 VPC 对等连接是在相同的 VPC/子网等中设置的,它在 Fargate 任务上也会处于活动状态。
答案1
我怀疑这与安全组有关,也许出站规则不同/缺失?或者可能是路由问题?也许某些子网没有正确的路由表是否附加了 VPC 对等条目?
我会这么做:
在中启动 EC2 实例同一子网您的 Fargate 容器运行的位置并为其分配相同的安全组和相同的 IAM 角色这样,它们的行为应该相同,但是 EC2 更容易调试。
现在测试 mongo 访问 - 如果它不起作用找出原因:
- 您当前测试实例和 Fargate 之间的安全组是否具有相同的条目(入站和出站)?
- 它们真的在同一个子网吗?
- 它们都分配有公共 IP(或者都没有)吗?
- 您能解析 mongo 节点的 IP 吗?
- 使用数据包嗅探器
tcpdump
来找出mongo
命令尝试连接的位置 - 接下来会发生什么?它连接了吗?它得到回复了吗?
您可以尝试在基于 EC2 的 ECS 集群上运行容器,Fargate 和 EC2 之间的切换很简单。
希望对您有所帮助 :)