【问题标题】:AWS Python Lambda: how to raise Exception for step functionAWS Python Lambda:如何为步进函数引发异常
【发布时间】:2021-04-20 04:51:16
【问题描述】:

我的 AWS step 函数有以下流程,我的 Python lambda 应该如何引发 MyCustomError?

只使用raise Exception("MyCustomError")?还是我需要做点别的? https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html 的官方文档使用 node.js 作为示例,我没有看到任何 Python 示例。

{
   "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
   "StartAt": "HelloWorld",
   "States": {
      "HelloWorld": {
         "Type": "Task",
         "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction",
         "Retry": [ {
            "ErrorEquals": ["MyCustomError"],
            "IntervalSeconds": 1,
            "MaxAttempts": 2,
            "BackoffRate": 2.0
         } ],
      "End": true
      }
   }
}

【问题讨论】:

  • 猜测一下,将MyCustomError 定义为Exception 的子类,然后是raise MyCustomError()

标签: python amazon-web-services aws-lambda aws-step-functions


【解决方案1】:

当我需要捕获并重试我们进行的 API 调用时,我做了与此非常相似的事情。在第一次连接到 Aurora Serverless 时,启动集群可能需要 30 秒左右的时间。因此,如果我们遇到超时,我只想抛出一个异常,让 Step Functions 会重试。

Step Function 状态如下所示,我的自定义异常与标准 Lambda 异常的等待不同:

"Hello World": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction"
  "Retry": [
    {
      "ErrorEquals": [
        "Lambda.ServiceException",
        "Lambda.AWSLambdaException",
        "Lambda.SdkClientException"
      ],
      "IntervalSeconds": 2,
      "MaxAttempts": 6,
      "BackoffRate": 2
    },
    {
      "ErrorEquals": [
        "QueryAPIUnavailableException"
      ],
      "IntervalSeconds": 30,
      "MaxAttempts": 5,
      "BackoffRate": 2
    }
  ],
  "End": true      
}

然后 Lambda 本身只是对一个除了 pass 的 Exception 子类进行引发:

class QueryAPIUnavailableException(Exception): pass

def lambda_handler(event, context):
    message = my_query_api.get_message()
    if (message == 'Endpoint request timed out'):
        logger.info("Query API timed out, throwing exception for Step Function retry")
        raise QueryAPIUnavailableException(message)
    else:
        print(f"Got back message: {message}")

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 2018-06-02
    • 2016-09-18
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多