在无服务器环境中,我正在创建一个AWS::Lambda::Permission
CFN资源,该资源允许Cognito调用Custom Message Lambda Handler。
AWS::Lambda::Permission
取决于lambda。如何确保先创建lambda?
我已经尝试将DependsOn
属性添加到AWS::Lambda::Permission
CFN资源中,但是没有运气。
下面是我的CFN资源,它正在尝试向Cognito添加权限以调用lambda:
UserPoolLambdaInvokePermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:invokeFunction
Principal: cognito-idp.amazonaws.com
FunctionName: arn:aws:lambda:${self:provider.region}:#{AWS::AccountId}:function:${self:service}-${self:provider.stage}-cognitoCustomMessage
SourceArn: arn:aws:cognito-idp:${self:provider.region}:#{AWS::AccountId}:userpool/${self:provider.environment.USER_POOL_ID}
这是我的serverless.yml
中的lambda的样子:
cognitoCustomMessage:
handler: src/main/lambdas/users_handler.cognitoCustomMessage
这是我的lambda在非常基本的级别上所做的事情:
cognitoCustomMessage(event, next) {
if (event.triggerSource === 'CustomMessage_ForgotPassword') {
// do stuff
}
return next(null, event);
}
我从上面得到的错误是:
发生错误:CognitoCustomMessageLambdaFunction-函数不存在 发现: arn:aws:lambda:us-west-2:1234567890:my-service-dev-cognitoCustomMessage (服务:AWSLambdaInternal;状态代码:404;错误代码: ResourceNotFoundException;要求编号: e2a98525-5090-4d0f-a1f5-20610474f93b)。
如果我添加一个DependsOn
:
UserPoolLambdaInvokePermission:
Type: AWS::Lambda::Permission
DependsOn: arn:aws:lambda:${self:provider.region}:#{AWS::AccountId}:function:${self:service}-${self:provider.stage}-cognitoCustomMessage
...
....
我从上面得到的错误是:
CloudFormation模板无效:模板格式错误: DependsOn必须是字符串或字符串列表。
我也尝试过:
UserPoolLambdaInvokePermission:
Type: AWS::Lambda::Permission
DependsOn: CognitoCustomMessageLambdaFunction
...
....
我从上面得到的错误是:
发生错误:CognitoCustomMessageLambdaFunction-函数不存在 发现: arn:aws:lambda:us-west-2:1234567890:my-service-dev-cognitoCustomMessage (服务:AWSLambdaInternal;状态代码:404;错误代码: ResourceNotFoundException;要求编号: b888ae82-a0d7-4d69-888e-9e63027925c1)。
我希望应该有一些方法可以在需要使用CFN资源之前先创建一个lambda函数,但是DependsOn
似乎并非如此。
答案 0 :(得分:3)
DependsOn属性在云形成模板中应具有Lambda函数的逻辑名称,而不是Lambda函数的ARN。例如,如果您在Cloud Formation模板中Lambda函数的逻辑名称是MyLambda,则DependsOn应该像这样:
UserPoolLambdaInvokePermission:
Type: AWS::Lambda::Permission
DependsOn: MyLambda
答案 1 :(得分:0)
您在serverless.yml中定义的函数会在后台转换为cloudformation资源。该资源称为XLambdaFunction,其中X =您的函数名称,首字母大写。
所以,如果您有:
functions:
hello:
handler: handler.hello
...other function stuff...
您可以参考:
DependsOn: HelloLambdaFunction
我只能假设,如果您的函数已经命名为CognitoCustomMessageLambdaFunction
,那么您将必须引用:
DependsOn: CognitoCustomMessageLambdaFunctionLambdaFunction
答案 2 :(得分:0)
我遇到了类似的问题,添加了DependOn键对我有用。