Amazon web services 公用子网中的AWS Lambda无法访问internet
我正试图让一个Lambda运行在一个公共子网内,以便与internet通信。我可以让Lambda在没有VPC的情况下访问www.google.com(文档称在幕后运行),但如果我在VPC中运行Lambda,我就无法访问www.google.com 复制步骤:Amazon web services 公用子网中的AWS Lambda无法访问internet,amazon-web-services,aws-lambda,amazon-vpc,Amazon Web Services,Aws Lambda,Amazon Vpc,我正试图让一个Lambda运行在一个公共子网内,以便与internet通信。我可以让Lambda在没有VPC的情况下访问www.google.com(文档称在幕后运行),但如果我在VPC中运行Lambda,我就无法访问www.google.com 复制步骤: 使用以下代码创建一个Lambda(Node.js 12x)。我把Lambda命名为“谷歌” 运行它以验证它是否成功,并可以从www.google.com获取。不应指定VPC 转到VPC仪表板并使用VPC向导创建具有公共子网的VPC。我尝试了
consthttp=require('http');
exports.handler=异步(事件)=>{
返回httprequest()。然后((数据)=>{
常数响应={
状态代码:200,
正文:JSON.stringify(数据),
};
返回响应;
});
};
函数httprequest(){
返回新承诺((解决、拒绝)=>{
常量选项={
主持人:“www.google.com”,
路径:“/”,
港口:80,
方法:“获取”
};
const req=http.request(选项,(res)=>{
如果(res.statusCode<200 | | res.statusCode>=300){
返回拒绝(新错误('statusCode='+res.statusCode));
}
变量体=[];
res.on('data',函数(块){
推(块);
});
res.on('end',function(){
试一试{
body=Buffer.concat(body.toString();
}捕获(e){
拒绝(e);
}
决议(机构);
});
});
请求开启('错误',(e)=>{
拒绝(e.message);
});
//发送请求
请求结束();
});
}
AWS Lambda函数在VPC中时,即使在公共子网中,也不会分配公共IP地址。因此,在专有网络中运行时,他们永远无法直接访问互联网。您必须将Lambda功能放置在具有NAT网关路由的专用子网中,以便让它们从您的VPC内访问Internet。您的VPC是否有NAT网关?在其中一种配置中。我在对Mark B的回复中对此进行了较低的描述。我早些时候尝试过(现在又尝试过)。当前设置:具有2个子网(一个公用子网和一个专用子网)的专有网络。公共子集中的NAT网关。我有一个互联网网关。公用子网路由器表点有一个指向Internet网关的0.0.0.0/0项。专用子网路由器表有一个指向NAT网关的0.0.0.0/0条目。根据我找到的文档,我尝试了一些不同的方法。例如,一对夫妇建议将NAT网关置于专用子网中。NAT网关从不从Lambda获取任何流量。NAT网关必须位于公共子网中,否则它将没有到Internet网关的路由。如果VPC的配置如您在评论中所述正确,那么阻止Lambda的互联网请求通过NAT的唯一措施就是安全组或NACL规则,但您说您打开了所有这些规则?奇怪。所以我等了一天,我的VPC向导公共+私有子网配置开始工作。我不知道这有什么问题,但是延迟使调试变得困难。我会继续,并将此标记为正确答案。
const http = require('http');
exports.handler = async (event) => {
return httprequest().then((data) => {
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
});
};
function httprequest() {
return new Promise((resolve, reject) => {
const options = {
host: 'www.google.com',
path: '/',
port: 80,
method: 'GET'
};
const req = http.request(options, (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
return reject(new Error('statusCode=' + res.statusCode));
}
var body = [];
res.on('data', function(chunk) {
body.push(chunk);
});
res.on('end', function() {
try {
body = Buffer.concat(body).toString();
} catch(e) {
reject(e);
}
resolve(body);
});
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
req.end();
});
}