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

时间:2019-05-13 06:29:38

标签: reactjs amazon-web-services aws-lambda aws-amplify

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

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

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

Auth.configure(awsconfig);

以上几行包装了App(根)对象,并按所宣传的工作。但是,由于我不想使用API​​网关,如何直接从React App调用AWS Lambda函数?

我可以找到有关answers的导入AWS等的内容,这似乎与我们在此所做的尝试存在冲突。调用lambda时,我需要使用经过身份验证的连接(该连接已经可以使用上面的代码工作),因此我无法使用本示例中给出的泛型调用。

Invoke API也未提供任何示例。

任何建议都值得赞赏。

1 个答案:

答案 0 :(得分:3)

注意:如果长时间运行的lambda之后不需要响应,请考虑使用API Gateways' Asynchronous Invocation

Amplify将这种方法称为"working with service objects"

要执行此操作,您必须确保Cognito赋予您经过身份验证的用户的角色包括对lambda:invoke的权限以及该功能内所需的任何其他权限。我假设您现在可以执行此操作,但是您可以查看Role-Based Access Control文档,或者询问是否存在其他问题。

要在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 }),
    });
  })

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

但是,您应该注意,API Gateway的有效负载是由AWS构造的,并且不仅包含调用端点的主体,还包含更多信息,但是,当您直接调用时,所有操作ll get是有效负载,因此您必须相应地构建该有效负载对象。