【发布时间】: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