Мы провели быстрый эксперимент на 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));
}
};