我正在尝试从Lambda Api网关运行ECS任务。但是频繁获取Endpoint请求超时。我已将默认Labmda超时更改为5分钟。但是有时仍然会出现超时异常。 是否可以通过Lambda运行ECS任务而不会超时?
这是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'
}
}
)
答案 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" }