当 lambda 在 vpc 中时,无法从 lambda 运行 Fargate 任务

Posted

技术标签:

【中文标题】当 lambda 在 vpc 中时,无法从 lambda 运行 Fargate 任务【英文标题】:Not able to run fargate task from lambda when lambda is in a vpc 【发布时间】:2021-11-29 22:58:30 【问题描述】:

所以问题是 lambda 需要能够从 vpc 中的 db 读取并启动 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 时,它才会停止工作并超时。

【问题讨论】:

您的问题不清楚。到底发生了什么?有任何错误、超时吗? 超时,抱歉已编辑问题并添加了相同内容。 仍在努力。使用 ecs 快速入门有助于创建 vpc 子网等,然后打开 ecs 端点允许 lambda 访问 ecs。但是对于预先存在的 vpc 仍然无法正常工作,同样的情况不会发生,我正在尝试进行逆向工程以了解原因。但你是对的,这是 lambda 方面的网络问题。 【参考方案1】:

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

How do I give internet access to a Lambda function that's connected to an Amazon VPC?

替代方法是使用VPC interface endpoints 用于ECS。正确设置它们后,您无需使用互联网。相反,您的函数将使用端点私下访问 ECS。

【讨论】:

这个答案有效,只是它不适用于由 aws 创建的默认 vpc,适用于另一个可能是您的应用程序 vpc(但不是默认)的 vpc,只有一个私有子网并打开一个ecs 端点在同一个 vpc/子网中。只需将其附加到 lambda 即可。

以上是关于当 lambda 在 vpc 中时,无法从 lambda 运行 Fargate 任务的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 无法调用没有 VPC 的另一个 AWS Lambda - NodeJs

启用 VPC 的 Lambda 函数无法在同一 VPC 中启动/访问 EC2

从 VPC 中的 Lambda 访问 AWS S3

AWS Lambda 无法访问同一 VPC 中的 EC2 端口

如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)

AWS - 从公共 API 网关到 VPC 内 lambda 的路由