当 Lambda 函数 returns 出错时,AWS Step Functions 不会捕获错误

AWS Step Functions does not catch error when Lamba function returns an error

几个小时以来,我一直在努力使用 AWS Step Functions。用例非常简单,因为我想逐渐熟悉 AWS Step Functions。但是,我想我不明白他们如何处理从失败的 lambda 函数返回的错误。

对应代码如下:

{
  "Comment": "A simple AWS Step Functions for managing users with in the context of the AWS Training Initiative at AXA.",
  "StartAt": "Process-All-Deletion",
  "States": {
    "Process-All-Deletion": {
      "Type": "Map",
      "InputPath": "$",
      "ItemsPath": "$.Users",
      "MaxConcurrency": 0,
      "Iterator": {
        "StartAt": "DeleteAccessKeys",
        "States": {
          "DeleteAccessKeys": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:eu-central-1:###:function:listUserAccessKeys",
            "Next": "DetachUserPolicy",
            "Catch": [
              {
                "ErrorEquals": ["NoSuchEntityException"],
                "ResultPath": "$.DeleteAccessKeysError",
                "Next": "CatchDeleteAccessKeysError"
              }
            ]
          },
          "DetachUserPolicy": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:eu-central-1:###:function:detachUserPolicy",
            "Next": "DeleteIamUser",
            "Catch": [
              {
                "ErrorEquals": ["States.TaskFailed"],
                "ResultPath": "$.ErrorDescription",
                "Next": "CatchDeleteUserPolicyError"
              }
            ]
          },
          "DeleteIamUser": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:eu-central-1:###:function:deleteIamUser",
            "End": true,
            "Catch": [
              {
                "ErrorEquals": ["States.TaskFailed"],
                "ResultPath": "$.ErrorDescription",
                "Next": "CatchDeleteIamUserError"
              }
            ]
          },
          "CatchDeleteIamUserError": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:eu-central-1:###:function:errorHandler",
            "End": true
          },
          "CatchDeleteAccessKeysError": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:eu-central-1:###:function:errorHandler",
            "Next": "DetachUserPolicy"
          },
          "CatchDeleteUserPolicyError": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:eu-central-1:###:function:errorHandler",
            "Next": "DeleteIamUser"
          }
        }
      },
      "ResultPath": "$.Result",
      "End": true
    }
  }
}

所以基本上状态机应该正确捕获错误并且状态应该分别为橙色 'caught error' in 'DeleteAccessKeys'。相反,它变成了绿色。

这是我的 lambda 函数的代码:


import boto3 
import botocore

print('Loading deleteUserAccessKeys function...')

def deleteUserAccessKeys(message, context):

    # Get IAM client
    client = boto3.client('iam')
    item = message['Name']

  
    try:
        # List all keys associated with the user
        result = client.list_access_keys(UserName=item)
        accessKeyIds = [accessKeyId for element['AccessKeyId'] in result['AccessKeyMetadata']]
        
        # Exit if there are no access keys
        if not accessKeyIds: return message
        
        # Delete all keys associated with the user
        for element in accessKeyIds:
            client.delete_access_key(
                UserName=item,
                AccessKeyId=element
            )
         
        message['DeletedAccessKeys']=len(accessKeyIds)
        
        print(message)
        return message

            
    except botocore.exceptions.ClientError as error:
        print(error.response)
        if error.response['Error']['Code'] == 'NoSuchEntity':
            print('Entity not found exception')
            raise error
        else:
            raise Exception("Failed! Check the error!")
    
  

可能是什么问题或我配置有误?

您需要检查从您的 lambda 返回的确切异常名称。检查 lambda 的日志以确认这一点。

如果您想快速检查是否是问题所在,请将 DeleteAccessKeys 下的 catch 属性更改为 States.All。这是所有命名异常的超类。

我自己找到了原因。 我删除了“地图”类型。然后我只用一个输入尝试了它,没有任何迭代。

{
  "Comment": "A simple AWS Step Functions for managing users with in the context of the AWS Training Initiative at AXA.",
  "StartAt": "DeleteAccessKeys",
  "States": {
    "DeleteAccessKeys": {
      "Type": "Task",
      "InputPath": "$.Users",
      "Resource": "arn:aws:lambda:eu-central-1:####:function:listUserAccessKeys",
      "End": true,
      "Catch": [
        {
          "ErrorEquals": [
            "NoSuchEntityException"
          ],
          "ResultPath": "$.DeleteAccessKeysError",
          "Next": "CatchDeleteAccessKeysError"
        }
      ]
    },
    "CatchDeleteAccessKeysError": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:eu-central-1:####:function:errorHandler",
      "End": true
    }
  }
}


在 Web GUI 中,它会正确显示为“捕获错误”,例如实体 (NoSuchEntityException) 不存在。

如果您像我的示例一样遍历输入值,在我的第一个 post 中捕获的错误将始终显示为“成功”。