如何限制从 aws lambda 进行 http 调用
how to restrict making http calls from aws lambda
我正在创建从用户那里获取 nodejs
代码的应用程序,我正在使用该代码动态创建 lambda 函数。
例如:代码可以是
var http = require('http');
exports.handler = function(event, context) {
console.log('start request to ' + event.url)
http.get('http://##someapi', function(res) {
console.log("Any Response : " + res.statusCode);
}).on('error', function(e) {
console.log("Error from API : " + e.message);
});
console.log('end request to ' + event.url)
context.done(null);
}
但是我想限制 http/https 从该代码进行的调用,因为我无法控制用户传递的代码。
那么有什么方法可以限制它,比如某种 ROLE 或 POLICY 或任何配置来实现它?
我可以通过在角色中指定策略来限制 DynamoDB 访问。所以我可以控制数据库访问但不能控制 http 调用。
一种替代方法是,将这些 lambda 放在出站访问受限的 VPC 中。
这听起来很有趣,但我找到了解决我的问题的简单方法。我正在添加以下代码以及用户输入的代码。
var require = function(){
return "You are not allowed to do this operation";
}
现在,如果使用过的用户尝试包含任何第 3 方库,例如 required('http') ,那么它将不允许在节点代码中实例化 http 库。
使用此解决方案,我能够阻止加载我不希望用户在 AWS lambda 函数中使用的所有第 3 方库。
我仍在寻找合适的解决方案,而不是在代码中使用该 hack。
只需在用户代码前添加以下内容:
(function(){
function onlyAWS (module) {
var isAWS = /amazonaws.com$/i
var orig = module.request
module.request = function restrictedRequest (opts, done) {
if (typeof opts === 'string') opts = require('url').parse(opts)
if (isAWS.test(opts.host || opts.hostname)) {
return orig.call(module, opts, done)
} else {
throw new Error('No HTTP requests allowed')
}
}
}
onlyAWS(require('http'))
onlyAWS(require('https'))
})()
我正在创建从用户那里获取 nodejs
代码的应用程序,我正在使用该代码动态创建 lambda 函数。
例如:代码可以是
var http = require('http');
exports.handler = function(event, context) {
console.log('start request to ' + event.url)
http.get('http://##someapi', function(res) {
console.log("Any Response : " + res.statusCode);
}).on('error', function(e) {
console.log("Error from API : " + e.message);
});
console.log('end request to ' + event.url)
context.done(null);
}
但是我想限制 http/https 从该代码进行的调用,因为我无法控制用户传递的代码。
那么有什么方法可以限制它,比如某种 ROLE 或 POLICY 或任何配置来实现它?
我可以通过在角色中指定策略来限制 DynamoDB 访问。所以我可以控制数据库访问但不能控制 http 调用。
一种替代方法是,将这些 lambda 放在出站访问受限的 VPC 中。
这听起来很有趣,但我找到了解决我的问题的简单方法。我正在添加以下代码以及用户输入的代码。
var require = function(){
return "You are not allowed to do this operation";
}
现在,如果使用过的用户尝试包含任何第 3 方库,例如 required('http') ,那么它将不允许在节点代码中实例化 http 库。
使用此解决方案,我能够阻止加载我不希望用户在 AWS lambda 函数中使用的所有第 3 方库。
我仍在寻找合适的解决方案,而不是在代码中使用该 hack。
只需在用户代码前添加以下内容:
(function(){
function onlyAWS (module) {
var isAWS = /amazonaws.com$/i
var orig = module.request
module.request = function restrictedRequest (opts, done) {
if (typeof opts === 'string') opts = require('url').parse(opts)
if (isAWS.test(opts.host || opts.hostname)) {
return orig.call(module, opts, done)
} else {
throw new Error('No HTTP requests allowed')
}
}
}
onlyAWS(require('http'))
onlyAWS(require('https'))
})()