Lambda使用API_KEY调用AppSync出现401未授权错误如何解决?
解决方案
结论
在Lambda中使用API_KEY作为认证方式调用AppSync完全可行,不需要更换其他AUTH_TYPE。你遇到的401错误不是认证方式不支持,是基础配置校验不通过或者客户端适配Node.js环境的配置缺失导致的。
第一步:基础配置校验
先确认两个基础配置没有问题:
- 你填入的
apiKey是AppSync控制台对应实例下「设置」-「API 密钥」页面的有效密钥,状态为启用,且未超过设置的过期时间 - AppSync实例的「设置」-「默认授权模式」已经设置为API_KEY,或者你调用的
disconnect突变的Resolver单独配置了支持API_KEY授权
第二步:修正AWSAppSyncClient初始化配置
aws-appsync客户端默认针对前端浏览器场景设计,在Node.js(Lambda)服务端环境运行时,需要额外添加缓存策略配置,也可以显式指定请求头确保x-api-key被正确携带,修改后的配置如下:
const config = { url: graphqlEndpoint, region: 'us-east-1', auth: { type: AUTH_TYPE.API_KEY, apiKey: 'xxxxxxxxxx', // 替换为你的有效API_KEY }, disableOffline: true, // 新增以下配置适配Node.js环境,关闭不必要的缓存逻辑 defaultOptions: { watchQuery: { fetchPolicy: 'no-cache', errorPolicy: 'all', }, query: { fetchPolicy: 'no-cache', errorPolicy: 'all', }, mutate: { fetchPolicy: 'no-cache', errorPolicy: 'all', } }, // 可选:显式注入请求头,确保API密钥被正确携带 headers: { 'x-api-key': 'xxxxxxxxxx' // 和上方auth配置中的apiKey保持一致 } };
更轻量的替代方案(推荐)
aws-appsync客户端内置了大量离线同步、实时订阅等前端场景才需要的功能,在Lambda环境中完全用不上,你可以直接用更轻量的GraphQL客户端,避免适配问题,示例代码如下:
const timeout = parseInt(process.env.TIMEOUT); const graphqlEndpoint = 'https://xxxxxxxxxxxxxx.appsync-api.us-east-1.amazonaws.com/graphql'; const { request, gql } = require('graphql-request'); // 突变定义 const mutation = gql` mutation disconnect($id: ID!) { disconnect(id: $id) } `; exports.handler = async function () { const timestamp = Date.now() - timeout; try { const ids = [1, 2, 3]; // 替换为实际取id的逻辑 if (!ids.length) return { expired: 0 }; const headers = { 'x-api-key': 'xxxxxxxxxx' }; // 替换为你的有效API_KEY // 批量发起请求 const promises = ids.map(id => request(graphqlEndpoint, mutation, { id }, headers)); await Promise.all(promises); return { expired: ids.length }; } catch (error) { return error; } };
注意:使用该方案需要先安装
graphql-request和graphql依赖,打包上传到Lambda即可。
内容的提问来源于stack exchange,提问作者Esteban
相关产品推荐
相关产品推荐

