创建VPC访问连接器的混淆

21

我正在尝试设置无服务器 VPC 访问

无服务器 VPC 访问使您可以直接从 Cloud Functions 连接到 Compute Engine VM 实例、Memorystore 实例、Cloud SQL 实例,

听起来很不错。但文档对于初学者来说并不友好。第二步是创建连接器,关于这一点我有几个问题:

在网络字段中,选择要连接的 VPC 网络。

我的下拉菜单只包含“默认”。这正常吗?我应该期望在这里看到什么?

在 IP 范围字段中,输入一个未使用的 CIDR /28 IP 范围。此范围内的地址用作通过连接器发送的流量的源地址。此 IP 范围不得与 VPC 网络中任何现有 IP 地址预留重叠。

我不知道该怎么办。我尝试使用链接的文档中的信息,首先输入所选区域的 IP,然后输入该区域之外的 IP。但两者都导致创建的连接器出现错误:“连接器状态不佳,建议手动删除”。

文档继续提供了一些故障排除步骤,以防创建失败:

指定一个与VPC网络中任何现有IP地址预留不重叠的IP范围。

我不知道这是什么意思。或许是说,如果我有其他连接器,我应该确保新的连接器的IP范围不与那些连接器重叠。这只是一个猜测,但无论如何,我没有其他连接器。

授予您的项目使用来自具有ID“serverless-vpc-access-images”的项目的计算引擎VM映像的权限。有关如何相应更新组织策略的信息,请参见设置图像访问约束。

这将带我到另一个文档,介绍如何更新我们组织的“Image Policy”。这个问题超出了我的能力范围,我甚至认为我不应该在这里。

这一切都始于只是想从Firebase连接到SQL Server实例。创建VPC连接器似乎是一个好的步骤,但我在每个障碍上都失败了。能否有云居民帮我解决一些疑惑?


@Kolban 是的,那很有帮助。但是我对私有IP部分有点困惑。当我尝试在GCP=>SQL=>连接=>选择私有IP复选框下选择时,我以为会显示一个可以连接的私有IP。但事实并非如此。它只是说“此实例将使用现有的托管服务连接”。我以为,好吧,也许它意味着继续使用您的旧公共IP,但那也不起作用。有什么想法吗? - 1252748
@Kolban 我尝试使用创建连接器时使用的IP,但那也不起作用 :/ - 1252748
我进行了一些测试。我创建了一个MySQL数据库并请求了它的私有IP。我得到了RFC1917 IP。没有问题。一切似乎都可以工作。但我不确定你的问题在哪里……我看不到任何问题。我认为让您掌握VPC网络非常重要。这是GCP逻辑网络。将其视为软件网络,您的计算引擎和Cloud SQL实例都有其IP地址。这是一个私有网络。您的目标将是您的Cloud Function最终能够将流量路由到该网络,因此您的数据库将是私有的(没有Internet / public)。 - Kolban
@Kolban 感谢您的帮助。在小睡一会儿后回来查看,似乎新的私有IP地址需要一段时间才能显示在我的实例概述页面上。所有这些操作都需要很长时间才能运行,我想特别是超级慢,但现在我的VPC连接已经可以使用了!谢谢!至于“我认为重要的是让您掌握VPC网络”,我同意我对导致我到这里的概念有一个相当松散的理解。您有什么阅读建议可以加强这方面的知识吗?再次感谢您。干杯。 - 1252748
1
@SebastianG 我解决了...没错,是我的子网问题,我创建了一个新的子网,范围为10.0.0.0/20而不是10.0.0.0/8。 - Conner
显示剩余6条评论
3个回答

11
我认为您已经解决了问题,但我将写一个答案来总结所有步骤,以备将来参考。
1. 创建无服务器VPC访问
我认为最好的参考是按照这个doc中的步骤进行操作。在第7步中,它说:
在IP范围字段中,输入一个未保留的CIDR / 28 IP范围。
您可以使用的IP例如是10.8.0.0/28,甚至是10.64.0.0/28,条件是它没有用于任何其他网络。您可以查看哪些IP地址正在使用,转到 。在网络字段中,您将拥有“默认”选项,因此没问题。
这可能需要一些时间,因此在此期间,您可以创建SQL Server / MySQL / PostgreSQL实例。
2. 创建CloudSQL实例
创建所需的实例(MySQL/PostgreSQL/SQL Server)。在您的情况下,它将是一个 SQL Server 实例。同时,请检查这些steps以在创建时为您的实例配置私有 IP,或者如果您已经创建了实例,则可以检查this。请注意私有 IP,因为您稍后会用到它。
3. 创建一个云函数
在创建 Cloud Function 之前,您必须授予权限给 CF 服务帐户使用 VPC。请按照这些steps进行操作。
然后按照这些steps进行操作,以配置函数的连接器以使用 VPC。第 5 步中写道:

In the VPC connector field, enter the fully-qualified name of your connector in the following format:

projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME

不需要按照这种格式添加您的VPC。已经有一个列表,您可以选择您的VPC。最后部署您的函数。

我编写了一个小函数来测试连接。我更喜欢使用Python,但它需要比NodeJS更多的系统依赖项。

index.js:

var express = require('express');
var app = express();
var sql = require("mssql");

exports.helloWorld = (req, res) => {
    var config = {
        user: 'sqlserver',
        password: 'password',
        server: 'Your.SQL.Priavte.IP', 
        database: 'dbname' 
    };

    // connect to your database
    sql.connect(config, function (err) {
        if (err) console.log(err);

        // create Request object
        var request = new sql.Request();
           
        // query to the database and get the records
        request.query('select * from a_table', function (err, recordset) {
            if (err) console.log(err)

            // send records as a response
            res.send(recordset);
        });
    });
};

package.json:

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "express": "4.17.1",
    "mssql": "6.0.1"
  }
}

就是这样! :D

需要提到的是,这个过程更多地是关于将云函数连接到SQL Server,因为已经有一种更简单的方法来连接CF到PostgreSQL和MySQL。


嗨,我已经完成了所有这些步骤,但是如果我尝试将连接器添加到我的特定网络中,它仍然会处于错误状态--如果我只选择“默认”那里,它将能够创建连接器,但否则总是导致相同的错误状态。 - SebastianG
嗨,当我选择asia-south1地区时,它总是会出现错误状态。但是当我选择us-central1地区时,我能够创建一个。有什么解决办法吗? - saxenarishav
@saxenarishav 你解决了这个问题吗?显然,这个地区的每个人都遇到了这个问题。 - Catalyst
这个区域的问题仍然存在。有人找到解决方案了吗? - Muhammad Zeeshan

0

我发现在这些连接器中使用的IP数量存在硬性限制。您可以增加配额或切换到其他地区。

IP的硬性限制是由免费层次的配额https://console.cloud.google.com/iam-admin/quotas所施加的。

当不处于免费层次时,您可以请求增加配额。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接