当 lambda 在 vpc 中时,无法 运行 来自 lambda 的 fargate 任务

Not able to run fargate task from lambda when lambda is in a vpc

所以问题是 lambda 需要能够从 vpc 中的数据库读取并启动 ecs fargate 任务。但是,如果 lambda 在 vpc 中,那么它不会自行启动任务,而是 lambda 超时。

import json
import boto3

client = boto3.client('ecs')


cluster_name = 'as-dev'
task_name = 'as-dev:2'

def lambda_handler(event, context):
    # TODO implement
    try:
        response = client.run_task(
            cluster=cluster_name,
            launchType = 'FARGATE',
            taskDefinition=task_name,
            count = 1,
            platformVersion='LATEST',
            networkConfiguration={
                'awsvpcConfiguration': {
                    'subnets': [
                        'subnet-12345ab12345'
                    ],
                    'securityGroups': [
                        'sg-123451234sasdqwe'
                    ],
                    'assignPublicIp': 'ENABLED'
                }
            }
            )
        print(response)
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }
    except Exception as e:
        print(e)

        return {
            'statusCode': 500,
            'body': str(e)
        }

(由于显而易见的原因更改了配置)

如果 运行 作为 ec2 上的一个简单 python 程序,代码可以正常工作。只有当 vpc 添加到 lambda 时,它才会停止工作并超时。

默认情况下,VPC 中的 lambda 函数无法访问互联网。启用访问的一种流行方法是使用 NAT 网关并将您的 lambda 放在 私有子网 中,如以下所述:

替代方案是对 ECS 使用 VPC interface endpoints。一旦你正确地设置它们,你就不需要使用互联网了。相反,您的函数将使用端点私下访问 ECS。