无需Cognito认证,如何从Amplify的React应用直接调用Lambda?
核心原因
你当前的代码运行在前端浏览器环境中,Amplify的IAM服务角色是给后端资源使用的服务器端角色,不会也不能暴露给前端代码。AWS SDK在浏览器中无法自动获取这个角色的凭证,因此抛出「缺少凭证」错误。
关于你的疑问
能否通过该服务角色访问Lambda?
不行。服务角色的权限是授予Amplify平台本身(用于构建、部署、运行后端服务),前端代码运行在用户浏览器中,无法安全获取该角色的凭证,AWS也禁止这种做法(会导致权限泄露)。可行的解决方案
方案一:使用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

