如何在无服务器离线的情况下使用Cognito事件/触发器调用lambda进行本地测试



我正在尝试为自定义验证流编写Cognito AuthChallenge lambdas的三个。我想使用serverless-offline在本地使用nodejs开发和测试lambdas(也在cicd管道中进行jest测试)。

例如,下面是来自aws-lambda包的VerifyAuthChallengeResponseTriggerEvent类型的简化处理程序代码:

import {
VerifyAuthChallengeResponseTriggerEvent,
VerifyAuthChallengeResponseTriggerHandler
} from "aws-lambda/trigger/cognito-user-pool-trigger/verify-auth-challenge-response";
export const verifyChallengeHandler: VerifyAuthChallengeResponseTriggerHandler =
async (event: VerifyAuthChallengeResponseTriggerEvent):
Promise<VerifyAuthChallengeResponseTriggerEvent> => {
event.response.answerCorrect = event.request.privateChallengeParameters["code"] == event.request.challengeAnswer;
return event;
};

我发现到处都只有使用API网关与http事件的例子,所以当我在无服务器配置的functions下使用以下配置在本地尝试它时,它也起作用了:

events: [
{
http: {
method: "post",
path: "auth-verify",
cors: {
origin: '*',
headers:[
"Content-Type",
"X-Amz-Date",
"X-Amz-Security-Token",
"Authorization",
"X-Api-Key",
"X-Requested-With",
"Accept",
],
allowCredentials: true,
},
},
},
],

但是,我必须重写处理程序代码,以便它适用于不同的事件类型。这不是很好,因为用于测试的代码与要部署的代码是不同的。

import { ValidatedEventAPIGatewayProxyEvent } from '@libs/apiGateway';
import { middyfy } from '@libs/lambda';
import schema from './schema';

const verifyChallengeHandler: ValidatedEventAPIGatewayProxyEvent<typeof schema> = async(event) => {
... 

是否有一种方法可以配置无服务器和调用什么命令,我可以在本地调用lambdas,也可以在jest测试中使用正确的事件,而无需更改代码?我也可以创建自定义的事件模拟(但是如何指定它们呢?)Ie。在functions下使用config,如下所示:

events: [
{
cognitoUserPool: {
pool: <some_pool_name>,
trigger: 'VerifyAuthChallengeResponse' as const,
existing: false,
},
},

好吧,看来我找到了答案,这并不是那么难,但只是为了完成这个问题,我将它发布在这里。它基于以下答案aws lambda: invoke with payload from cli,我用:

开始本地lambda代码:
npm start

,然后用mock-event调用lambda。

aws lambda invoke /dev/null 
--endpoint-url http://localhost:3002 
--function-name lambda-handler-dev-lambdaHandler 
--invocation-type Event 
--payload file:///home/...<path to my project>/src/functions/lambda-handler/mock-event.json

这非常好,因为一个终端等待更改并在任何代码更改后重新加载它们,它还显示lambda的日志输出,而我使用另一个终端只是调用lambda。我喜欢流畅的清晰和速度。

我还从Serverless中找到了另一种方法(在我的Serverless项目模板的README文件中,我以前没有看到它,是吗?),并且在一个终端中执行所有内容(日志和响应在一个终端中),但是它需要一些时间来启动并调用lambda。另一方面,与只给我一些基本响应的aws lambda cli不同,它还打印了漂亮而完整的响应对象。它可以被调用为:

npx sls invoke local -f lambda-handler-dev-lambdaHandler --path src/functions/lambda-handler/mock-event.json

这是到目前为止的本地发展。关于测试,我将在__tests__文件夹中创建通常的玩笑测试,在该文件夹中创建模拟对象并调用处理程序方法:

const event = {foo: bar};
const main = require("../src/functions/lambda-handler/handler").main;
const response = await main(...event-params...);

最新更新