【问题标题】:Why concurrent AWS Lambda (inside VPC) execution is not complaining about IP limit in VPC?为什么并发 AWS Lambda(VPC 内部)执行不会抱怨 VPC 中的 IP 限制?
【发布时间】:2020-02-09 02:32:14
【问题描述】:

我们在 AWS lambda 上做了快速实验,以根据我们的 VPC IP 限制确认并发执行限制?在我们的 AWS 账户中,VPC 有大约 500 个可用 IP。一般来说,如果 AWS lambda 在 VPC 内运行,如果我们运行的并发 lambda 多于可用 IP,则可用 IP 可能会耗尽。下面是实验细节和 Lambda 函数。

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

最大的问题是,如果我们的 VPC 中有 500 个 IP 限制并且我们在 VPC 中运行 lambda 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));
    }
};

【问题讨论】:

  • 有趣!您可以尝试将函数的 IP 地址添加到 Lambda 调试输出中,以查看它认为它正在使用的 ENI。 (并不是说我确定如何检索该信息!)
  • 我还建议在 Lambda 函数中添加一个时间延迟,以确保它运行几秒钟,这将增加函数同时运行的概率。否则,有些会在新的开始之前完成。
  • 我延迟了 3 分钟。我正在做的是,当调用 lambda 时,我在 dynamo DB 表中插入一行(计数、开始时间、结束时间、经过的时间)。调用 lambda 后休眠 3 分钟,当它醒来时,它会更新同一行,并显示结束时间和经过的时间。在一分钟内,我可以看到 999 行插入了计数和开始时间。 4 分钟后,所有行都将更新结束时间和经过时间。

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


【解决方案1】:

每次并发调用 1 个级别不需要 ENI,除非您的函数配置为每次调用分配的最大允许 3 GB 内存。

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

大约。

这是因为您的容器分配在 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,您最初的期望应该得到确认 - 您将用完 ENI,原因可能是缺少 IP 地址,或者您的帐户限制了该区域的最大 ENI 数量。

【讨论】:

  • 谢谢。我尝试保持 lambda 内存大小为 3GB。我的调用者 lambda 以异步方式触发了另一个 lambda 900 次,没有任何抱怨。我检查了 ENI 列表,它最大为 235。我还验证了我的子网中的可用 IP 为 0。最初并发调用了大约 230 个 lambda,而不是仅在其他 lambda 完成时才执行剩余的 lambda。看起来当它用完 ENI/IP 时,AWS 将调用的 lambdas 保留在队列中,而不是抛出任何异常。一旦 ENI 可用,它就可以执行另一个待处理的 lambda。最后,我成功完成了所有 900 个 lambda。
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2019-09-18
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多