【发布时间】:2022-11-11 23:42:33
【问题描述】:
-
我创建了一个简单的 node.js/express 应用程序并创建了 docker 映像并成功将其推送到 aws ecr。
-
接下来,我创建了一个cdk将此容器部署到的项目远门和公共应用负载均衡器.
ecs_patterns.ApplicationLoadBalancedFargateService -
尽管部署 cmd (
cdk deploy) 成功,但 aws 控制台中的集群页面显示“没有正在运行的任务”,集群内的“服务”选项卡显示带有“0/1 任务正在运行”的红色条,集群内的“任务”选项卡显示正在创建任务并停止(每 1 或 2 分钟,创建一个任务并最终停止并创建一个新任务,这将永远持续下去) -
进入已停止的任务,其日志选项卡显示
ERROR: Connecting to MongoDB failed. Please check if MongoDB server is running at the correct host/port.。这是我的应用程序中的错误消息,当服务器初始化时连接到 mongodb 失败。 -
数据库凭证和连接 url 是有效的(见下文),它在具有 EIP 和域名的单独 EC2 实例中运行。事实上,我可以从我在 aws 之外的开发机器连接到数据库。
-
此外,只是为了试用,我通过控制台手动创建了一个堆栈,方法是创建安全组(用于负载均衡器和服务)、目标组、应用程序负载均衡器、侦听器(端口 80 HTTP)、集群、任务定义(设置了正确的数据库凭据) env var),服务等,它可以正常工作。
-
我想要的只是使用 cdk 创建类似的堆栈(我不想手动创建/维护它)
-
任何关于为什么从 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