代码之家  ›  专栏  ›  技术社区  ›  Ashraful Islam

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

  •  0
  • Ashraful Islam  · 技术社区  · 6 年前

    我正在尝试从lambda api网关运行一个ecs任务。但频繁获取端点请求超时。我已经将默认的labmda超时更改为5分钟,但有时仍会出现超时异常。 有没有办法通过lambda运行ecs任务而不超时?

    下面是lambda中运行ecs任务的核心python代码

    ecs=boto3.client(
    “ECS”
    Region_name=config.aws_区域,
    aws_access_key_id=config.aws_access_key_id,
    aws_secret_access_key=config.aws_secret_access_key
    )
    
    请求_id=str(uuid.uuid1())
    
    Runl任务
    cluster='test-cluster',
    taskDefinition='test-task',
    startedby=请求ID,
    launchType='fargate',
    重写={
    “containerOverrides”:。[
    {
    “name”:“测试容器”,
    “环境”:。[
    {
    'name':'request_id',
    “value”:请求ID
    }
    ]
    }
    ]
    }
    网络配置={
    “awsvpcconfiguration”:。{
    '安全组':'[
    “SGXXXXXXXXX”,
    ,
    “子网”:
    '子网-XXXXXXXX',
    '子网-XXXXXXXX',
    '子网-XXXXXXX'
    ,
    “assignpublicip”:“已启用”
    }
    }
    )
    < /代码> <分钟,但有时仍会出现超时异常。有没有办法在没有超时的情况下通过lambda运行ecs任务?

    enter image description here

    下面是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'
            }
        }
    )
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   K Mo    6 年前

    AWS API网关的硬超时限制为29秒。因此,不管lambda的超时限制是什么,如果在29秒后没有得到响应,API网关将返回超时。

    不管怎样,lambda都应该继续运行,这应该足够简单,可以在CloudWatch日志中进行验证。

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

    为此,我将让API网关调用一个lambda,该lambda调用运行ecs任务的lambda。要使此异步,从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" }