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 构建的,并且包含的信息远多于调用端点的主体,但是当您直接调用时,您将获得的只是有效负载,因此您将必须相应地构建该有效负载对象。
| 归档时间: |
|
| 查看次数: |
5470 次 |
| 最近记录: |