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

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)
  };
};

三、权限验证步骤

  1. 登录AWS控制台,进入IAM服务,找到你的Lambda函数对应的执行角色(名称通常为amplify-<项目名>-<环境名>-<数字>-lambdaRole)。
  2. 查看角色的权限策略,确认是否存在Amplify自动生成的策略,允许appsync:GraphQL操作。
  3. 若权限缺失,手动添加内联策略:
{
  "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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:46:09