首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ApplicationLoadBalancedFargateService与Node.js和WebSockets在每次健康检查后都会停止。

ApplicationLoadBalancedFargateService与Node.js和WebSockets在每次健康检查后都会停止。
EN

Stack Overflow用户
提问于 2022-05-11 20:50:28
回答 2查看 955关注 0票数 1

我使用CDKApplicationLoadBalancedFargateService构造来部署带有负载平衡ECS Fargate服务。这是WebSocket API,它用Socket.io写在Node.js上。

它在本地工作很好,但是在AWS中,它经常被健康检查杀死,并有一个错误:

service CoreStack-CoreServiceA69F11F4-9ciFOoAL5oj9 (port 5000) is unhealthy in target-group CoreS-CoreS-FMLY84WTNYVN due to (reason Health checks failed with these codes: [404]).

堆栈的代码:

代码语言:javascript
复制
import { aws_ecs_patterns, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Repository } from 'aws-cdk-lib/aws-ecr';
import { ContainerImage } from 'aws-cdk-lib/aws-ecs';
import { HostedZone } from 'aws-cdk-lib/aws-route53';
import { ApplicationProtocol } from 'aws-cdk-lib/aws-elasticloadbalancingv2';
import ec2 = require('aws-cdk-lib/aws-ec2');
import ecs = require('aws-cdk-lib/aws-ecs');

const DOMAIN_NAME = 'newordergame.com';
const SUBDOMAIN = 'core';
const coreServiceDomain = SUBDOMAIN + '.' + DOMAIN_NAME;

export class CoreStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const vpc = new ec2.Vpc(this, 'CoreServiceVpc', { maxAzs: 2 });

    const cluster = new ecs.Cluster(this, 'Cluster', { vpc });

    const repository = Repository.fromRepositoryName(
      this,
      'CoreServiceRepository',
      'core-service'
    );

    const image = ContainerImage.fromEcrRepository(repository, 'latest');

    const zone = HostedZone.fromLookup(this, 'NewOrderGameZone', {
      domainName: DOMAIN_NAME
    });

    // Instantiate Fargate Service with just cluster and image
    new aws_ecs_patterns.ApplicationLoadBalancedFargateService(
      this,
      'CoreService',
      {
        cluster,
        taskImageOptions: {
          image: image,
          containerName: 'core',
          containerPort: 5000,
          enableLogging: true
        },
        protocol: ApplicationProtocol.HTTPS,
        domainName: coreServiceDomain,
        domainZone: zone
      }
    );
  }
}

The Dockerfile

代码语言:javascript
复制
FROM node:16-alpine
RUN mkdir -p /usr/app
WORKDIR /usr/app
COPY package.json ./
RUN npm install
COPY webpack.config.js tsconfig.json ./
COPY src ./src
RUN npm run webpack:build
EXPOSE 5000
CMD [ "node", "build/main.js" ]

应用程序还侦听端口5000。每隔3分钟就会坠毁一次。

有人知道怎么修吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-05-11 20:52:56

您的健康检查URL正在返回一个404状态代码。您需要使用返回200状态代码的路径配置健康检查。

票数 2
EN

Stack Overflow用户

发布于 2022-05-12 19:38:28

ELB健康检查仅适用于HTTPHTTPS,不适用于包括Socket.io在内的WebSocket

因此,我发现最好的解决方法是让服务与WebSocket一起侦听HTTP 用状态200回答它。

使用这种方法,健康检查实际上将检查服务的状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72207446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档