在不使用 API Gateway 的情况下从 Amplify 生成的 React App 调用 Lambda 函数

LNI*_*LNI 5 amazon-web-services reactjs aws-lambda aws-amplify

我使用Amplify生成静态网站和底层 React 应用程序。最初我还生成了一个 API 端点,但由于我的 lambda 函数可能会超过 API 网关超时限制(29 秒),我需要直接从生成的 React 应用程序调用 lambda 函数,而不是通过 API 网关。

代码如下所示,用于 React 页面使用 Cognito 进行身份验证:

import Auth from '@aws-amplify/auth';
import { withAuthenticator } from 'aws-amplify-react';
import awsconfig from './aws-exports';

Auth.configure(awsconfig);
Run Code Online (Sandbox Code Playgroud)

以上几行包装了 App(根)对象并按宣传的方式工作。但是既然不想使用API​​ Gateway,如何直接从React App调用AWS Lambda函数呢?

我能找到的答案是关于导入 AWS 等的,这似乎与我们在这里尝试做的事情相冲突。在调用 lambda 时,我需要使用经过身份验证的连接(已经使用上述代码工作),因此我不能使用本示例中给出的通用调用。

调用API不提供任何的例子也是如此。

任何建议表示赞赏。

tho*_*ace 12

注意:如果在长时间运行 lambda 后不需要响应,请考虑API Gateways 的异步调用

Amplify 称这种方法为“使用服务对象”

为此,您必须确保 Cognito 角色为您的经过身份验证的用户提供的权限lambda:invoke以及该功能所需的任何其他权限。我假设您现在可以这样做,但是您可以查看基于角色的访问控制文档,或者如果不能,请提出另一个问题。

要在 Amplify 中访问这些角色,您需要使用该Auth.currentCredentials函数,该函数返回一个带有credentials对象的承诺,然后可以在aws-sdk客户端上使用该承诺。

例如:

import Auth from '@aws-amplify/auth';
import Lambda from 'aws-sdk/clients/lambda'; // npm install aws-sdk

Auth.currentCredentials()
  .then(credentials => {
    const lambda = new Lambda({
      credentials: Auth.essentialCredentials(credentials)
    });
    return lambda.invoke({
      FunctionName: 'my-function',
      Payload: JSON.stringify({ hello: world }),
    });
  })

Run Code Online (Sandbox Code Playgroud)

您可以在AWS-SDK javascript 文档上查看有关调用 lambda 的完整文档

但是您应该知道,来自 API Gateway 的有效负载是由 AWS 构建的,并且包含的​​信息远多于调用端点的主体,但是当您直接调用时,您将获得的只是有效负载,因此您将必须相应地构建该有效负载对象。