【问题标题】:connection to external server (mongodb server) fails from fargate container deployed using cdk从使用 cdk 部署的 Fargate 容器连接到外部服务器(mongodb 服务器)失败
【发布时间】:2022-11-11 23:42:33
【问题描述】:
  1. 我创建了一个简单的 node.js/express 应用程序并创建了 docker 映像并成功将其推送到 aws ecr。

  2. 接下来,我创建了一个cdk将此容器部署到的项目远门和公共应用负载均衡器. ecs_patterns.ApplicationLoadBalancedFargateService

  3. 尽管部署 cmd (cdk deploy) 成功,但 aws 控制台中的集群页面显示“没有正在运行的任务”,集群内的“服务”选项卡显示带有“0/1 任务正在运行”的红色条,集群内的“任务”选项卡显示正在创建任务并停止(每 1 或 2 分钟,创建一个任务并最终停止并创建一个新任务,这将永远持续下去)

  4. 进入已停止的任务,其日志选项卡显示 ERROR: Connecting to MongoDB failed. Please check if MongoDB server is running at the correct host/port.。这是我的应用程序中的错误消息,当服务器初始化时连接到 mongodb 失败。

  5. 数据库凭证和连接 url 是有效的(见下文),它在具有 EIP 和域名的单独 EC2 实例中运行。事实上,我可以从我在 aws 之外的开发机器连接到数据库。

  6. 此外,只是为了试用,我通过控制台手动创建了一个堆栈,方法是创建安全组(用于负载均衡器和服务)、目标组、应用程序负载均衡器、侦听器(端口 80 HTTP)、集群、任务定义(设置了正确的数据库凭据) env var),服务等,它可以正常工作。

  7. 我想要的只是使用 cdk 创建类似的堆栈(我不想手动创建/维护它)

  8. 任何关于为什么从 Fargate 容器连接到外部服务器/数据库失败的线索都会非常有用。我无法将“cdk 创建的 cloudformation 模板”(不工作)与“手动创建的堆栈”(工作)进行比较,因为自动生成的模板中有太多项目。

    以下是基于 aws sample 代码的 cdk 代码:

    const vpc = new ec2.Vpc(this, "MyVpc", { maxAzs: 2 });
    const cluster = new ecs.Cluster(this, "MyCluster", { vpc });
    
    const logDriver = ecs.LogDriver.awsLogs({ streamPrefix: "api-log" });
    const ecrRepo = ecr.Repository.fromRepositoryName(this, "app-ecr", "abcdef");
    new ecs_patterns.ApplicationLoadBalancedFargateService(
      this, "FargateService", {
        assignPublicIp: true,
        cluster,
        desiredCount: 1,
        memoryLimitMiB: 1024,
        cpu: 512,
        taskImageOptions: {
          containerName: "api-container",
          image: ecs.ContainerImage.fromEcrRepository(ecrRepo),
          enableLogging: true,
          logDriver,
          environment: { MONGO_DB_URL: process.env.DB_URL as string }
        },
        publicLoadBalancer: true,
        loadBalancerName: "api-app-lb",
        serviceName: "api-service"
      }
    );
    

【问题讨论】:

  • mongodb 服务器在一个单独的 ec2 实例(没有容器)中运行,我不想/不能改变。
  • 顺便说一句,我怀疑这个问题可能是由于 cdk 创建的 2 个安全组。因此,我手动更改了入站和​​出站规则,以允许从/到任何地方的任何端口。它不起作用,并且由于连接问题正在创建和停止任务。更改安全组以使用新值后,我是否需要做任何事情?
  • ECS集群和EC2数据库在同一个VPC吗?
  • 我想将代码保持在最低限度,以便我可以利用 aws 的最佳实践/模式和默认配置。
  • @MarkB:ecs 集群和 ec2 数据库的 VPC 不同。有趣的是,手动创建的 ecs 集群和 ec2 数据库的 VPC 是相同的。这可能是原因。如何在 cdk api 中指定现有的 VPC?另外,我正在使用 dns 名称连接到 db。不过,VPC 应该是一样的吗?

标签: amazon-ecs aws-fargate aws-application-load-balancer aws-cdk-typescript


【解决方案1】:

事实证明这是一个愚蠢的错误!而不是 MONGO_DB_URL 它应该是 DB_URL 因为这是我在容器中的 node.js/express 服务器正在使用的。

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2018-04-13
    • 1970-01-01
    • 2017-11-09
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多