You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Step Functions Map状态下Lambda并发超限问题求助

问题描述

在AWS Step Functions的Map状态执行过程中,处理第149条(共521条)任务时触发Lambda 429限流错误:

Rate Exceeded. (Service: AWSLambda; Status Code: 429; Error Code: TooManyRequestsException; Request ID: xxxx-xxxxx-xxxx-xxxx; Proxy: null)

已配置信息:

  • Map状态最大并发:20
  • 账户级Lambda未预留并发:1906
  • 涉事Lambda为DockerImageFunction,CDK定义代码:
sample_data_v1= _lambda.DockerImageFunction(
    self, "sample_data_v1",
    code=_lambda.DockerImageCode.from_image_asset("./catalog/src/code"),
    memory_size=8046,
    function_name="fetch_sample_data",
    timeout=core.Duration.minutes(15),
)

状态机Map核心配置片段:

"Map state": {
    "Type": "Map",
    "ResultPath": "$.Single.File",
    "Next": "check-file-processing-status",
    "Catch": [
        {
            "ErrorEquals": ["States.ALL"],
            "Next": "check-file-processing-status"
        }
    ],
    "Iterator": {
        "StartAt": "fetch-sample-data-step",
        "States": {
            "fetch-sample-data-step": {
                "End": true,
                "Retry": [
                    {
                        "ErrorEquals": [
                            "Lambda.ServiceException",
                            "Lambda.AWSLambdaException",
                            "Lambda.SdkClientException"
                        ],
                        "IntervalSeconds": 2,
                        "MaxAttempts": 6,
                        "BackoffRate": 2
                    }
                ],
                "Type": "Task",
                "OutputPath": "$.Payload",
                "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
                "Parameters": {
                    "FunctionName": "arn:xxxxx",
                    "Payload": {
                        "payload.$": "$",
                        "execution_id.$": "$$.Execution.Id",
                        "taskToken.$": "$$.Task.Token"
                    }
                }
            }
        }
    },
    "ItemsPath": "$.Payload.File_List",
    "MaxConcurrency": 20
}

任务偶尔能成功完成,偶尔在处理第109条左右触发上述错误。

排查原因及解决方案

1. 重试规则未覆盖TooManyRequestsException

当前fetch-sample-data-step的Retry配置仅包含Lambda.ServiceException、Lambda.AWSLambdaException、Lambda.SdkClientException,但**Lambda.TooManyRequestsException未被纳入重试列表**。出现429错误时,会直接进入Catch逻辑而非自动重试,导致错误被暴露而非自行恢复。

修复方案:
更新Retry的ErrorEquals列表,添加目标错误类型:

"Retry": [
    {
        "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
        ],
        "IntervalSeconds": 2,
        "MaxAttempts": 6,
        "BackoffRate": 2
    }
]

2. Lambda函数级并发未做专属配置

账户级未预留并发为1906,但该Lambda未设置函数级预留并发,会与账户内其他未配置预留的函数共享额度。若同一时段有其他函数消耗大量并发,会导致该函数可用并发不足,触发限流。

修复方案:
为该Lambda配置函数级预留并发(至少等于Map的MaxConcurrency=20),确保它拥有专属的并发额度,不受其他函数影响。通过CDK添加配置:

sample_data_v1= _lambda.DockerImageFunction(
    self, "sample_data_v1",
    code=_lambda.DockerImageCode.from_image_asset("./catalog/src/code"),
    memory_size=8046,
    function_name="fetch_sample_data",
    timeout=core.Duration.minutes(15),
    reserved_concurrent_executions=20  # 添加此行
)

3. Docker镜像Lambda的冷启动与扩容瓶颈

Docker镜像的Lambda冷启动时间通常长于Zip包部署的函数,且8046MB的大内存实例需要更多底层EC2资源。当Map批量启动任务时,Lambda可能无法及时扩容出足够实例,导致请求被限流。

排查与修复:

  • 查看Lambda监控面板的ConcurrentExecutions和ProvisionedConcurrencySpilloverInvocations指标,确认是否存在扩容瓶颈。
  • 配置**预置并发(Provisioned Concurrency)**提前预热实例,避免冷启动:
    sample_data_v1.add_provisioned_concurrency(20)
    

4. Map状态并发调度的瞬间峰值

虽然Map设置了MaxConcurrency=20,但当多个任务同时完成时,Step Functions可能在短时间内发起大量Invoke请求,导致瞬间请求速率超过Lambda的Invoke API速率限制。

缓解方案:

  • 降低Map的MaxConcurrency至15或10,减少瞬间请求压力。
  • 在Lambda函数入口处添加100-200ms的短暂延迟,平滑请求速率(仅作为临时缓解方案)。

5. 账户级Lambda突发并发限制

AWS Lambda的突发并发限制默认值为1000(部分区域如us-east-1为3000),若账户未预留并发设置为1906,突发并发上限会被限制为min(默认突发值, 账户未预留并发)。若其他并发占用导致突发可用额度不足,也会触发限流。

排查与修复:

  • 查看Lambda监控的Throttles指标,确认是否为突发并发耗尽导致。
  • 若确认为突发限制问题,可联系AWS Support提升突发并发额度。

内容的提问来源于stack exchange,提问作者tousif Noor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:45:55