我们在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));
}
};
答案 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)
将功能配置为3 GB,并应确认您的最初期望-由于缺少IP地址,或者由于该区域中ENI的最大数量的帐户限制,您将耗尽ENI。< / p>