背景信息
企业客户在云上部署的一系列数据利用的过程中,数据开发团队往往负责脚本内容,而其背地一系列云上资源的治理通常由一支云运维职能团队通过 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 流水线。架构如下所示:
注意事项
为了实现上述解决方案,您须要留神各 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 的事件信息
本篇作者
毛元祺
Amazon 业余服务团队数据科学家。负责统计学习、机器学习、数据挖掘以及云上数据平台设计方面的相干咨询服务。服务行业囊括医疗,金融,无人驾驶等,积攒了丰盛的开发运维教训
梁宇
Amazon 业余服务团队 DevOps 参谋,次要负责 DevOps 技术施行。尤为热衷云原生服务及其相干技术。在工作之余,他喜爱静止,以及和家人一起游览。
文章起源:https://dev.amazoncloud.cn/column/article/6309c09ed4155422a46…