无服务器框架 AWS StepFunction 不工作

Serverless Framework AWS StepFunction not working

我有一个问题,到目前为止我无法确定根本原因。 我有一台 AWS step 机器,一旦文件上传到 S3 存储桶,它就会被调用。 到目前为止,当我将文件上传到 S3 存储桶时,在 StartAt 键 (StartAt: ImgUploadedEvent) 中定义的 lambda 函数启动,正如我在 lambda 日志中看到的那样。

代码如下:


stepFunctions:
  stateMachines:
    ValidateImageStateMachine:
      loggingConfig:
        level: ALL
        includeExecutionData: true
        destinations:
          - Fn::GetAtt: [ StepFuncLogGroup, Arn ]
      definition:
        Comment: "This state function validates the images after users upload them to S3"
        StartAt: ImgUploadedEvent
        States:
          ImgUploadedEvent:
            Type: Task
            Resource:
              Fn::GetAtt: [ImgUploaded, Arn]
            End: true

下面是声明为 StepMachine 开始的 lambda 函数 我从日志中看到的这个 lambda 函数确实在我修改 S3

中的对象后被调用

functions:

  ImgUploaded:
    handler: src/stepfunctions/imageWasUploadedEvent.handler
    events:
     - s3:
        bucket: !Ref AttachmentsBucket
        existing: true
    iamRoleStatements:
      - Effect: "Allow"
        Action:
          - "states:StartExecution"
        Resource:
          - "*"

为了检查 Step Function 是否正常工作,我创建了一个日志组并将其添加到 Step Function。

resources:
  Resources:
    StepFuncLogGroup:
      Type: AWS::Logs::LogGroup
      Properties:
        LogGroupName: /aws/stepfunctions/${self:service}-${self:provider.stage}

我看到这个 cloud watch 日志组与 AWS 控制台中的 Step 函数正确关联。

然而,当我将对象上传到 S3 时,我确实在 lambda 函数的日志中看到它被调用,但我在 Step Function 日志组中看不到任何日志

我的问题是:

Step Function 是否确实有效,只是 Step Function 中的日志存在问题?

或者是 Step Function 本身不工作而 lambda 函数在工作只是一个完全独立于 Step Function 的 lambda 函数?

我必须做什么才能使 lambda 函数作为 Step Function 的一部分被触发?

BR

Or it is that the Step Function itself is not working and the lambda function is working just a lambda function totally independent of the Step Function?

要验证 lambda 是否作为步骤函数的一部分被调用,您不能只从步骤函数控制台检查执行历史记录。此外,除非您已明确配置 s3 以将事件发布到 lambda,否则在将文件上传到 s3 时不会自动调用您的 lambda。

What I have to do so the lambda function gets trigger as part of the Step Function?

要能够将 file-upload 上的触发步骤函数调用到 s3,您可以按照本教程进行操作:https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-cloudwatch-events-s3.html

在研究了 StepFunctions 的工作原理后,我终于得出结论,这是一个错误的模式。

在插件或亚马逊的文档中没有任何地方说我所做的是一种模式

StepFunctions 可以由 CloudWatch 上的事件启动,并且这些事件可以源自 S3 上的更改。那不是我在这里做的 S3 上的操作和 StepFunction

之间没有直接的 link

AWS 文档中的 link 可能会使其他人产生误解。这里是标题Starting a State Machine Execution in Response to Amazon S3 Events

但状态机不会启动,因为 S3 事件,而是因为此事件生成的 CloudWatch 日志

lambda 代理函数是调用状态机的好方法。这是一个易于使用的模式并且非常常见,因为我们可以将它与 SQS 等一起使用

所以这个问题的正确答案是

状态机没有启动,因为它从未被调用过。我们刚刚调用了一个用作 StateMachine 的 StartAt 的 lambda 函数。这确实意味着我调用了状态机。

这就是为什么没有状态机日志而lambda函数有正确日志的原因

希望此回复对您有所帮助 我将添加更多详细信息并参考此回复

BR