从 Lambda 启动 AWS ECS 任务时端点请求超时

Endpoint request timed out when starting AWS ECS task from Lambda

我正在尝试从 Lambda Api 网关 运行 执行 ECS 任务。但是经常获取 Endpoint 请求超时。我已将默认的 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'
        }
    }
)

A​​WS API 网关的硬超时限制为 29 秒。因此,无论您的 lambda 的超时限制如何,如果 API 网关在 29 秒后仍未收到响应,它将 return 超时。

尽管如此,您的 lambda 应该继续运行,这应该足够简单,可以在 cloudwatch 日志中进行验证。

我不确定你想要什么 API 在这种情况下通往 return 的网关,但让 lambda 开始工作和 return 响应 return 可能就足够了=22=] 作业已经开始的网关。

为此,我会让 API 网关调用 Lambda,后者调用 Lambda 运行 ECS 任务。要实现此异步,从 Lambda 到 Lambda 的调用需要是 'Event' 调用类型。

示例:

import boto3
import json

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