我用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也未提供任何示例。
任何建议都值得赞赏。
答案 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是有效负载,因此您必须相应地构建该有效负载对象。