为什么同时执行AWS Lamdba(在VPC内部)执行时不会抱怨VPC中的IP限制?

时间:2019-06-11 19:02:09

标签: node.js amazon-web-services concurrency aws-lambda amazon-vpc

我们在AWS lambda上进行了快速实验,以根据我们的VPC IP限制来确认并发执行限制?在我们的AWS账户中,VPC具有大约500个IP。通常,如果AWS Lambda在VPC内运行,并且运行的并发Lambda数量多于可用IP,则可用IP可能会被耗尽。以下是实验详细信息和Lambda函数。

我们编写了一个lambda调用程序(下面参考1),该函数调用在VPC中配置的lambda调用函数(参考2)。我们调用了一个称为函数的lambda大约999次,并确保所有这些应同时运行。但是令人惊讶的是,所有的lambda都完成了,没有任何抱怨。

最大的问题是,如果我们的VPC中有500个IP限制,并且在VPC中运行了λ999次,为什么没有出现IP可用性问题?有想法吗?

1。 Lambda调用者函数(Node.js 10.x)

const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

const duration = 3 * 60 * 1000;

exports.handler = async (event) => {

    try {

        const lambdaPosterParams = {
            FunctionName: 'testCalledFunction',
            InvocationType: 'Event',
            LogType: 'None'
        };

        for (var invokationNumber=0; invokationNumber<999; invokationNumber++) {
            console.log("Invoking lambda #" + invokationNumber);
            lambdaPosterParams.Payload = JSON.stringify({
                'invokationNumber': invokationNumber,
                'duration': duration,
                'tableName': 'testload2'
            });
            const posterResponse = await lambda.invoke(lambdaPosterParams).promise();
            console.log("Poster Lambda invoked", JSON.stringify(posterResponse));
        }
    } catch (error){
        console.error('Error invoking lambda #' + invokationNumber, error);
        throw error;

    }
    console.log("All lambdas invoked");
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

2。 Lambda调用函数(Node.js 10.x)

const AWS = require('aws-sdk');

const dbConnection = new AWS.DynamoDB({region: process.env.AWS_REGION, apiVersion: process.env.AWS_DYNAMODB_API_VERSION});

exports.handler = async (event) => {

    const startTime = new Date();
    const insertData = {
        'TableName': 'testload',
        'Item': {
            'invokationNumber': {'N': event.invokationNumber.toString()},
            'startTime': {'S': startTime.toUTCString()},
        }
    };

    await dbConnection.putItem(insertData).promise();


    console.log(`Event #${event.invokationNumber}. Sleeping...`);

    await timeout(3 * 60 * 1000);

    console.log('Waking up...');

    const endTime = new Date();
    insertData.Item.endTime = {'S': endTime.toUTCString()};
    insertData.Item.duration = {'N': (endTime.getTime() - startTime.getTime()).toString()};

    await dbConnection.putItem(insertData).promise();

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };

    return response;

    function timeout(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
};

1 个答案:

答案 0 :(得分:2)

每次并发调用不需要ENI级别为1,除非将您的功能配置为分配给每次调用最大3 GB的内存。

在1.5 GB处,您可以有两个并发调用,在1 GB处可以有三个并发调用,在512 MB处可以有六个并发,而在128 MB处,每个弹性网络接口(ENI)可以进行约24个并发调用。 >

大约。

这是因为您的容器分配在m类EC2实例(或具有极高可比性的实例)上,每个实例一个ENI,并且每个实例都有3 GB的可用内存可用于容器。分配给该函数的内存越小,每个(隐藏,受管)EC2实例的容器越多,因此对于给定的并发级别,需要的ENI越少。

  

如果Lambda函数访问VPC,则必须确保您的VPC具有足够的ENI容量以支持Lambda函数的扩展要求。您可以使用以下公式大致确定ENI要求。

     

Projected peak concurrent executions * (Memory in GB / 3GB)

     

https://docs.aws.amazon.com/lambda/latest/dg/vpc.html

将功能配置为3 GB,并应确认您的最初期望-由于缺少IP地址,或者由于该区域中ENI的最大数量的帐户限制,您将耗尽ENI。< / p>