在不使用 API 网关的情况下从 Amplify 生成的 React App 调用 Lambda 函数
Invoke Lambda function from Amplify-generated React App without using API Gateway
我使用 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);
以上几行包装了 App(根)对象并按宣传的方式工作。但由于我不想使用 API 网关,我该如何直接从 React App 调用 AWS Lambda 函数?
我可以找到关于导入 AWS 等的讨论,这似乎与我们在这里尝试做的事情有冲突。调用 lambda 时我需要使用经过身份验证的连接(它已经使用上面的代码工作),因此我不能使用此示例中给出的通用调用。
Invoke API也没有提供任何示例。
如有任何建议,我们将不胜感激。
注意:如果您在长 运行 lambda 后不需要响应,请考虑 API Gateways' Asynchronous Invocation
Amplify 调用此方法 "working with service objects"。
为此,您必须确保 Cognito 为经过身份验证的用户提供的角色包括 lambda:invoke
的权限以及函数内所需的任何其他权限。我假设您现在可以这样做,但是您可以查看 Role-Based Access Control 文档,或者如果没有,请提出另一个问题。
要在 Amplify 中访问这些角色,您需要使用 Auth.currentCredentials
函数,该函数 returns 一个带有 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 网关的有效载荷是由 AWS 构建的,并且包含的信息远不止用于调用端点的正文,但是,当您直接调用时,您将获得的只是有效载荷,因此您必须相应地构建该有效载荷对象。
我使用 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);
以上几行包装了 App(根)对象并按宣传的方式工作。但由于我不想使用 API 网关,我该如何直接从 React App 调用 AWS Lambda 函数?
Invoke API也没有提供任何示例。
如有任何建议,我们将不胜感激。
注意:如果您在长 运行 lambda 后不需要响应,请考虑 API Gateways' Asynchronous Invocation
Amplify 调用此方法 "working with service objects"。
为此,您必须确保 Cognito 为经过身份验证的用户提供的角色包括 lambda:invoke
的权限以及函数内所需的任何其他权限。我假设您现在可以这样做,但是您可以查看 Role-Based Access Control 文档,或者如果没有,请提出另一个问题。
要在 Amplify 中访问这些角色,您需要使用 Auth.currentCredentials
函数,该函数 returns 一个带有 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 网关的有效载荷是由 AWS 构建的,并且包含的信息远不止用于调用端点的正文,但是,当您直接调用时,您将获得的只是有效载荷,因此您必须相应地构建该有效载荷对象。