【问题标题】:Endpoint request timed out when starting AWS ECS task from Lambda从 Lambda 启动 AWS ECS 任务时端点请求超时
【发布时间】:2018-07-27 16:00:58
【问题描述】:

我正在尝试从 Lambda Api 网关运行 ECS 任务。但是经常让端点请求超时。我已将默认 Labmda 超时更改为 5 分钟。但有时仍然会出现超时异常。 有没有办法通过 Lambda 运行 ECS 任务而不会超时?

这是来自 Lambda 的用于运行 ECS 任务的核心 python 代码

ecs = boto3.client(
    'ecs',
    region_name=config.AWS_REGION,
    aws_access_key_id=config.AWS_ACCESS_KEY_ID,
    aws_secret_access_key=config.AWS_SECRET_ACCESS_KEY
)

request_id = str(uuid.uuid1())

ecs.run_task(
    cluster='test-cluster',
    taskDefinition='test-task',
    startedBy=request_id,
    launchType='FARGATE',
    overrides={
        'containerOverrides': [
            {
                'name': 'test-container',
                'environment': [
                    {
                        'name': 'request_id',
                        'value': request_id
                    }
                ]
            }
        ]
    },
    networkConfiguration={
        'awsvpcConfiguration': {
            'securityGroups': [
                'sg-XXXXXXXX',
            ],
            'subnets': [
                'subnet-XXXXXXXX',
                'subnet-XXXXXXXX',
                'subnet-XXXXXXXX'
            ],
            'assignPublicIp': 'ENABLED'
        }
    }
)

【问题讨论】:

  • 您在哪里看到超时,在 lambda 或 API 网关中?
  • 在 API 网关中。我记录了执行时间,发现大部分时间都花在ecs.run_task 方法上。

标签: python boto3 amazon-ecs


【解决方案1】:

AWS API Gateway 的硬超时限制为 29 秒。因此,无论您的 lambda 的超时限制如何,如果 API 网关在 29 秒后没有得到响应,它将返回超时。

无论如何,您的 lambda 都应该继续运行,这应该足够简单,可以在 cloudwatch 日志中进行验证。

我不确定您希望 API Gateway 在这种情况下返回什么,但让 lambda 开始工作并向 API 网关返回工作已开始的响应可能就足够了。

为此,我将让 API Gateway 调用一个 Lambda,该 Lambda 调用了运行 ECS 任务的 Lambda。为了实现这种异步,从 Lambda 到 Lambda 的调用需要是“事件”调用类型。

例子:

import boto3
import json

def lambda_handler(event, context):
response = client.invoke(
    FunctionName='<ecs_lambda>',
    InvocationType='Event',
    Payload=json.dumps(event)
)
return { "result": "OK" }

【讨论】:

  • 我知道它是 30 秒,我已将其更改为 5 分钟。但有时仍然会超时。我想要的是,有没有办法通过 Lambda 运行 ECS 任务而不会超时
  • @Ashraful Islam - 29 秒 API 网关限制是硬限制。你不可能把这个时间提高到 5 分钟。您可能已将 Lambda 超时更改为 5 分钟,而不是 API 网关。
  • 感谢您提供的信息。顺便说一句,有什么方法可以立即将响应返回给 api 网关,但保持该过程直到在 lambda 中完成?
  • 我已经修改了我的答案以包含一个示例
猜你喜欢
  • 2023-01-03
  • 1970-01-01
  • 2020-11-16
  • 2017-09-20
  • 2019-11-06
  • 2018-09-06
  • 2021-10-17
  • 2019-10-16
  • 2021-07-23
相关资源
最近更新 更多