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

Python 从Lambda启动AWS ECS任务时端点请求超时,python,boto3,amazon-ecs,Python,Boto3,Amazon Ecs,我正在尝试从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_secr

我正在尝试从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'
        }
    }
)

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

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

我不确定您希望API网关在此场景中返回什么,但让lambda开始作业并向API网关返回作业已开始的响应可能就足够了

为此,我将让API网关调用一个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" }
导入boto3
导入json
def lambda_处理程序(事件、上下文):
response=client.invoke(
函数名=“”,
调用类型=“事件”,
有效负载=json.dumps(事件)
)
返回{“结果”:“确定”}

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

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

我不确定您希望API网关在此场景中返回什么,但让lambda开始作业并向API网关返回作业已开始的响应可能就足够了

为此,我将让API网关调用一个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" }
导入boto3
导入json
def lambda_处理程序(事件、上下文):
response=client.invoke(
函数名=“”,
调用类型=“事件”,
有效负载=json.dumps(事件)
)
返回{“结果”:“确定”}

在lambda或API网关中,您在哪里看到超时?在API网关中。我已经记录了执行时间,并且看到大部分时间都花在了ecs上。运行任务方法。在lambda或API Gateway中,您在哪里看到超时?在API Gateway中。我已经记录了执行时间,看到大部分时间都花在了ecs.run_task方法上。我知道这是30秒,我已经将其改为5分钟。但有时仍然会超时。我想问的是,有没有办法通过Lambda运行ECS任务而不需要timeout@AshrafulIslam—29秒的API网关限制是一个硬限制。你不可能把这提高到5分钟。您可能已将Lambda超时更改为5分钟,但未更改API网关。谢谢您提供的信息。顺便问一下,是否有任何方法可以立即将响应返回到api网关,但将该过程保留到lambda中完成?我已经修改了我的答案,添加了一个示例,我知道这是30秒,我已将其更改为5分钟。但有时仍然会超时。我想问的是,有没有办法通过Lambda运行ECS任务而不需要timeout@AshrafulIslam—29秒的API网关限制是一个硬限制。你不可能把这提高到5分钟。您可能已将Lambda超时更改为5分钟,但未更改API网关。谢谢您提供的信息。顺便问一下,有没有任何方法可以立即将响应返回到api网关,但将该过程保留到lambda中完成?我已经修改了我的答案,添加了一个示例