AWS负载均衡下无需修改Header的Apollo GraphQL健康检查方案咨询
解决方案
方法1:使用GET请求的GraphQL查询做健康检查
Apollo Server的CSRF防护默认仅对POST请求生效(GET请求不涉及数据修改,CSRF风险极低),可按以下步骤实现:
- 在GraphQL Schema中添加健康检查字段:
type Query { health: String! }
- 编写对应的Resolver(以JavaScript为例):
const resolvers = { Query: { health: () => "OK" } };
- 将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
相关产品推荐
相关产品推荐

