Почему одновременное выполнение AWS Lamdba (внутри VPC) не жалуется на ограничение IP в VPC? - PullRequest
0 голосов
/ 11 июня 2019

Мы провели быстрый эксперимент на AWS lambda, чтобы подтвердить ограничение одновременного выполнения на основе нашего ограничения IP-адреса VPC? В нашем аккаунте AWS доступно около 500 IP-адресов. В целом, если AWS-лямбда работает внутри VPC, доступные IP-адреса могут быть исчерпаны, если у нас больше одновременных лямбда-операций, чем доступных IP-адресов. Ниже приведены подробности эксперимента и лямбда-функции.

Мы написали функцию лямбда-вызова (см. Ниже # 1), которая вызывает лямбда-функцию (см. № 2), настроенную внутри VPC. Мы вызывали лямбда-функцию function около 999 раз и убедились, что все это должно выполняться одновременно. Но на удивление вся лямбда закончилась без каких-либо жалоб.

Самый большой вопрос в том, что если в нашем VPC было ограничение в 500 IP и мы запускали лямбду 999 раз внутри VPC, почему у нас не возникла проблема доступности IP? Есть идеи?

1. Функция лямбда-вызова (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. Вызываемая лямбда-функция (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 Ответ

2 голосов
/ 12 июня 2019

ENI не нужны на уровне 1 для одновременного вызова, если только ваша функция не настроена на выделение максимально допустимых 3 ГБ памяти на вызов.

При 1,5 ГБ вы можете иметь два одновременных вызова,при 1 ГБ - три, при 512 МБ - шесть, а при 128 МБ - примерно 24 одновременных вызова для каждого эластичного сетевого интерфейса (ENI).

Приблизительно.

Это связано с тем, что ваши контейнеры размещаются на экземплярах m-класса EC2 (или что-то чрезвычайно сопоставимом), по одному ENI на экземпляр , и каждый экземпляр имеет 3 ГБ доступной памяти, доступной для контейнеров.Чем меньше объем памяти, назначенной функции, тем больше контейнеров на (скрытый, управляемый) экземпляр 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 ГБ и ваши первоначальные ожиданиядолжно быть подтверждено - у вас закончатся ENI, либо из-за нехватки IP-адресов, либо из-за ограничения вашей учетной записи на максимальное количество ENI в регионе.

...