Amazon web services 公用子网中的AWS Lambda无法访问internet

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。我尝试了

我正试图让一个Lambda运行在一个公共子网内,以便与internet通信。我可以让Lambda在没有VPC的情况下访问www.google.com(文档称在幕后运行),但如果我在VPC中运行Lambda,我就无法访问www.google.com

复制步骤:

  • 使用以下代码创建一个Lambda(Node.js 12x)。我把Lambda命名为“谷歌”
  • 运行它以验证它是否成功,并可以从www.google.com获取。不应指定VPC
  • 转到VPC仪表板并使用VPC向导创建具有公共子网的VPC。我尝试了IPv4 CIDR块(例如10.1.0.0/16)、IPv6 CIDR块、AZ的视图值。我通常将“启用DNS主机名”保留为“是”
  • 更改Lambda以使用新创建的VPC、子网和安全组
  • 验证此消息没有到达谷歌并超时
  • 我尝试过修改这种方法,但没有取得任何成功(例如,实际将子网与vpc关联,放松安全组和网络ACL上的所有设置)

    我最初尝试遵循一个公共文档和一个私人文档,但没有成功

    有什么想法吗?谢谢 -丹

    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();
        });
    }