AWS Lambda调用AppSync GraphQL端点遇权限拒绝问题求助
Lambda调用AppSync GraphQL端点的认证配置解决方案
你当前使用的SignatureV4签名方式属于IAM认证体系,不需要配置API密钥。因为你已经通过Amplify CLI创建函数并开启了generategraphqlpermissions,Amplify会自动为Lambda执行角色添加AppSync的访问权限,核心问题出在请求内容的完整性和权限验证环节。
一、当前代码的核心问题
你的CreateCalendarEvent mutation需要传入$input变量,但当前请求的body里仅包含query模板,未携带实际变量参数,这会导致AppSync返回参数缺失的错误。
二、修正后的完整代码
import crypto from '@aws-crypto/sha256-js'; import { defaultProvider } from '@aws-sdk/credential-provider-node'; import { SignatureV4 } from '@aws-sdk/signature-v4'; import { HttpRequest } from '@aws-sdk/protocol-http'; import { default as fetch, Request } from 'node-fetch'; const GRAPHQL_ENDPOINT = '<你的AppSync端点>'; const AWS_REGION = process.env.AWS_REGION || 'us-east-1'; const { Sha256 } = crypto; const query = /* GraphQL */ `mutation CreateCalendarEvent($input: CreateCalendarEventInput!, $condition: ModelCalendarEventConditionInput) { createCalendarEvent(input: $input, condition: $condition) { __typename id start end title actions allDay resizable draggable colour createdAt updatedAt } }`; export const handler = async (event) => { console.log(`EVENT: ${JSON.stringify(event)}`); const endpoint = new URL(GRAPHQL_ENDPOINT); const signer = new SignatureV4({ credentials: defaultProvider(), region: AWS_REGION, service: 'appsync', sha256: Sha256 }); // 从事件中提取输入参数,可根据实际传入结构调整 const inputVariables = event.input || {}; const requestToBeSigned = new HttpRequest({ method: 'POST', headers: { 'Content-Type': 'application/json', host: endpoint.host }, hostname: endpoint.host, // 补充variables字段,传入mutation所需的input参数 body: JSON.stringify({ query, variables: { input: inputVariables } }), path: endpoint.pathname }); const signed = await signer.sign(requestToBeSigned); const request = new Request(endpoint, signed); let statusCode = 200; let body; let response; try { response = await fetch(request); body = await response.json(); if (body.errors) statusCode = 400; } catch (error) { statusCode = 500; body = { errors: [ { message: error.message } ] }; } return { statusCode, // 如需跨域请取消注释 // headers: { // "Access-Control-Allow-Origin": "*", // "Access-Control-Allow-Headers": "*" // }, body: JSON.stringify(body) }; };
三、权限验证步骤
- 登录AWS控制台,进入IAM服务,找到你的Lambda函数对应的执行角色(名称通常为
amplify-<项目名>-<环境名>-<数字>-lambdaRole)。 - 查看角色的权限策略,确认是否存在Amplify自动生成的策略,允许
appsync:GraphQL操作。 - 若权限缺失,手动添加内联策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:GraphQL", "Resource": "arn:aws:appsync:<你的AWS区域>:<你的账号ID>:apis/<你的AppSync API ID>/types/Mutation/fields/createCalendarEvent" } ] }
四、测试注意事项
- Lambda的执行角色通过IAM权限访问AppSync,无需额外配置API密钥。
- 测试时传入包含
start、end、title等必填字段的input参数,示例测试事件:
{ "input": { "start": "2024-05-20T09:00:00Z", "end": "2024-05-20T10:00:00Z", "title": "测试会议" } }
内容的提问来源于stack exchange,提问作者Jack Hurt
相关产品推荐
相关产品推荐

