【问题标题】:GCF connect to DB on VM from another projectGCF 从另一个项目连接到 VM 上的数据库
【发布时间】:2018-07-07 17:39:35
【问题描述】:

假设我在项目 A 的虚拟机上运行了一个 Mongo 数据库实例。我想将项目 B 中的 Google Cloud Function 连接到项目 A 中的数据库。我需要在控制台中设置什么?

我已将项目 B 的服务帐户添加到项目 A IAM(以 xxx@appspot.gserviceaccount.com 结尾)但从 GCF 的日志中,mongo 不断报告错误,例如 MongoError: getaddrinfo ENOTFOUND mongodb0-server-1 mongodb0-server-1:27017

我相信我必须允许项目 B 从防火墙规则中访问项目 A 的资源,但我不确定 Cloud Functions 没有像 Compute Engine 这样的外部 IP。我也找不到关于这个案例的明确文件。

【问题讨论】:

    标签: google-cloud-platform google-compute-engine google-cloud-functions


    【解决方案1】:

    主机名解析

    在 Google Cloud Platform 中,不同项目实例的主机名的 DNS 解析不起作用。

    因此,在项目 A 中,您将能够解析该项目的 Google Compute Engine 实例的所有主机名,但您将无法对项目 B 执行相同操作(也因为实例的名称不是唯一的跨项目,这是不可能的!)。

    这就是我认为您正在从项目 A 连接到项目 B 的原因:

    MongoError: getaddrinfo ENOTFOUND mongodb0-server-1 mongodb0-server-1:27017
    

    您可以决定通过运行 mongoDB 的实例的公共 IP 来引用服务器,或者按照 this SO question 中的建议在 /etc/hosts 添加静态 DNS 规则,但我想这不是一个选项,因为您这样做了无权访问运行您的代码的实例。

    防火墙

    此外,在托管 mongoDB 的项目中,您需要允许到您的数据库的流量,以便云函数使用的协议和端口与数据库通信。

    为此,由于您似乎无法为 Google Cloud Functions 创建静态 IP,因此您需要将所有人列入白名单(不是最安全的解决方案)或将 google IP 列入白名单,类似问题here

    【讨论】:

    • 嗨,当我连接到 mongo 实例时,我实际上已经使用了外部 IP 地址。我的连接字符串类似于mongodb://user:pass@1.2.3.4:27017/db?authSource=source&replicaSet=replica,但它被翻译成域名mongodb0-server-1
    • 使用防火墙,我为端口 27017 添加了一条类似 0.0.0.0 的规则,但该功能仍然无法连接到数据库。可能是因为之前的主机名问题。
    • 我会尝试调试它,将问题分成两部分。首先尝试在不使用CloudFunctions的情况下从您的机器或projectB的实例连接到mongodb实例,这样您可以测试防火墙规则的正确性。我寻找了问题的第二部分,这似乎是一个可以解决更新环境变量的常见问题,我建议您在线检查(以下是几个随机示例):github.com/Automattic/mongoose/issues/3049stackoverflow.com/questions/39108992/… ,ecc
    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多