【问题标题】:Serverless Framework AWS StepFunction not working无服务器框架 AWS StepFunction 不起作用
【发布时间】:2021-02-10 01:03:00
【问题描述】:

我有一个问题,到目前为止我无法确定根本原因。 我有一个 AWS 步进机器,一旦将文件上传到 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 函数 从日志中可以看出,一旦我在 S3 中修改了一个对象,这个 lambda 函数确实会被调用


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}

我看到此云监视日志组与 AWS 控制台中的 Step 函数正确关联。

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

我的问题是:

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

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

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

BR

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda serverless-framework aws-step-functions


    【解决方案1】:

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

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

    StepFunctions 可以由 CloudWatch 上的事件启动,这些事件可能源自 S3 上的更改。那不是我在这里所做的 S3 上的操作与 StepFunction 之间没有直接联系

    AWS 文档中的链接可能会让人产生不同的想法。这里是标题Starting a State Machine Execution in Response to Amazon S3 Events

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

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

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

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

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

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

    BR

    【讨论】:

      【解决方案2】:

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

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

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

      为了能够在文件上传到 s3 时调用触发步骤函数,您可以按照本教程进行操作:https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-cloudwatch-events-s3.html

      【讨论】:

      • 这是一个无服务器框架问题,正如我在问题中所说,正在分析日志
      猜你喜欢
      • 2018-02-10
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2021-05-06
      • 2019-08-04
      • 2018-09-13
      • 2021-05-12
      • 2020-11-08
      相关资源
      最近更新 更多