【发布时间】:2019-07-17 16:18:08
【问题描述】:
简而言之,我想将我的 Nginx 和 Node.js docker 映像部署到 AWS ECS。为了构建基础设施,我使用的是 Terraform。但是,在服务器中运行的任务不断失败。我在访问我的域bb-diner-api-https.shaungc.com 时也得到了503 Service Temporarily Unavailable。
(您可以see my entire project repo here,但我会在下面嵌入链接并引导您浏览特定的相关文件。)
在terraform apply 之后,它报告创建了 15 个资源,我可以看到在 ECS 门户网站中运行的服务和任务。但是,我的任务总是会在一段时间后失败,如下所示:
因为健康检查总是失败:
对于nodejs,我有错误代码137,这是由接收关闭信号引起的。这意味着 nodejs 不是原因——它是 nginx 失败了太多的健康检查,以至于它终止了 nodejs。对于 nginx,点击View logs in CloudWatch 后根本没有显示任何消息(我确实在task definition 中设置了awslogs)。
我的健康检查设置
任务定义容器健康检查
基本上我在 nginx 中准备了一条路由,只是为了进行健康检查。在task definition > container_definition(json 格式)中,我对容器nginx 进行了健康检查,如下所示:
"command": ["CMD-SHELL","curl -f http://localhost/health-check || exit 1"],在我的nginx.conf 我有:
...
server {
listen 80;
...
location /health-check {
# access_log off;
return 200 "I'm healthy!" ; # refer to https://serverfault.com/questions/518220/nginx-solution-for-aws-amazon-elb-health-checks-return-200-without-if
}
}
所以我真的不知道为什么任务没有通过健康检查。
负载均衡器的目标组健康检查
我还为我创建了一个 Application Load Balancer,以将我在 Route 53 上的域名链接到它。我注意到还有另一个地方在做健康检查:目标组和应用程序负载均衡器。这里的检查也失败了,我的实例状态是draining。
安全组
我想我打开了所有可能的端口。
那么为什么运行状况检查会失败以及还缺少什么?
有很多文章指出 AWS 上的 Nginx 配置、PORT 或入站限制(安全组/目标组)可能是常见原因,我查看了所有这些。我让nginx监听80,将容器端口设置为80,在安全组中允许大范围的入站端口。我还能错过什么?
【问题讨论】:
标签: node.js nginx terraform amazon-ecs terraform-provider-aws