从没有 VPC 的 Lambda 连接到公共 Redshift 数据库

Posted

技术标签:

【中文标题】从没有 VPC 的 Lambda 连接到公共 Redshift 数据库【英文标题】:Connecting to public Redshift DB from Lambda with no VPC 【发布时间】:2019-04-16 22:55:54 【问题描述】:

在 AWS 上,我有一个 API Gateway 设置,它调用一个 lambda 函数,该函数依次访问一个 Redshift 数据库。所有这些服务都在同一个 VPC 中并且可以工作。唯一的问题是每个 api 调用至少需要 10 秒才能启动 VPC 内的 Lambda 函数。

根据我的阅读,如果我们将 Lambda 函数移到 VPC 之外,它应该能够避免 10 秒的启动。但是,此时仍然可以连接到 redshift db 吗? redshift db 是可公开访问的,但 lambda 函数是否需要 VPC 才能访问互联网/公共 redshift db?

【问题讨论】:

第一次调用 lambda 函数时,它会启动代码,这会导致一些延迟。但是在那之后它应该很快,除非很长时间没有再次调用 lambda。我不确定如何通过将 lambda 移出 VPC 来解决此问题。你能分享推荐这个的知识来源吗? 您确定每个调用都会产生开销吗? 当然,这个链接很好地解释了medium.freecodecamp.org/…。特别是“有趣的是,在所有数据点上,添加 VPC 会使冷启动时间平均增加 8.83 秒” @JohnRotenstein,是的,甚至在我们期望 lambda 启动并旋转并且不再需要冷启动之后的几秒钟内相互调用了几次。 【参考方案1】:

正如其他人在 cmets 中建议的那样,我想说,查看您的 Lambda 代码,看看依赖项是否真的很复杂,以至于在初始化时需要花费大量时间。 据我了解,无论在 VPC 内部还是外部,它都会花费相同的时间。

有一个叫做“使用 AWS Lambda 的冷启动/热调用”的东西,它是初始化发生的时间。由于初始化需要构建下载代码、制作容器、初始化容器并最终执行代码。

这里解释得很好。

https://blog.octo.com/en/cold-start-warm-start-with-aws-lambda/

“Lambda 的初始化时间占总时间的很大一部分。冷启动后,Lambda 将保持实例化一段时间(5 分钟),从而使任何其他调用不必等待此初始化完成每次都完成。”

关于您的第二个问题,您是否应该将 Lambda 放在外面,所以最佳实践建议“除非必须,否则不要将 Lambda 放在 VPC 中”。

https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html

【讨论】:

对,这些也是我看到的链接。我想我的主要问题是我是否需要将 Lambda 放入 VPC 以连接到 Redshift。 好的,我自己没有尝试过外部VPC设置,建议您尝试一下。从逻辑上讲,它应该工作。这意味着如果您的Redshift 可以从任何IP 地址公开访问,那么它也必须可以从Lambda 访问,除非您的Lambda 被阻止在Redshift 上建立outbound 连接portprotocol因为其他security 设置。【参考方案2】:

所以事实证明我遇到了连接到 redshift db 的 lambda 超时问题,因为 redshift db 所在的 VPC 中的区域没有与之关联的 IGW 路由表。我解决了这个问题,然后我所要做的就是从它的 vpc 中删除 lambda,然后一切正常了。

长话短说:确保您的 redshift 数据库具有公共互联网访问权限。

【讨论】:

以上是关于从没有 VPC 的 Lambda 连接到公共 Redshift 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Cloud9 (python) 连接到 VPC 中的 Redshift?

如何从亚马逊 vpc 连接到外部世界?

如何将远程计算机连接到我的 VPC?

如何使用 mySQL 工作台连接到 AWS 私有子网 VPC 中的 RDS

从 Lambda 函数(节点)连接到 MySQL 数据库

AWS - 从公共 API 网关到 VPC 内 lambda 的路由