AWS Lambda 未被其他 Lambda 调用
AWS Lambda not being invoked by other Lambda
我已经根据以下 Github Repo
创建了自定义 AWS 身份验证流程
我希望 verify-auth-challenge-response
Lambda 调用我创建的自定义 Lambda,我用它来设置用户密码。这是在用户没有经过验证的电子邮件地址的情况下。我不希望他们必须完成两次验证码,所以希望这个新的 Lambda 在接受挑战时设置密码。
我修改了verify-auth-challenge-response
如下
import { VerifyAuthChallengeResponseTriggerHandler } from 'aws-lambda';
import AWS from 'aws-sdk';
export const handler: VerifyAuthChallengeResponseTriggerHandler = async (event, context) => {
const expectedAnswer = event.request.privateChallengeParameters!.secretLoginCode;
if (event.request.challengeAnswer === expectedAnswer) {
event.response.answerCorrect = true;
changePassword(context);
} else {
event.response.answerCorrect = false;
}
return event;
};
//@ts-ignore
const changePassword = async (context) => {
const lambda = new AWS.Lambda({
region: 'eu-west-2'
});
const params = {
FunctionName: 'CustomLambdaName', // the lambda function we are going to invoke
InvocationType: 'Event',
LogType: 'Tail',
Payload: '{ "password" : "PasswordSuppliedByUser" }'
}
lambda.invoke(params, function(err, data) {
if (err){
console.log(err, err.stack);
context.done('error', err);
} // an error occurred
else {
console.log(data);
context.succeed(data.Payload);
} // successful response
});
}
我将自定义 Lambda 添加到 Resources
下的项目 template.yaml:
ChangePassword:
Type: AWS::Serverless::Function
Properties:
CodeUri: lambda-triggers/change-password/
Handler: change-password.handler
Runtime: nodejs12.x
部署后,我创建了一个具有这些策略的 IAM 角色
AWSLambdaExecute
AWSLambdaBasicExecutionRole
AWSLambdaRole
并将角色手动分配给 verify-auth-challenge-response
和 change-password
lambda。
当 verify-auth-challenge-response
执行时,它 returns OK,我添加的控制台日志显示它通过了 invoke 调用。但是我的 change-password
lambda 从未被调用过。知道我如何调试为什么它没有被调用吗?我想知道它是否与 Lambda 中的异步行为有关。
谢谢!
I am wondering if its related to async behaviour in the Lambda.
可能吧。您正在使用 async handler,因此您的函数似乎在它有机会调用其他函数之前完成。
为了克服这个问题,您可以将代码包装在 new Promise
中的处理程序中,如 AWS docs.
中所示
我已经根据以下 Github Repo
创建了自定义 AWS 身份验证流程我希望 verify-auth-challenge-response
Lambda 调用我创建的自定义 Lambda,我用它来设置用户密码。这是在用户没有经过验证的电子邮件地址的情况下。我不希望他们必须完成两次验证码,所以希望这个新的 Lambda 在接受挑战时设置密码。
我修改了verify-auth-challenge-response
如下
import { VerifyAuthChallengeResponseTriggerHandler } from 'aws-lambda';
import AWS from 'aws-sdk';
export const handler: VerifyAuthChallengeResponseTriggerHandler = async (event, context) => {
const expectedAnswer = event.request.privateChallengeParameters!.secretLoginCode;
if (event.request.challengeAnswer === expectedAnswer) {
event.response.answerCorrect = true;
changePassword(context);
} else {
event.response.answerCorrect = false;
}
return event;
};
//@ts-ignore
const changePassword = async (context) => {
const lambda = new AWS.Lambda({
region: 'eu-west-2'
});
const params = {
FunctionName: 'CustomLambdaName', // the lambda function we are going to invoke
InvocationType: 'Event',
LogType: 'Tail',
Payload: '{ "password" : "PasswordSuppliedByUser" }'
}
lambda.invoke(params, function(err, data) {
if (err){
console.log(err, err.stack);
context.done('error', err);
} // an error occurred
else {
console.log(data);
context.succeed(data.Payload);
} // successful response
});
}
我将自定义 Lambda 添加到 Resources
下的项目 template.yaml:
ChangePassword:
Type: AWS::Serverless::Function
Properties:
CodeUri: lambda-triggers/change-password/
Handler: change-password.handler
Runtime: nodejs12.x
部署后,我创建了一个具有这些策略的 IAM 角色
AWSLambdaExecute
AWSLambdaBasicExecutionRole
AWSLambdaRole
并将角色手动分配给 verify-auth-challenge-response
和 change-password
lambda。
当 verify-auth-challenge-response
执行时,它 returns OK,我添加的控制台日志显示它通过了 invoke 调用。但是我的 change-password
lambda 从未被调用过。知道我如何调试为什么它没有被调用吗?我想知道它是否与 Lambda 中的异步行为有关。
谢谢!
I am wondering if its related to async behaviour in the Lambda.
可能吧。您正在使用 async handler,因此您的函数似乎在它有机会调用其他函数之前完成。
为了克服这个问题,您可以将代码包装在 new Promise
中的处理程序中,如 AWS docs.