【发布时间】:2022-04-19 20:53:24
【问题描述】:
我有一个 AWS step function 需要依次调用 3 个 lambda,但是在每次调用结束时,step function 需要处理来自 lambda 的响应,并确定下一个 lambda 调用。
那么阶跃函数如何处理来自 lambda 的响应?可以举个例子吗?
【问题讨论】:
标签: amazon-web-services aws-step-functions
我有一个 AWS step function 需要依次调用 3 个 lambda,但是在每次调用结束时,step function 需要处理来自 lambda 的响应,并确定下一个 lambda 调用。
那么阶跃函数如何处理来自 lambda 的响应?可以举个例子吗?
【问题讨论】:
标签: amazon-web-services aws-step-functions
假设您已调用 lambda 函数作为 step 函数的第一步。根据 lambda 的响应,您需要决定接下来应该触发哪个 lambda。
此解决方法非常简单,您可以在 lambda 响应中返回一个属性(例如:next_state),在 step 函数中创建一个“Choice”流,然后将此 next_state 属性作为输入。
“选择”流程只不过是一个 if-else 条件,您可以将下一步重定向到预期的 lambda。
例如,
定义如下,
{
"Comment": "A description of my state machine",
"StartAt": "Lambda Invoke 1",
"States": {
"Lambda Invoke 1": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"Payload.$": "$",
"FunctionName": "<your lambda name>"
},
"Retry": [
{
"ErrorEquals": [
"Lambda.ServiceException",
"Lambda.AWSLambdaException",
"Lambda.SdkClientException"
],
"IntervalSeconds": 2,
"MaxAttempts": 6,
"BackoffRate": 2
}
],
"Next": "Choice"
},
"Choice": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.next_state",
"StringEquals": "Lambda Invoke 2",
"Next": "Lambda Invoke 2"
},
{
"Variable": "$.next_state",
"StringEquals": "Lambda Invoke 3",
"Next": "Lambda Invoke 3"
}
],
"Default": "Lambda Invoke 3"
},
"Lambda Invoke 2": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"Payload.$": "$",
"FunctionName": "<your lambda name>"
},
"Retry": [
{
"ErrorEquals": [
"Lambda.ServiceException",
"Lambda.AWSLambdaException",
"Lambda.SdkClientException"
],
"IntervalSeconds": 2,
"MaxAttempts": 6,
"BackoffRate": 2
}
],
"End": true
},
"Lambda Invoke 3": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"Payload.$": "$",
"FunctionName": "<your lambda name>"
},
"Retry": [
{
"ErrorEquals": [
"Lambda.ServiceException",
"Lambda.AWSLambdaException",
"Lambda.SdkClientException"
],
"IntervalSeconds": 2,
"MaxAttempts": 6,
"BackoffRate": 2
}
],
"End": true
}
}
}
【讨论】:
有两种方法可以从阶跃函数中捕获 lambda 函数的响应。
add_retry 和add_catch 处理来自lambda 函数的任何异常
例如。 .start(record_ip_task
.add_retry(errors=["States.TaskFailed"],
interval=core.Duration.seconds(2),
max_attempts=2)
.add_catch(errors=["States.ALL"], handler=notify_failure_job)) \
return '{"Result": True},然后步进函数作业将检查该值以用于下一个任务,例如。 .next(
is_block_succeed
.when(step_fn.Condition.boolean_equals('$.Result', False), notify_failure_job)
.otherwise(send_slack_task)
)
参考:https://dev.to/vumdao/aws-guardduty-combine-with-security-hub-and-slack-17eh https://github.com/vumdao/aws-guardduty-to-slack
【讨论】: