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

无需Cognito认证,如何从Amplify的React应用直接调用Lambda?

问题解答

核心原因

你当前的代码运行在前端浏览器环境中,Amplify的IAM服务角色是给后端资源使用的服务器端角色,不会也不能暴露给前端代码。AWS SDK在浏览器中无法自动获取这个角色的凭证,因此抛出「缺少凭证」错误。

关于你的疑问

  1. 能否通过该服务角色访问Lambda?
    不行。服务角色的权限是授予Amplify平台本身(用于构建、部署、运行后端服务),前端代码运行在用户浏览器中,无法安全获取该角色的凭证,AWS也禁止这种做法(会导致权限泄露)。

  2. 可行的解决方案

    • 方案一:使用Lambda函数URL
      给目标Lambda创建函数URL,配置权限(比如允许公开访问),前端直接通过HTTP请求调用这个URL,无需使用AWS SDK,实现更简单。示例代码:

      // 替换成你的Lambda函数URL
      const lambdaUrl = "https://your-lambda-url.eu-north-1.on.aws/";
      const response = await fetch(lambdaUrl, {
        method: "POST",
        body: JSON.stringify({/* 你的请求参数 */})
      });
      const data = await response.json();
      console.log(data);
      
    • 方案二:用API Gateway封装Lambda
      创建API Gateway,将Lambda设置为集成目标,前端调用API Gateway的端点。API Gateway会处理请求转发和权限控制,你可以根据需求配置公开访问或IAM/Cognito授权。

    • 方案三:通过Amplify Auth获取临时凭证(适合需要用户认证的场景)
      如果你的应用有用户登录功能(基于Amplify Auth),可以给认证用户的IAM角色添加lambda:InvokeFunction权限,然后通过Amplify Auth获取用户的临时凭证,传给LambdaClient。示例代码:

      import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
      import { Auth } from 'aws-amplify';
      
      // 获取当前用户的临时凭证
      const credentials = await Auth.currentCredentials();
      const client = new LambdaClient({
        region: "eu-north-1",
        credentials: {
          accessKeyId: credentials.accessKeyId,
          secretAccessKey: credentials.secretAccessKey,
          sessionToken: credentials.sessionToken
        }
      });
      
      const input = { FunctionName: "test" };
      const command = new InvokeCommand(input);
      const response = await client.send(command);
      console.log(response);
      

总结

如果是完全公开的应用(无需用户登录),优先选择Lambda函数URL或API Gateway公开端点;如果需要用户认证后才能访问Lambda,使用Amplify Auth+临时凭证的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:58:11