使用 Terraform 与事件驱动的 Amazon CodeBuild 提升云上数据应用运维效率

news2024/11/17 7:29:59

背景信息

企业客户在云上部署的一系列数据应用的过程中,数据开发团队往往负责脚本内容,而其背后一系列云上资源的管理通常由一支云运维职能团队通过 IaC(Infrastructre as Code)实现。然而,当数据开发团队开发及部署相应脚本内容时,不可避免会涉及到云上资源的变动,如 Glue、Lambda 的资源增改等。这就造成了两个团队在职能边界上的紧耦合:数据开发团队的迭代内容都需要提报需求至云运维团队进行相应 IaC 的运维,双方都增加了工作量。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

 

优化方案概述

为了减轻数据应用代码增改给双方带来的额外压力,本文通过一个案例入手,优化数据应用增改及部署过程中的关键流程:数据开发团队通过接口化的形式调用相应 Terraform module,配合 Amazon CodePipeline 或 EventBridge 驱动的事件模式来实现 CI/CD 流水线。

此案例中,云运维团队负责IaC模块的部署和运维,使用 Terraform Cloud Workspace 进行 IaC 代码发布与管理。数据开发团队负责针对具体的 ETL 任务场景开发 Glue 脚本,使用 CodeCommit 进行代码管理,使用 CodeBuild 实现 CI/CD 内容,最后通过 CodePipeline 或 EventBridge 实现 CI/CD 流水线的串联。两支团队配合实现以下场景:

“某企业hr部门需要将某数据源摄取至 MySQL 中供下游数据应用使用。在数据工程师完成 Glue 脚本开发后,使用云运维团队开发的 Glue 模版批量新建 Glue 脚本(Python shell模版)资源。在后续数据工程师新建或修改Glue脚本时,这一套流水线能自动捕获 CodeCommit 中的变更内容,并同步内容至 s3。s3 的变更将会直接反应至 Terraform 中触发新建/更新资源的功能,不需要 IaC 开发/云运维团队的介入。”

下文的优化方案将会清晰定义云运维团队和数据开发团队在开发、维护云上数据应用时的责任边界。

实施步骤

(1) 统一流程与规范

数据开发团队与云运维团队间确认关键流程及步骤,包括 CI/CD 流水线如何实现,Glue 脚本的上传方式和存储位置,资源所需的配置信息(如实例类型,所需的 IAM 权限,网络)等。

(2) Terraform 脚本开发

云运维团队负责 Glue 资源的 IaC 脚本开发,内容包括:配置参数,新增/变更资源的代码。开发好的内容会统一放置在 glue-etl 目录下。此目录中内容示例如下:

|____glue-etl
| |____output.tf
| |____data.tf
| |____main.tf
| |____Readme.md
| |____policy.tf
| |____variables.tf

云运维团队对 glue-etl 模块进行封装( module )以及发布至Terraform Cloud 相应的 Workspace 内。

上述 glue-etl 模块中包含以下内容:

  • tf中包含了此 module 输出的一系列参数。
  • tf包含了对 Amazon 环境中已有的一些资源的引用,如:当前所在区域,当前用户信息,Glue 脚本所需要访问的数据库所在的 Secret Manager密钥串,和部署 Glue 资源所需的子网组等必要信息。
  • tf 中包含了 Glue 执行时所需的IAM角色对应的相关 IAM Policy 集合。
  • tf中包含了需要用户调用此 module 需要传入的一系列配置参数。

由于篇幅问题,上述.tf具体代码内容已略去。

(3) 监听s3内容变更

在云运维团队完成 glue-etl module 的开发与上传至 Terraform Workspace 后,数据开发团队需要初始化一份 .tf 文件,使用 local 关键词将脚本上传路径(如下方代码块中的变量 bucket_name, job_path_prefix和line_of_business中)添加到 .tf 文件中。

locals {
  bucket_name = "sample-bucket-glueetl"
  job_path_prefix = toset(["hr-mysql-source1-python-scripts"])
  line_of_business = "hr-department"
}

第二步,通过 Terraform 提供的 data.aws_s3_bucket_objects 获取 Glue 脚本在 s3 上的存放路径。

data "aws_s3_bucket_objects" "glue_job_objects_for_people_mdm_staging" {
  for_each = local.job_path_prefix
  bucket   = local.bucket_name
  prefix   = "${local.line_of_business}/${each.key}"
}

下一步,配置 Glue module 所需的输入参数。以下示例中展现了如何通过字符串操作将 Glue 作业名与上传的脚本名进行对应(映射规则可以自定,本例中以 .py 文件前缀作为 Glue 作业名,见 Figure 8),并放入 job-name-map 的 local 变量中。在实际应用中,您有可能需要配置不止一个 local 变量作为 module 的输入参数。

locals {
  job_name_map  = { 
for job_prefix in 
[for job_name in 
[for py_name in data.aws_s3_bucket_objects.glue_job_objects_for_people_mdm_staging["hr-mysql-source1-python-scripts"].keys : split("/", py_name)[2]
] : split(".", job_name)[0]
] : job_prefix => "${job_prefix}.py" if job_prefix != "" }
}

最后,通过调用在 Terraform Cloud Workspace 中的 module(此例中为 glue-etl )批量创建某一规格下的 Glue Python shell 脚本。

module "glue-etl-type1" {
  source                                  = "app.terraform.io/repo/glue-etl/aws"
  subnet_list                             = ["subnet-1","subnet-2","subnet-3"]
  bucket_name                             = local.bucket_name
  line_of_business                          =  local.line_of_business
  secret_manager_id                       = "some-secretmanager-id"
  if_connection                           = true
  conn_name                               = local.connection_name_staging
  glue_job_name_list_for_python  = local.job_name_map
  max_concurrent_runs_for_python = 4
  max_retries_for_python         = 0
}

(4) 实现 CodeBuild 驱动的 CI/CD 流水线

本文使用 EventBridge 来串联 CodeCommit 与 CodeBuild,您也可以根据使用习惯选择 Amazon CodePipeline 实现同样的功能。在开始之前,请您务必确保相应的 Amazon CodeCommit与 CodeBuild 已经被初始化。

设置 CodeCommit 仓库增、改事件触发的 EventBridge 规则,如下所示。

{
  "source": [
    "aws.codecommit"
  ],
  "detail-type": [
    "CodeCommit Repository State Change"
  ],
  "detail": {
    "event": [
      "referenceCreated",
      "referenceUpdated"
    ]
  }
}

为此规则配置 Input Transformer,分别定义输入路径及输入模版,如下所示:

{"referenceType":"$.detail.referenceType","region":"$.region","repositoryName":"$.detail.repositoryName","account":"$.account","referenceName":"$.detail.referenceName"}

{"environmentVariablesOverride": [
      {
          "name": "REFERENCE_NAME",
          "value": <referenceName>
       },
      {
          "name": "REFERENCE_TYPE",
          "value": <referenceType>
       },
      {
          "name": "REPOSITORY_NAME",
          "value": <repositoryName>
       },
      {
          "name": "REPO_REGION",
          "value": <region>
       },
       {
          "name": "ACCOUNT_ID",
          "value": <account>
       }
 ]}

配置 buildspec.yml,体现 CI/CD 流水线具体流程。本例中,流水线内容包括:

  • 安装 git-remote-codecommit 以及其他代码中所需的 Python 依赖包(本例中使用 Makefile 安装依赖)或命令(如本例中的 Terraform )
  • 实现对 ETL 脚本或.tf文件代码的 CI 过程,如代码质量检查,语法检查,安全漏洞扫描,Unit Test等
  • 当 CI 过程结束后,同步 CodeCommit 中更新的代码至存放 Glue 内容的 s3 路径中。当 s3 收到更新代码后,进行以下操作:
  • Terraform 的语法检查( terraform fmt, validate & lint )
  • 资源变更检查( terraform plan )
  • 最终发布( terraform apply )
AWS CodeBuildversion: 0.2

env:
  variables:
    TF_VERSION: "1.0.6"
    
phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      - pip install git-remote-codecommit
      - make install
  pre_build:
    commands:
      - echo Hello pre build
      - cd /usr/bin
      - "curl -s -qL -o terraform.zip https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_amd64.zip"
      - unzip -o terraform.zip
      - cd -
  build:
    commands:
      - echo build
      - make format
      - make lint
      - make test
      - env
      - git clone -b $REFERENCE_NAME codecommit::$REPO_REGION://$REPOSITORY_NAME
      - dt=$(date '+%d-%m-%Y-%H:%M:%S');
      - echo "$dt" 
      - aws s3 sync . s3://sample-bucket-glueetl/hr-mysql-source1-python-scripts/
      - terraform init
      - terraform fmt -recursive
      - terraform validate
      - terraform apply -auto-approve
  post_build:
    commands:
      - echo post build 
      - echo "terraform fmt & validate apply completed on `date`"
      - echo "Makefile completed on `date`"

将 buildspec.yml 文件上传至 CodeCommit 对应仓库内,新建 CodeBuild 项目并指向该仓库,使用 EventBridge 作为事件触发器监听 CodeCommit 内容变更,并将事件输出至 CodeBuild ,实现一整套 CI/CD 流水线。架构如下所示:

image.png

注意事项

  • 为了实现上述解决方案,您需要注意各 Amazon 服务间的访问权限,所需的IAM角色执行权限是否足够等问题。
  • 本文讨论的方法对于不同配置的 Glue 脚本,无法实现资源新建的完全自动化。需要数据开发团队重新调用对应 Terraform module 并按需重复上述流程。
  • 本文提供的方案仅针对使用 Amazon Code 组件管理代码版本以及发布的场景。对于外部代码管理组件及 CI/CD 工具,本文不做进一步探讨。

总结

本文通过一个具体的案例,展现了数据开发人员通过 Terraform Cloud Workspace 调用远端 IaC 模块(module),结合 EventBridge 驱动的 Amazon CodeCommit 和 Amazon CodeBuild 开发 CI/CD 流水线,自动捕获数据应用脚本内的变更内容并批量创建相应的云上资源。通过对数据应用相关的资源管理与代码变更发布流程的自动化,云运维团队减轻了代码资产新增/变更带来的管理压力 – 他们不再需要关心数据应用中的代码增改带来的额外工作量,而数据开发团队也可以专注于 ETL 脚本的代码开发及运维,不需要担心代码变更对云上资源带来的后续影响。

参考文档

[1] 利用 Amazon Code 组件向 s3自动备份资料

[2] 利用 Input Transformer 定制 EventBridge 的事件信息

本篇作者

image.png

毛元祺

Amazon 专业服务团队数据科学家。负责统计学习、机器学习、数据挖掘以及云上数据平台设计方面的相关咨询服务。服务行业囊括医疗,金融,无人驾驶等,积累了丰富的开发运维经验

image.png

梁宇

Amazon 专业服务团队 DevOps 顾问,主要负责 DevOps 技术实施。尤为热衷云原生服务及其相关技术。在工作之余,他喜欢运动,以及和家人一起旅游。

文章来源:https://dev.amazoncloud.cn/column/article/6309c09ed4155422a4610a46?sc_medium=regulartraffic&amp;sc_campaign=crossplatform&amp;sc_channel=CSDN 

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

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

相关文章

商城-学习整理-高级-商城业务-Sentinel限流熔断降级Sleuth+Zipkin链路追踪(二十二)

目录 一、秒杀系统的架构二、SpringCloud Alibaba-Sentinel简介1、熔断降级限流什么是熔断什么是降级异同&#xff1a;什么是限流 2、Sentinel 简介官方文档&#xff1a;Sentinel 具有以下特征:Sentinel 分为两个部分: 3、Hystrix 与 Sentinel 比较4、整合 FeignSentinel 测试熔…

Qt与电脑管家4

折线图&#xff1a; #ifndef LINE_CHART_H #define LINE_CHART_H#include <QWidget> #include <QPainter> #include "circle.h" class line_chart : public QWidget {Q_OBJECT public:explicit line_chart(QWidget *parent nullptr); protected:void pa…

SecureBridge安全文件下载的组件Crack

SecureBridge安全文件下载的组件Crack SecureBridge包括SSH、SSL和SFTP客户端和服务器组件。它使用SSH或SSL安全传输层协议和加密消息语法来保护任何TCP流量&#xff0c;这些协议为客户端和服务器提供身份验证、强数据加密和数据完整性验证。SecureBridge组件可以与数据访问组件…

汽水问题!!!!

目录 题目要求&#xff1a; 题目分析&#xff1a; 代码演示&#xff1a; ​ 题目要求&#xff1a; ⽔已知1瓶汽⽔1元&#xff0c;2个空瓶可以换⼀瓶汽⽔&#xff0c;输⼊整数n&#xff08;n>0&#xff09;&#xff0c;表⽰n元钱&#xff0c;计算可以多少汽 ⽔&#xff0…

四款源代码扫描工具

一、DMSCA-企业级静态源代码扫描分析服务平台 端玛企业级静态源代码扫描分析服务平台&#xff08;英文简称&#xff1a;DMSCA&#xff09;是一个独特的源代码安全漏洞、质量缺陷和逻辑缺陷扫描分析服务平台。该平台可用于识别、跟踪和修复在源代码中的技术和逻辑上的缺陷&…

【STM32】串口通信乱码(认识系统时钟来源)

使用 stm32f407 与电脑主机进行串口通信时&#xff0c;串口助手打印乱码&#xff0c;主要从以下方面进行排查&#xff1a; 检查传输协议设置是否一致&#xff08;波特率、数据位、停止位、校验位&#xff09;检查MCU外部晶振频率是否和库函数设置的一致 最终发现是外部晶振频…

蓝桥杯上岸每日N题 (闯关)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…

Linux命令200例:telnet用于远程登录的网络协议(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

华为擎云“磨刀”,政企数字化转型“砍柴”

文|智能相对论 作者|李永华 毫无疑问&#xff0c;消费级硬件已进入稳态式红海竞争格局&#xff0c;惨烈厮杀的同时各厂商的市场地位又相对固定。 这意味着机会少的同时困难大。 于是&#xff0c;越来越多终端厂商将着力点之一转向商用市场。 华为就是其中之一。 2023年3月…

常用的软件测试工具清单,建议收藏。

常用的测试工具有10类&#xff1a; 1.测试管理工具 2.接口测试工具 3.性能测试工具 4.C/S自动化工具 5.白盒测试工具 6.代码扫描工具 7.持续集成工具 8.网络测试工具 9.app自动化工具 10.web安全测试工具 1.测试管理工具 1&#xff0c;TestDirector(大而全) 2&…

1. HBase中文学习手册之揭开Hbase的神秘面纱

揭开Hbase的神秘面纱 1.1 欢迎使用 Apache Hbase1.1.1 什么是 Hbase?1.1.2 Hbase的前世今生1.1.3 HBase的技术选型&#xff1f;1.1.3.1 不适合使用 HBase的场景1.1.3.2 适合使用 HBase的场景 1.1.4 HBase的特点1.1.4.1 HBase的优点1.1.4.2 HBase的缺点 1.1.5 HBase设计架构 1.…

Shell 脚本常用命令

Shell 脚本常用命令 一.日志打印1.信息打印效果2.占位符打印效果 二.文件检索1.文件夹查找2.文件名称3.文件内容检索 三.字符串处理1.字符串截取2.字符串长度获取3.字符串判断4.数字判断5.数字运算 四.日期获取五.文件遍历1.遍历获取修改时间和MD52.Find 查找 六.循环重试1.Whi…

解决jmeter导入jmx文件报错方法

有的时候我们导入别人的jmx文件&#xff0c;但是在导入的时候会报错&#xff0c;如下图&#xff1a; 这是缺少jmeter插件jar包所引起的&#xff0c;下载对应jar包放到jmeter安装目录对应的lib/ext下就可以了。可以通过插件管理工具包下载安装&#xff0c;也可以直接下载对应的…

Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

基于开源模型搭建实时人脸识别系统(四):人脸质量

续人脸识别实战之基于开源模型搭建实时人脸识别系统&#xff08;三&#xff09;&#xff1a;人脸关键点、对齐模型概览与模型选型_CodingInCV的博客-CSDN博客 不论对于静态的人脸识别还是动态的人脸识别&#xff0c;我们都会面临一个问题&#xff0c;就是输入的人脸图像的质量可…

用于优化开关性能的集成异质结二极管的4H-SiC沟道MOSFET

标题&#xff1a;4H-SiC Trench MOSFET with Integrated Heterojunction Diode for Optimizing Switching Performance 摘要 本研究提出了一种新型的4H-SiC沟道MOSFET&#xff0c;其在栅槽底部集成了异质结二极管&#xff08;HJD-TMOS&#xff09;&#xff0c;并通过TCAD模拟进…

Eduma主题 - 线上教育WordPress主题/网站

Eduma主题 – 线上教育WordPress主题是为教育网站、LMS、培训中心、课程中心、学院、大学、学校、幼儿园而制作的。基于我们使用以前的主题eLearning WP构建WordPress LMS的经验&#xff0c;Education WP是下一代&#xff0c;也是围绕WordPress最好的教育主题之一&#xff0c;它…

qemu - 运行树莓派

文章目录 安装 qemu下载树莓派内核使用 qemu 启动树莓派 查看 Mac 配置 uname -a我是 x86 架构&#xff0c;返回如下&#xff1a; $ uname -a Darwin S-iMac.local 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:51:50 PDT 2023; root:xnu-8796.121.2~5/RELEASE_X86_6…

基于Java SpringBoot+vue+html 的地方美食系统(2.0版本)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,csdn、博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统流程的分析3.1 用户管理的流程3.2个人中心管理流程3.3登录流程 4系统设计…

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…