AWS ECS Fargate 无法从 EC2 连接 MongoDB
AWS ECS Fargate cannot connect MongoDB from EC2
我在 ECS 上创建了 Fargate 集群。但是当我 运行 我的实例时,我遇到了以下错误消息:
Error: The hook orm
is taking too long to load. Make sure it is
triggering its initialize()
callback, or else set
`sails.config.orm._hookTimeout to a higher value (currently 20000) at
Timeout.tooLong as
_onTimeout
但是在 mongoDB EC2 实例中,我已经这样配置 bindIp
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
但是当我从本地尝试这个 docker 实例时,我没有发现该错误消息,而且当我在 EC2 中部署该源代码时,也没有错误。请让我知道如何解决该问题。谢谢。
这是我的示例图
您没有指定您 运行 并从本地 docker 实例连接到的 mongodb 是否也是本地的,或者它是否与中的 MongoDB 实例相同AWS(大概您会使用 VPN 或 ssh 隧道连接)。
那么为什么 docker 实例在本地工作而不是在 AWS 中将有点难以解释。我建议它与网络连接有关。
我们 运行 ECS Fargate 到 运行s mongodb 的 EC2 实例。关键是确保安全组关系也建立起来。
这可能看起来像下面的 Cloudformation 示例。您将 Fargate rAppFargateSecurityGroup 安全组(通过 8080 公开应用程序)附加到您的 Fargate 服务。并且您将 mongodb rMongoDbEc2SecurityGroup 安全组附加到 mongodb EC2 实例(通过端口 27017 公开 mongodb)。
您会注意到这里的胶水是 "SourceSecurityGroupId: !Ref rAppFargateSecurityGroup",它允许 fargate 连接到 mongodb。
rAppFargateSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${pAppName}-${pEnvironment} ECS Security Group'
VpcId: !Ref pVpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 8080
ToPort: 8080
SourceSecurityGroupId: !Ref rAppAlbSecurityGroup
rMongoDbEc2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${pAppName}-${pEnvironment} MongoDb Security Group'
VpcId: !Ref pVpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 27017
ToPort: 27017
SourceSecurityGroupId: !Ref rAppFargateSecurityGroup
您将按照以下方式配置 Fargate 服务:
rFargateService:
Type: AWS::ECS::Service
Properties:
...
NetworkConfiguration:
AwsvpcConfiguration:
SecurityGroups:
- !Ref pAppFargateSecurityGroup
Subnets:
- !Ref pPrivateSubnetA
- !Ref pPrivateSubnetB
- !Ref pPrivateSubnetC
Fargate 服务子网(需要)配置在与您的 mongodb 主机相同的 VPC 中,如果您不使用例如VPC 对等或私有 Link.
我还应该补充一点,其他可能会绊倒你的事情是 NACLs。当然还有本地主机防火墙(如 iptables)。
我在 ECS 上创建了 Fargate 集群。但是当我 运行 我的实例时,我遇到了以下错误消息:
Error: The hook
orm
is taking too long to load. Make sure it is triggering itsinitialize()
callback, or else set `sails.config.orm._hookTimeout to a higher value (currently 20000) at Timeout.tooLong as _onTimeout
但是在 mongoDB EC2 实例中,我已经这样配置 bindIp
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
但是当我从本地尝试这个 docker 实例时,我没有发现该错误消息,而且当我在 EC2 中部署该源代码时,也没有错误。请让我知道如何解决该问题。谢谢。
这是我的示例图
您没有指定您 运行 并从本地 docker 实例连接到的 mongodb 是否也是本地的,或者它是否与中的 MongoDB 实例相同AWS(大概您会使用 VPN 或 ssh 隧道连接)。
那么为什么 docker 实例在本地工作而不是在 AWS 中将有点难以解释。我建议它与网络连接有关。
我们 运行 ECS Fargate 到 运行s mongodb 的 EC2 实例。关键是确保安全组关系也建立起来。
这可能看起来像下面的 Cloudformation 示例。您将 Fargate rAppFargateSecurityGroup 安全组(通过 8080 公开应用程序)附加到您的 Fargate 服务。并且您将 mongodb rMongoDbEc2SecurityGroup 安全组附加到 mongodb EC2 实例(通过端口 27017 公开 mongodb)。
您会注意到这里的胶水是 "SourceSecurityGroupId: !Ref rAppFargateSecurityGroup",它允许 fargate 连接到 mongodb。
rAppFargateSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${pAppName}-${pEnvironment} ECS Security Group'
VpcId: !Ref pVpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 8080
ToPort: 8080
SourceSecurityGroupId: !Ref rAppAlbSecurityGroup
rMongoDbEc2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${pAppName}-${pEnvironment} MongoDb Security Group'
VpcId: !Ref pVpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 27017
ToPort: 27017
SourceSecurityGroupId: !Ref rAppFargateSecurityGroup
您将按照以下方式配置 Fargate 服务:
rFargateService:
Type: AWS::ECS::Service
Properties:
...
NetworkConfiguration:
AwsvpcConfiguration:
SecurityGroups:
- !Ref pAppFargateSecurityGroup
Subnets:
- !Ref pPrivateSubnetA
- !Ref pPrivateSubnetB
- !Ref pPrivateSubnetC
Fargate 服务子网(需要)配置在与您的 mongodb 主机相同的 VPC 中,如果您不使用例如VPC 对等或私有 Link.
我还应该补充一点,其他可能会绊倒你的事情是 NACLs。当然还有本地主机防火墙(如 iptables)。