无服务器框架 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
我有一个问题,到目前为止我无法确定根本原因。 我有一台 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
之间没有直接的 linkAWS 文档中的 link 可能会使其他人产生误解。这里是标题Starting a State Machine Execution in Response to Amazon S3 Events
但状态机不会启动,因为 S3 事件,而是因为此事件生成的 CloudWatch 日志
lambda 代理函数是调用状态机的好方法。这是一个易于使用的模式并且非常常见,因为我们可以将它与 SQS 等一起使用
所以这个问题的正确答案是
状态机没有启动,因为它从未被调用过。我们刚刚调用了一个用作 StateMachine 的 StartAt 的 lambda 函数。这确实意味着我调用了状态机。
这就是为什么没有状态机日志而lambda函数有正确日志的原因
希望此回复对您有所帮助 我将添加更多详细信息并参考此回复
BR