如何从CFN资源中“依赖” Lambda函数?

时间:2019-07-23 15:45:44

标签: aws-lambda amazon-cloudformation amazon-cognito serverless-framework

在无服务器环境中,我正在创建一个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似乎并非如此。

3 个答案:

答案 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键对我有用。