You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS负载均衡下无需修改Header的Apollo GraphQL健康检查方案咨询

解决方案

方法1:使用GET请求的GraphQL查询做健康检查

Apollo Server的CSRF防护默认仅对POST请求生效(GET请求不涉及数据修改,CSRF风险极低),可按以下步骤实现:

  1. 在GraphQL Schema中添加健康检查字段:
type Query {
  health: String!
}
  1. 编写对应的Resolver(以JavaScript为例):
const resolvers = {
  Query: {
    health: () => "OK"
  }
};
  1. 将AWS负载均衡的健康检查URL设置为:
    /graphql?query={health}
    确保负载均衡使用GET请求发起检查(AWS ALB默认健康检查为GET,若之前是POST需修改请求方法)。

这种方式无需修改请求Header,GET请求会直接绕过Apollo的CSRF验证逻辑,返回200状态码。

方法2:配置CSRF防护允许健康检查请求

如果必须使用POST请求,可通过Apollo Server的csrfPreventionOptions配置,让健康检查请求通过验证:

在Apollo Server初始化时添加自定义验证逻辑:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  csrfPreventionOptions: {
    validateRequest: (req) => {
      // 识别健康检查的查询内容并放行
      const query = req.body?.query;
      if (query && query.includes("{ health }")) {
        return true;
      }
      // 其他请求沿用默认CSRF验证逻辑
      return defaultValidateRequest(req);
    }
  }
});

该方式通过自定义逻辑识别健康检查请求,无需修改Header,同时保留对其他请求的CSRF防护。

方法3:添加独立健康检查端点(兼容GraphQL级验证)

若负载均衡允许指向非GraphQL端点,可在同一服务中添加独立路由,内部触发GraphQL查询验证服务状态:

// 以Express集成Apollo为例
const express = require('express');
const { ApolloServer } = require('@apollo/server');
const { expressMiddleware } = require('@apollo/server/express4');

const app = express();

// 新增健康检查路由
app.get('/health', async (req, res) => {
  try {
    // 内部执行GraphQL健康查询
    const { data } = await server.executeOperation({
      query: '{ health }'
    });
    res.status(data?.health === 'OK' ? 200 : 500).send('OK');
  } catch (err) {
    res.status(500).send('Service Unavailable');
  }
});

// 挂载Apollo Server中间件
app.use('/graphql', express.json(), expressMiddleware(server));

将负载均衡健康检查URL设为/health,该端点会验证GraphQL服务完整性,且不会触发CSRF防护。


内容的提问来源于stack exchange,提问作者Him

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:05:17