您如何从 CFN 资源“依赖”一个 Lambda 函数?

Jef*_*Wen 4 aws-cloudformation amazon-cognito aws-lambda serverless-framework

在无服务器中,我正在创建一个AWS::Lambda::PermissionCFN 资源,它允许 Cognito 调用自定义消息 Lambda 处理程序

AWS::Lambda::Permission取决于 lambda。如何确保首先创建 lambda?

我已经尝试向CFN 资源添加一个DependsOn属性,但AWS::Lambda::Permission没有成功。

下面是我的 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}
Run Code Online (Sandbox Code Playgroud)

这是我的 lambda 在我的 lambda 中的样子serverless.yml

cognitoCustomMessage:
  handler: src/main/lambdas/users_handler.cognitoCustomMessage
Run Code Online (Sandbox Code Playgroud)

这是我的 lambda 在非常基本的层面上所做的:

cognitoCustomMessage(event, next) {
  if (event.triggerSource === 'CustomMessage_ForgotPassword') {
    // do stuff
  }
  return next(null, event);
}
Run Code Online (Sandbox Code Playgroud)

我从上面得到的错误是:

发生错误:CognitoCustomMessageLambdaFunction - 找不到函数:arn:aws:lambda:us-west-2:1234567890:my-service-dev-cognitoCustomMessage(服务:AWSLambdaInternal;状态代码:404;错误代码:ResourceNotFoundException;请求 ID: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
  ...
  ....
Run Code Online (Sandbox Code Playgroud)

我从上面得到的错误是:

CloudFormation 模板无效:模板格式错误:DependsOn 必须是字符串或字符串列表。

我也试过:

UserPoolLambdaInvokePermission:
  Type: AWS::Lambda::Permission
  DependsOn: CognitoCustomMessageLambdaFunction
  ...
  ....
Run Code Online (Sandbox Code Playgroud)

我从上面得到的错误是:

发生错误:CognitoCustomMessageLambdaFunction - 找不到函数:arn:aws:lambda:us-west-2:1234567890:my-service-dev-cognitoCustomMessage(服务:AWSLambdaInternal;状态代码:404;错误代码:ResourceNotFoundException;请求 ID:b888ae82 -a0d7-4d69-888e-9e63027925c1)。

我希望在需要使用它的 CFN 资源之前应该有一些方法来创建一个 lambda 函数,但DependsOn.

小智 10

在 serverless.yml 中定义的函数会在后台转换为 cloudformation 资源。该资源称为 XLambdaFunction,其中 X = 函数名称,首字母大写。

所以如果你有:

functions:
  hello:
    handler: handler.hello
    ...other function stuff...
Run Code Online (Sandbox Code Playgroud)

您可以参考:

DependsOn: HelloLambdaFunction
Run Code Online (Sandbox Code Playgroud)

我只能假设,如果您的函数已经命名,CognitoCustomMessageLambdaFunction那么您必须引用:

DependsOn: CognitoCustomMessageLambdaFunctionLambdaFunction
Run Code Online (Sandbox Code Playgroud)


小智 5

DependsOn 属性应具有 Cloud 形成模板中 Lambda 函数的逻辑名称,而不是 Lambda 函数的 ARN。例如,如果您的 Lambda 函数在 Cloud Formation 模板中的逻辑名称是 MyLambda,则 DependsOn 应如下所示:

UserPoolLambdaInvokePermission:
  Type: AWS::Lambda::Permission
  DependsOn: MyLambda 
Run Code Online (Sandbox Code Playgroud)