VPC Access Connector 介绍 - 让 Non-VPC product 也可以访问VPC Network内的资源

news2025/1/22 12:52:24

什么是VPC product 和 非 VPC product

在GCP 上, VPC product 指的是属于某个制定的vpc subnet, 具有至少1个 该 subnet 的内网ip的产品
常见的例如:

  1. compute engine / MIG (managed instances group)
  2. 某些dataflow job (指定了 可选参数subnet )
  3. Cloud Composer (基于airflow)

而 Non VPC product 通常是1个共用产品和 server less 的平台,
例如:
4. Cloud Run
5. Pubsub
6. BigQuery

又 VPC product 去访问 Non VPC product 是很简单的, 因为Non VPC product 都具有1个可以由任何地方访问的google 的domain Name.

例如Pubsub 的topic url:
https://pubsub.googleapis.com/v1/projects/jason-hsbc/topics/TopicA:publish

而由 Non VPC product 去访问 VPC product 并不简单, 就如外网和内网的关系, 外网无法通过内网的ip 去访问内网的资源

而VPC Access/Connector 就是为了解决这个问题而存在的

本文会用cloud run的service 作为例子



场景介绍

1个mysql instance 部署在了1一台vm
vm 名字: tf-vpc0-subnet0-mysql0
所属subnet: vpc0-subnet0
内网ip: 192.168.0.51

但是这种情况下, 我家里的电脑的应用是不能直接访问这个mysql instance的。

为了解决这个问题, 我在另1个有外网ip的vm主机设置了1个 sqlproxy , 反向代理了这个mysql instance.
具体参考:
使用 proxySQL 来代理 Mysql

所以对于这个mysql instance
它是具有两个ip的
1个是内网ip 192.168.0.51
1个是外网ip 34.39.2.90

这样我家里的电脑就可以访问这个mysql instance



让spring boot service 可以return 当前的db instance

利用actuator 库, 让/info 接口return db的连接信息:

@Component
@Slf4j
public class AppVersionInfo implements InfoContributor {

    @Value("${pom.version}") // https://stackoverflow.com/questions/3697449/retrieve-version-from-maven-pom-xml-in-code
    private String appVersion;

    @Autowired
    private String hostname;

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Override
    public void contribute(Info.Builder builder) {
        log.info("AppVersionInfo: contribute ...");
        builder.withDetail("app", "Cloud User API")
                .withDetail("version", appVersion)
                .withDetail("hostname",hostname)
                .withDetail("dbUrl", dbUrl)
                .withDetail("description", "This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP.");
    }
}

测试:

[gateman@manjaro-x13 gnome-shell]$ curl 127.0.0.1:8080/actuator/info
{"app":"Cloud User API","version":"0.0.1","hostname":"manjaro-x13","dbUrl":"jdbc:mysql://34.39.2.90:6033/demo_cloud_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true","description":"This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."}
[gateman@manjaro-x13 gnome-shell]$

本地是只能通过外网ip 来连接



让cloud Run service 也通过外网ip 来连接mysql

的确, 这个解决方案是可行的

我也测试过, 当部署service 到cloud run之后, 通过/info api返回的信息来看, service 的确能成功连接到mysql

[gateman@manjaro-x13 gnome-shell]$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://demo-cloud-user-7hq3m4pdya-nw.a.run.app/actuator/info
{"app":"Cloud User API","version":"0.0.1","hostname":"localhost","dbUrl":"jdbc:mysql://34.39.2.90:6033/demo_cloud_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true","description":"This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."}
[gateman@manjaro-x13 gnome-shell]$

但是这个方案有个缺点, 我家里电脑用外网ip 连接mysql 是没办法, 但是在GCP 上, 1个service 通过外网ip连接另1个service不是1个好选择

  1. 流量走了外网, 性能更慢, 收费更贵
  2. 安全问题

所以 Cloud Run的service 在生产上一般是要求用内网ip来访问内网的资源的



让cloud Run service 尝试通过内网ip 连接mysql

by default , 肯定是连不上的, 本文一开始讲过了

在这里插入图片描述


创建1个vpc connector

terraform 脚本:

resource "google_vpc_access_connector" "connector" {
  name          = "vpc-con"
  network = google_compute_network.tf-vpc0.id # for the network where the connector will be created
  machine_type = "e2-micro" # machine type for the connector
  region = "europe-west2"
  ip_cidr_range = "192.168.100.0/28" # means the connector will use created vms in this range
                                     # should not overlap with the sub network's ip range
}

referring:
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/vpc_access_connector

值得注意的参数

  1. network – 就是这个vpc connector 可以指向的vpc network了, 对于本文例子来讲就是 mysql 所在的vm 所在的 vpc subnet 所在的 vpc network
  2. machine_type – 明显这个vpc connector 背后还是要消耗一些24小时开机的vm, 如果是学习和测试目的, 选择最新规格的vm 类型就好, 如果是生产环境当让要看流量来选择了!
  3. ip_cidr_range – 因为每1个vpc connector 都是高可用的, 代表它实际上是1个vm group, 所以需要一些预留ip地址, 这个ip地址必须在对应的vpc-network内, 但不能与subnet 的ip range 重合。 而且必须用/28 结尾

在本文例子中
tf-vpc0 这个vm 已经有两个subnet
分别是:
tf-vpc0-subnet0: 192.168.0.0/24
tf-vpc0-subnet1: 192.168.1.0/24

所以这里的 ip_cidr_range 不能在 192.168.0.xxx ~ 192.168.1.xxx 内
我直接选择 192.168.100.0/28 了

创建成功后
UI 上见到的details 是这样的
在这里插入图片描述
可见, 最小都要占用2台 vm, 能自动扩展成3台, 当然这个2 和3 都是可以在terraform 里配置的



在Cloud run的deploy 脚本上加上vpc connector 的参数

cloud build的脚本:

steps:
  - id: run maven package
    name: maven:3.9.6-sapmachine-17 # https://hub.docker.com/_/maven
    entrypoint: mvn
    args: ['package', '-Dmaven.test.skip=true']

  # https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values
  - id: build docker image
    name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}', '.']

  - id: upload docker image to GAR
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'push', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}']

  # deploy to Cloud run
  - id: deploy image to cloud run
    name: 'gcr.io/cloud-builders/gcloud'
    args: ['run', 'deploy', 'demo-cloud-user',
           '--image=europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}:${_APP_TAG}',
           '--port=8080',
           '--platform=managed',
           '--region=europe-west2',
           '--no-allow-unauthenticated',
           '--service-account=vm-common@jason-hsbc.iam.gserviceaccount.com',
           '--key=projects/$PROJECT_ID/locations/europe-west2/keyRings/mykeyring/cryptoKeys/mycmek',
           '--set-env-vars=APP_ENVIRONMENT=${_APP_ENV}',
           '--vpc-connector=${_VPC_CONNECTOR}',
           '--vpc-egress=all'
           ]
# https://stackoverflow.com/questions/68779751/error-publishing-source-code-from-cloud-build-to-a-bucket-using-triggers
logsBucket: gs://jason-hsbc_cloudbuild/logs/
options: # https://cloud.google.com/cloud-build/docs/build-config#options
  logging: GCS_ONLY # or CLOUD_LOGGING_ONLY https://cloud.google.com/cloud-build/docs/build-config#logging


substitutions:
  _APP_NAME: demo-cloud-user
  _APP_TAG: latest
  _APP_ENV: prod
  _VPC_CONNECTOR: vpc-con

其中 --vpc-connector 就是 这个cloud run service 要使用的 vpc connector
至于 --vpc-egress=all 就是所有出去的流量都走这个vpc connector

测试:

部署成功:
在这里插入图片描述

[gateman@manjaro-x13 conf]$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://demo-cloud-user-7hq3m4pdya-nw.a.run.app/actuator/info
{"app":"Cloud User API","version":"0.0.1","hostname":"localhost","dbUrl":"jdbc:mysql://192.168.0.42:3306/demo_cloud_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true","description":"This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."}
[gateman@manjaro-x13 conf]$ 
[gateman@manjaro-x13 conf]$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://demo-cloud-user-7hq3m4pdya-nw.a.run.app/user/get/3
{"returnCode":0,"returnMsg":"User fetched successfully ...","data":{"id":3,"username":"华沉鱼","address":"湖北省十堰市"}}
[gateman@manjaro-x13 conf]$!

而且连接的数据库ip是内网ip
也能正确获得数据的返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++设计模式——Composite组合模式

一,组合模式简介 真实世界中,像企业组织、文档、图形软件界面等案例,它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易,在软件开发中,组合模式的设计思想和它们类似。 组合模式是…

复分析——第4章——Fourier变换(E.M. Stein R. Shakarchi)

第4章 Fouier变换 Raymond Edward Alan Christopher Paley, Fellow of Trinity College, Cambridge, and International Research Fellow at the Massachusetts Institute of Technology and at Harvard University, was killed by an avalanche on April 7, 1933, whi…

Golang | Leetcode Golang题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; func fractionToDecimal(numerator, denominator int) string {if numerator%denominator 0 {return strconv.Itoa(numerator / denominator)}s : []byte{}if numerator < 0 ! (denominator < 0) {s append(s, -)}// 整数部分numer…

中科数安 | 加密管理系统

中科数安提供的加密管理系统是一套全面而高效的数据安全解决方案&#xff0c;旨在保护企业核心文件资料的安全。该系统结合了多种先进的技术手段和管理策略&#xff0c;确保企业数据在存储、传输和使用过程中都得到严格的保护。 www.weaem.com 以下是中科数安加密管理系统的主要…

ES 8.14 Java 代码调用,增加knnSearch 和 混合检索 mixSearch

1、pom依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>8.14.0</version></dependency><dependency><groupId>co.elastic.clients<…

可解释机器学习之SHAP方法

以Breast cancer wisconsin (diagnostic) dataset数据集为例。 # Built-in libraries import math import numpy as np import pandas as pd# Visualization libraries import matplotlib.pyplot as plt import seaborn as sns# Sklearn libraries # from skle…

项目估算

1.项目估算的基本内容 2.基本估算方法 3.WBS估算法 4.资源估算的基本过程 5.由工作量和开发周期来估算 6.资源特征描述 7.项目角色职能确定 8.工期估算方法 9.成本估算方法 10.LOC估算法 LOC&#xff08;Lines of Code&#xff0c;代码行数&#xff09;估算法是一种简单且直接…

Gracia:打造超逼真VR体验,引领体积视频新时代

在数字化浪潮中,虚拟现实(VR)技术以其独特的沉浸式体验,逐渐成为科技前沿的热点。而在这个领域中,Gracia正以其创新的体积视频技术,为用户带来前所未有的真实感VR体验,致力于成为“空间计算领域的YouTube”。 Gracia,一个充满活力的初创公司,已经获得了120万美元的种…

【记录44】【案例】echarts地图

效果&#xff1a;直接上效果图 环境&#xff1a;vue、echarts4.1.0 源码 // 创建容器 <template><div id"center"></div> </template>//设置容器大小&#xff0c;#center { width: 100%; height: 60vh; }这里需注意&#xff1a;笔者在echar…

音频基础知识和音频指标

音频基础知识 声音 声音&#xff08;sound)是由物体振动产生的声波。物体在一秒钟之内振动的次数叫做频率&#xff0c;单位是赫兹&#xff0c;字母Hz。人耳可以识别的声音频率在 20 Hz~20000 Hz之间&#xff1b; 声音三要素&#xff1a; 响度 响度&#xff0c;…

谷歌Google广告开户是怎么收费的?

谷歌Google广告无疑是企业拓展全球视野、精准触达目标客户的强大引擎。而作为这一旅程的启航站&#xff0c;开户流程的便捷性与成本效益成为了众多企业关注的焦点。云衔科技&#xff0c;作为数字化营销解决方案与SaaS软件服务的领军者&#xff0c;正以其专业、高效的服务体系&a…

【凤凰房产-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Eureka 学习笔记(1)

一 、contextInitialized() eureka-core里面&#xff0c;监听器的执行初始化的方法&#xff0c;是contextInitialized()方法&#xff0c;这个方法就是整个eureka-server启动初始化的一个入口。 Overridepublic void contextInitialized(ServletContextEvent event) {try {init…

Win32:第一个窗口程序-注册窗口类(Part.2)

在part 1中我们阐述了窗口模板程序中的相关宏、全局函数和相关函数声明后我们Part2就来说一下part 1中声明的一个函数MyRegisterClass注册窗口类函数&#xff08;函数中也使用到了定义的一些全局变量&#xff09;&#xff0c;为什么要注册窗口类在part 1中已经阐述过了&#xf…

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI&#xff08;powered by LLM&#xff09;和Headless BI&#xff08;powered by 语义层&#xff09;打造新一代的BI平台。这种融合确…

Python 数据可视化 散点图

Python 数据可视化 散点图 import matplotlib.pyplot as plt import numpy as npdef plot_scatter(ref_info_dict, test_info_dict):# 绘制散点图&#xff0c;ref横&#xff0c;test纵plt.figure(figsize(80, 48))n 0# scatter_header_list [peak_insert_size, median_insert…

如何实现埋点日志精准监控

作者 | 张小七 导读 日志中台承载了百度千亿量级PV的埋点流量&#xff0c;如何对这些流量进行准确监控&#xff0c;并支持个性化字段的抽取、下钻&#xff0c;是日志中台的一大难题。本文简单介绍了日志中台的基本概念及实时流架构&#xff0c;并基于此深入讲解了低成本实现可扩…

【调试笔记-20240618-Windows- Tauri 调试中关闭自动重构的功能】

调试笔记-系列文章目录 调试笔记-20240618-Windows- Tauri 调试中关闭自动重构的功能 文章目录 调试笔记-系列文章目录调试笔记-20240618-Windows- Tauri 调试中关闭自动重构的功能 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相…

【CSS in Depth2精译】1.1.2 行内样式~1.1.3 选择器的优先级

文章目录 1.1.2 行内样式1.1.3 选择器的优先级1.1.3.1 优先级的写法1.1.3.2 关于优先级的思考 1.1.2 行内样式 如果无法通过样式表来源规则解决样式冲突&#xff0c;浏览器则会考察它们是否通过 行内样式 作用于该元素。当使用 HTML 的 style 属性声明样式时&#xff0c;该样式…

kaggle notebook和jupyter notebook读取csv

kaggle本地比赛用打开notebook的示例代码可以获取当前比赛的文件数据路径&#xff0c;进而后续直接复制读取 jupyter notebook读取csv 直接下载数据集到电脑上&#xff0c;并用本地路径读取就行。