Lambda 目标未因 Lambda 错误而被触发

Lambda destination not being triggered on Lambda error

我有一个 Cloudformation 堆栈,它通过 Lambda 目标配置和 SQS 队列将两个 Lambda 连接在一起。

想法是当 HelloAddFunction 出错时触发 ErrorsFunction

这个堆栈部署得很好,当我用一些整数值调用它时 HelloAddFunction 工作正常。

当我用非整数值调用它时,我可以在 HelloAddFunction 中看到一个错误,但是 ErrorsFunction 似乎没有收到相应的错误。

ErrorsFunctionErrorsQueue 的绑定似乎有效 - 如果我通过控制台将一条消息推送到 ErrorsQueue,它会被 ErrorsFunction 接收到。

所以感觉 Lambda 目标配置不知何故无法正常工作。

我在这里错过了什么?

TIA

AWSTemplateFormatVersion: '2010-09-09'
Outputs: {}
Parameters:
  AppName:
    Type: String
  MemorySizeSmall:
    Default: 512
    Type: Number
  RuntimeVersion:
    Default: '3.8'
    Type: String
  TimeoutShort:
    Default: 5
    Type: Number
Resources:
  HelloAddEventConfig:
    Properties:
      DestinationConfig:
        OnFailure:
          Destination:
            Fn::GetAtt:
            - ErrorsQueue
            - Arn
      FunctionName:
        Ref: HelloAddFunction
      MaximumRetryAttempts: 0
      Qualifier: $LATEST
    Type: AWS::Lambda::EventInvokeConfig
  HelloAddFunction:
    Properties:
      Code:      
        ZipFile: |
          def handler(event, context):
            x, y = int(event["x"]), int(event["y"])
            return x+y     
      Handler: index.handler
      MemorySize:
        Ref: MemorySizeSmall
      Role:
        Fn::GetAtt:
        - HelloAddRole
        - Arn
      Runtime:
        Fn::Sub: python${RuntimeVersion}
      Timeout:
        Ref: TimeoutShort
    Type: AWS::Lambda::Function
  HelloAddRole:
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Action: sts:AssumeRole
          Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
        Version: '2012-10-17'
      Policies:
      - PolicyDocument:
          Statement:
          - Action: logs:*
            Effect: Allow
            Resource: '*'
          - Action: sqs:*
            Effect: Allow
            Resource: '*'
          Version: '2012-10-17'
        PolicyName:
          Fn::Sub: hello-add-role-policy-${AWS::StackName}
    Type: AWS::IAM::Role
  ErrorsFunction:
    Properties:
      Code:
        ZipFile: |
          def handler(event, context):
            print (event)
      Handler: index.handler
      MemorySize:
        Ref: MemorySizeSmall
      Role:
        Fn::GetAtt:
        - ErrorsRole
        - Arn
      Runtime:
        Fn::Sub: python${RuntimeVersion}
      Timeout:
        Ref: TimeoutShort
    Type: AWS::Lambda::Function
  ErrorsQueue:
    Properties: {}
    Type: AWS::SQS::Queue
  ErrorsQueueBinding:
    Properties:
      EventSourceArn:
        Fn::GetAtt:
        - ErrorsQueue
        - Arn
      FunctionName:
        Ref: ErrorsFunction
    Type: AWS::Lambda::EventSourceMapping
  ErrorsRole:
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Action: sts:AssumeRole
          Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
        Version: '2012-10-17'
      Policies:
      - PolicyDocument:
          Statement:
          - Action: logs:*
            Effect: Allow
            Resource: '*'
          - Action: sqs:*
            Effect: Allow
            Resource: '*'
          Version: '2012-10-17'
        PolicyName:
          Fn::Sub: errors-role-policy-${AWS::StackName}
    Type: AWS::IAM::Role

您的模板很好,但 lambda 目标仅用于 asynchronous 调用您的函数。因此您必须进行这样的调用,这可以使用 AWS CLI (--invocation-type Event) 完成。 AWS 控制台仅同步。

aws lambda invoke --function-name <HelloAddFunctionnaem> --invocation-type Event --payload '{"x": 3, "y": "SSS"}' /dev/stdout