让数据在两个buckets之间传输 - Google Storage Transfer Service

在业务场景中, 有时我们不想直接暴露数据存储空间给上游系统, 而需要设置1个landing Path 让上游系统发送数据

如图:
在这里插入图片描述
我们只需grant landing bucket 的权限给上游系统, 而上游系统是访问不了storage bucket的保证了数据隔离
但是至于怎么把放在landing bucket的文件自动导到Storage Bucket.

我们当然可以写代码, build 一些ETL service去完成, 这个service 定期观察landing bucket是否有新文件到。 有就把文件放入Storage Bucket



Storage Transfer Service 介绍

Google 已经具有个产品叫 Storage Transfer Service, 可以帮我们把文件在两个bucket 之间传输(甚至包括AWS S3 Bucket, 不在本文讨论范围内)

大概原理图:
在这里插入图片描述



各组件介绍



src bucket

就是storage transfer service 的源bucket

storage notification

要实现event driven的storage transfer serivce, 我们必须为src bucket 创建1个bucket notification, 一旦有新文件进入or 改动(事件类型可以配置), bucket notfication 会发送一条消息(新文件的元数据) 到1个pubsub topic

参考
https://cloud.google.com/storage/docs/pubsub-notifications

pubsub topic

pubsub 组件是实现event driven 的关键, topic 的主要作用就是用于接受storage notification发送的消息

pubsub pull subscription

subscription 就为了让 后面的 transfer streaming job 去消费消息(发送自storage notification)

Storage Transfer streaming job

这个就是整个流程的核心, 这个job 会24小时启动, 它会monitor pubsub subscription, 一旦有新的消息, 它就回去把文件从src bucket move 到 target bucket

并不难理解



1个具体例子

创建 buckets

首先 我们先创建 两个bucket
jason-hsbc-demo-src
jason-hsbc-demo-target

// define src bucket
resource "google_storage_bucket" "bucket-jason-hsbc-demo-src" {
  name     = "jason-hsbc-demo-src"
  project  = var.project_id
  location = var.region_id
}


//define target bucket
resource "google_storage_bucket" "bucket-jason-hsbc-demo-target" {
  name     = "jason-hsbc-demo-target"
  project  = var.project_id
  location = var.region_id
}
创建 pubsub topic 和subscription

topic: topic-sts-demo
subscription: subscription-sts-demo


//define a pubsub topic
resource "google_pubsub_topic" "topic_sts_demo" {
  name = "topic-sts-demo"
  project  = var.project_id
}


//define a pubsub subscription
resource "google_pubsub_subscription" "subscription_sts_demo" {
  name     = "subscription-sts-demo"
  topic    = google_pubsub_topic.topic_sts_demo.name
  project  = var.project_id
}
分配权限
  1. 把topic 的publish 权限 分配给gcs agent account , 否则storage notification 没有权限发送消息给pubsub
resource "google_pubsub_topic_iam_binding" "topic_sts_demo_binding" {
  topic   = google_pubsub_topic.topic_sts_demo.id
  role    = "roles/pubsub.publisher"
  members = ["serviceAccount:${var.gcs_sa}"]
}

至于如何查出当前gcp 项目的gcs agent account , 可以用下面命令获得:

[gateman@manjaro-x13 chapter-01]$ gcloud storage service-agent
service-912156613264@gs-project-accounts.iam.gserviceaccount.com

也可以从下面document里查询
https://cloud.google.com/iam/docs/service-agents

  1. 把subscription 的Read/Edit 权限分配给 storage transfer service 的 agent account, 注意这个不是上面那个gcs agent account. 两个不同的
resource "google_pubsub_subscription_iam_binding" "subscription_sts_demo_binding" {
  subscription = google_pubsub_subscription.subscription_sts_demo.name
  role         = "roles/editor"
  members = ["serviceAccount:${var.sts_sa}"]
  
}
  1. 把 两个bucket的读写权限都grant 给 storage transfer service 的 agent account

注意, 实际上transfer service agent account 需要src bucket的 storage.buckets.get 权限, 建议grant object.admin role, 如果只给objectUser role的话会有如下错误

 Error: googleapi: Error 400: Failed to obtain the location of the GCS bucket jason-hsbc-demo-src Additional details: project-912156613264@storage-transfer-service.iam.gserviceaccount.com does not have storage.buckets.get access to the Google Cloud Storage bucket. Permission 'storage.buckets.get' denied on resource (or it may not exist)., failedPrecondition
resource "google_storage_bucket_iam_binding" "bucket-jason-hsbc-demo-target-binding" {
  bucket = google_storage_bucket.bucket-jason-hsbc-demo-target.name
  role = "roles/storage.admin"
  members = ["serviceAccount:${var.sts_sa}"]
}

resource "google_storage_bucket_iam_binding" "bucket-jason-hsbc-demo-src-binding" {
  bucket = google_storage_bucket.bucket-jason-hsbc-demo-src.name
  role = "roles/storage.admin"
  members = ["serviceAccount:${var.sts_sa}"]
}



为src bucket 创建storage notification

注意要正确指定上面create的pubsub topic

// https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/storage_notification.html
// define a bucket notification
resource "google_storage_notification" "notification" {
  bucket         = google_storage_bucket.bucket-jason-hsbc-demo-src.name
  payload_format = "JSON_API_V1"
  topic          = google_pubsub_topic.topic_sts_demo.id
  event_types    = ["OBJECT_FINALIZE", "OBJECT_METADATA_UPDATE"]
  custom_attributes = {
    new-attribute = "new-attribute-value"
  }
  depends_on = [google_pubsub_topic_iam_binding.topic_sts_demo_binding]
}

最后一步, 基于pubsub subscription 创建1个storage transfer stream job

参考https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/storage_transfer_job.html

resource "google_storage_transfer_job" "transfer-job-sts-demo" {
  description = "transfer-job-sts-demo"
  project     = var.project_id
  transfer_spec {

    transfer_options {
      overwrite_objects_already_existing_in_sink = true
      overwrite_when = "ALWAYS"
      delete_objects_from_source_after_transfer = true 
    }

    gcs_data_source {
      bucket_name = google_storage_bucket.bucket-jason-hsbc-demo-src.name

    }
    gcs_data_sink {
      bucket_name = google_storage_bucket.bucket-jason-hsbc-demo-target.name
    }
   
  }

  event_stream {
      name =  format("projects/%s/subscriptions/%s", var.project_id, google_pubsub_subscription.subscription_sts_demo.name)
  }

  
  depends_on = [google_storage_notification.notification, 
                google_pubsub_subscription_iam_binding.subscription_sts_demo_binding,
                google_storage_bucket_iam_binding.bucket-jason-hsbc-demo-target-binding,
                google_storage_bucket_iam_binding.bucket-jason-hsbc-demo-src-binding]
}
测试

我们先给src bucket 上传1个文件


[gateman@manjaro-x13 chapter-01]$ gsutil cp *csv  gs://jason-hsbc-demo-src
Copying file://supermarket_sales.csv [Content-Type=text/csv]...
- [1 files][128.4 KiB/128.4 KiB]                                                
Operation completed over 1 objects/128.4 KiB. 

检查bucket 文件

[gateman@manjaro-x13 chapter-01]$ gsutil ls gs://jason-hsbc-demo-src
gs://jason-hsbc-demo-src/chapter-01-steps.sql
[gateman@manjaro-x13 chapter-01]$ gsutil ls gs://jason-hsbc-demo-target
gs://jason-hsbc-demo-target/Untitled-1.mak
gs://jason-hsbc-demo-target/chapter-01-steps.sql
gs://jason-hsbc-demo-target/supermarket_sales.csv

可以见到 csv 文件已经被传送到target bucket

我们也可以从UI 上查看transfer job的状态
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3与Electron构建跨平台应用(webpack)

一、创建vue3项目 vue create vue3_webpack_electron 二、安装Electron npm install --save-dev electron Electron 三、vue add electron-builder vue add electron-builder

RK3568平台开发系列讲解(pinctrl篇)pinctrl 子系统函数操作集

🚀返回专栏总目录 文章目录 一、pinctrl_ops二、pinctrl_ops三、pinconf_ops沉淀、分享、成长,让自己和他人都能有所收获!😄 在 pinctrl_desc 结构体中总共有三个函数操作集, 具体内容如下所示: const struct pinctrl_ops *pctlops; // 引脚控制操作函数指针 const

【机器学习】基于萤火虫算法优化的BP神经网络分类预测(FA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】萤火虫算法(FA)原理及实现 2.设计与实现 数据集: 多输入多输出:样本特征24,标签类别4。…

html常见标签

width宽度 height高度 border边框 1px(边框线条宽度) solid(实线) red(红色) border-radius: 100px 边框圆角 background-color:red(背景颜色为红色) margin&#xf…

STL_list文档使用介绍与底层代码实现简介

文章目录 list介绍list的使用构造函数(constructor)迭代器list capacitylist modify(修改)其他接口函数list迭代器失效问题 list实现基础框架(节点类)基础框架(迭代器类)基础框架(链…

提供数字免疫力:采取整体方法来优化您的网络

采用数字技术已成为许多美国企业的关键竞争优势,导致其在与新部署的云解决方案的安全连接方面的投资不断增加。然而,随着越来越多的关键应用程序迁移到云端,公司保护其敏感数据和资源变得更具挑战性,因为这些资产现在超出了内部防…

uniapp——第3篇:自定义组件、组件间传数据

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,还有一定要会Vue!(Vue2\Vue3)都要会!!!不然不好懂 一、组件是啥玩意? 我之前讲vue2的文章讲过 Vue全家桶:vue2vue3全…

Python通过Ctypes调用C++类,实测有效

文章目录 前言创建vs dll工程添加外部库编辑代码编译测试参考 前言 在软件开发中,有时候需要Python与C相结合,以充分发挥两者的优势 。Python作为一种高级编程语言,具有简洁易读的特点,适用于快速开发和原型设计。而C则是一种性能…

小程序绕过 sign 签名

之前看到了一篇文章【小程序绕过sign签名思路】之前在做小程序渗透时也遇到了这种情况,但是直接放弃测试了,发现这种思路后,又遇到了这种情况,记录下过程。 并没有漏洞分享,仅仅是把小程序也分享出来,方便…

上位机图像处理和嵌入式模块部署(qmacvisual轮廓查找)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,图像的处理流程一般都是这样的,即灰度化-》降噪-》边缘检测-》二值化-》开闭运算-》轮廓检测。虽然前面的几个…

AI开源概览及工具使用

一、前言 随着ChatGPT热度的攀升,越来越多的公司也相继推出了自己的AI大模型,如文心一言、通义千问等。各大应用也开始内置AI玩法,如抖音的AI特效; 关联资源:代码 GitHub、相关论文、项目Demo、产品文档、Grok Ai、gr…

多数据源 - dynamic-datasource | 进阶 - 动态添加、移除数据源

文章目录 实现原理示例程序🗯️ 上节回顾:前节中,了解了 dynamic-datasource 的事务支持。 👉 本节目标:了解 dynamic-datasource 的进阶用法 - 动态添加/移除数据源。 动态添加/移除数据源:指在系统运行过程中动态的添加数据源,删除数据源,多使用于基于数据库的多租…

探讨苹果 Vision Pro 的空间视频(术语辨析、关键技术、思考)

背景:一位资深视频技术从业者在 Pixvana 工作,积累了丰富的捕获、处理、编码、流传和播放空间媒体经验。 一、术语 空间视频:传统的 3D 视频,呈矩形,包含左右眼视图,如 iPhone15 Pro 和 Vision Pro 可录制。沉浸式视频:非矩形的环绕式视频体验,通常由两个或多个传感器…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1)priority_queue()/priority_queue(first, last) 2)push(x) 3)pop() 4&#…

Datawhale 零基础入门数据挖掘-Task1 赛题理解

一、 赛题理解 Tip:此部分为零基础入门数据挖掘的 Task1 赛题理解 部分,为大家入门数据挖掘比赛提供一个基本的赛题入门讲解,欢迎后续大家多多交流。 赛题:零基础入门数据挖掘 - 二手车交易价格预测 地址:零基础入门数据挖掘 -…

【Vue】三、使用ElementUI实现图片上传

目录 一、前端代码实现 二、后端代码实现 三、调试效果实现 一、前端代码实现 废话不多说直接上代码 <el-form-item prop"image" label"上传图片" v-model"form.image"><el-upload:action"http://localhost:8…

关于vuex 的模块开发和使用

1、文件结构 2、modules 文件内容 例子&#xff1a; ccc.js 文件内容如下&#xff1a; // 基础配置项 const state {aa: [] }const mutations {setaa (state, data) {state.aa data} }const actions {} export default {namespaced: true, state,mutations,actions } **注…

【Linux】进程通信

目录 一、管道通信 二、共享内存 三、消息队列 一、管道通信 管道是由操作系统维护的一个文件&#xff0c;管道通信的本质就是将管道文件作为临界资源&#xff0c;实现不同进程之间的数据读写&#xff0c;但是管道只允许父子进程或者兄弟进程之间的通信。 管道文件本身是全…

Redis面试题以及答案

1. 什么是Redis&#xff1f;它主要用来什么的&#xff1f; Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并…

虹科Pico汽车示波器 | 免拆诊断案例 | 2019 款东风悦达起亚K2车怠速起停系统工作异常

一、故障现象 一辆2019款东风悦达起亚K2车&#xff0c;搭载G4FG发动机&#xff0c;累计行驶里程约为9 400 km。车主反映&#xff0c;行驶至路口停车等红灯时&#xff0c;怠速起停&#xff08;ISG&#xff09;系统自动使发动机熄火&#xff0c;接着组合仪表提示“怠速起停已解除…