【问题标题】:AWS Lambda NodeJS, can't make external connectionAWS Lambda NodeJS,无法建立外部连接
【发布时间】:2019-04-12 19:42:59
【问题描述】:

所以,我正在尝试做一件基本的事情:从我的 AWS Lambda 脚本连接到外部 REST-API。
此 API 托管假期列表。

但是,每当我尝试执行代码时,它就会超时(达到最大 lambda 执行时间)。

所以我创建了这个包装函数,它能够处理 4 种不同的 GET 请求方式,但它们都执行相同的操作。

const request = require('request')
const https = require('https')
const axios = require('axios')
const superagent = require('superagent')

let test = (type = "") => {
    return new Promise((resolve, reject) => {
        debug("Fetching with: " + type)
        const d = new Date()
        if(type == "superagent"){
            superagent.get('https://holidayapi.pl/v1/holidays?country=DK&year=' + d.getFullYear())
            .query({ country: 'DK', year: '2019' })
            .end((err, res) => {
                if (err) {
                    console.log(err)
                    reject(err)
                } else {
                    console.log(res)
                    resolve(res)
                }
            })
        } else if(type == "axios"){
            axios.get('https://holidayapi.pl/v1/holidays?country=DK&year=' + d.getFullYear())
            .then(response => {
                debug(response)
                resolve(response)
            })
            .catch(error => {
                console.log(error)
                reject(error)
            })
        } else if(type == "https"){
            const req = https.get("https://holidayapi.pl/v1/holidays?country=DK&year=" + d.getFullYear(), (resp) => {
                let data = ''

                // A chunk of data has been recieved.
                resp.on('data', (chunk) => {
                    data += chunk
                })

                // The whole response has been received. Print out the result.
                resp.on('end', () => {
                    console.log(JSON.parse(data).explanation)
                    resolve([])
                })
            })
            .on('error', (e) => {
                debug(e)
                reject(e.message)
            })
            req.end()
        } else if(type == "request"){
            request('https://holidayapi.pl/v1/holidays?country=DK&year=' + d.getFullYear(), { json: true }, (err, res, body) => {
                debug(err)
                debug(res)
                debug(body)
                if (err) reject(err)
                else resolve(body.holidays)
            })
        } else {
            reject("Mangler type")
        }
    })
}

exports.connect_test = (event, context, callback) => {
    test(event.pathParameters.type)
    .then((rsp) => {
        callback(null, JSON.stringify(rsp, null, 2))
    })
    .catch((err) => {
        callback(null, JSON.stringify(err, null, 2))
    })
}

debug 函数是到 console.log 的映射,用于检查 NODE_ENV 是否为“dev”。

【问题讨论】:

  • 超时可能是网络问题,lambda 是在 VPC 中午餐还是在没有 VPC 的情况下午餐?
  • 这绝对是网络问题。我建议您关注此tutorial,然后返回您的结果。

标签: node.js aws-lambda


【解决方案1】:
  • 我认为默认 VPC 已获得 Internet 连接,因此,如果它处于默认状态,它应该可以正常工作(只需将 lambda 上的默认超时增加到合理的值)。
  • 如果它位于 VPC 内部,则您需要为该 VPC 配置 NAT 网关/NAT 实例,以便具有 Internet 连接或与另一个具有 Internet 访问权限的 VPC 配对(在 VPC lambda 内部需要具有适当的角色和子网)。
  • 这可能会对您有所帮助aws docs

【讨论】:

  • 它在一个 VPC(默认)内。这可能是问题所在,因为它会跟踪我所做的更改以及停止工作的时间。 VPC 有 IGW、DOPT、ACL 和 3 个子网。我在哪里可以找到阻止流量的设置?
  • 您的 VPC 无法访问互联网。您必须通过连接到您的 VPC 的 NAT 网关启用它。
  • @Folkmann 我在上面的答案中添加了一个链接,可能会对您有所帮助
  • 感谢您的帮助。找到this gist,它以我理解的方式解释了这个概念。所以,我的 lambda 函数现在可以访问 API 了 :)
猜你喜欢
  • 2021-11-16
  • 2023-04-04
  • 2013-01-13
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2020-11-22
  • 2018-04-27
相关资源
最近更新 更多