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

时间:2018-07-25 11:40:48

标签: python boto3 amazon-ecs

我正在尝试从Lambda Api网关运行ECS任务。但是频繁获取Endpoint请求超时。我已将默认Labmda超时更改为5分钟。但是有时仍然会出现超时异常。 是否可以通过Lambda运行ECS任务而不会超时?

enter image description here

这是Lambda的核心Python代码,用于运行ECS任务

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'
        }
    }
)

1 个答案:

答案 0 :(得分:2)

AWS API网关的硬超时限制为29秒。因此,无论您的lambda超时时间是多少,API网关都会在29秒后没有响应的情况下返回超时。

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

我不确定在这种情况下您希望API Gateway返回什么,但是让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" }