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

0
0
{"value":"#### **背景信息**\n\n企业客户在云上部署的一系列数据应用的过程中,数据开发团队往往负责脚本内容,而其背后一系列云上资源的管理通常由一支云运维职能团队通过 IaC(Infrastructre as Code)实现。然而,当数据开发团队开发及部署相应脚本内容时,不可避免会涉及到云上资源的变动,如 Glue、Lambda 的资源增改等。这就造成了两个团队在职能边界上的紧耦合:数据开发团队的迭代内容都需要提报需求至云运维团队进行相应 IaC 的运维,双方都增加了工作量。\n\n#### **优化方案概述**\n\n为了减轻数据应用代码增改给双方带来的额外压力,本文通过一个案例入手,优化数据应用增改及部署过程中的关键流程:数据开发团队通过接口化的形式调用相应 Terraform module,配合 Amazon CodePipeline 或 EventBridge 驱动的事件模式来实现 CI/CD 流水线。\n\n此案例中,云运维团队负责IaC模块的部署和运维,使用 Terraform Cloud Workspace 进行 IaC 代码发布与管理。数据开发团队负责针对具体的 ETL 任务场景开发 Glue 脚本,使用 CodeCommit 进行代码管理,使用 CodeBuild 实现 CI/CD 内容,最后通过 CodePipeline 或 EventBridge 实现 CI/CD 流水线的串联。两支团队配合实现以下场景:\n\n“某企业hr部门需要将某数据源摄取至 MySQL 中供下游数据应用使用。在数据工程师完成 Glue 脚本开发后,使用云运维团队开发的 Glue 模版批量新建 Glue 脚本(Python shell模版)资源。在后续数据工程师新建或修改Glue脚本时,这一套流水线能自动捕获 CodeCommit 中的变更内容,并同步内容至 s3。s3 的变更将会直接反应至 Terraform 中触发新建/更新资源的功能,不需要 IaC 开发/云运维团队的介入。”\n\n下文的优化方案将会清晰定义云运维团队和数据开发团队在开发、维护云上数据应用时的责任边界。\n\n#### **实施步骤**\n\n##### (1) 统一流程与规范\n\n数据开发团队与云运维团队间确认关键流程及步骤,包括 CI/CD 流水线如何实现,Glue 脚本的上传方式和存储位置,资源所需的配置信息(如实例类型,所需的 IAM 权限,网络)等。\n\n##### (2) Terraform 脚本开发\n\n云运维团队负责 Glue 资源的 IaC 脚本开发,内容包括:配置参数,新增/变更资源的代码。开发好的内容会统一放置在 glue-etl 目录下。此目录中内容示例如下:\n\n```\\n|____glue-etl\\n| |____output.tf\\n| |____data.tf\\n| |____main.tf\\n| |____Readme.md\\n| |____policy.tf\\n| |____variables.tf\\n```\n\n云运维团队对 glue-etl 模块进行封装( module )以及发布至Terraform Cloud 相应的 Workspace 内。\n\n上述 glue-etl 模块中包含以下内容:\n\n- tf中包含了此 module 输出的一系列参数。\n- tf包含了对 Amazon 环境中已有的一些资源的引用,如:当前所在区域,当前用户信息,Glue 脚本所需要访问的数据库所在的 Secret Manager密钥串,和部署 Glue 资源所需的子网组等必要信息。\n- tf 中包含了 Glue 执行时所需的IAM角色对应的相关 IAM Policy 集合。\n- tf中包含了需要用户调用此 module 需要传入的一系列配置参数。\n\n由于篇幅问题,上述.tf具体代码内容已略去。\n\n**(3) 监听s3内容变更**\n\n在云运维团队完成 glue-etl module 的开发与上传至 Terraform Workspace 后,数据开发团队需要初始化一份 .tf 文件,使用 local 关键词将脚本上传路径(如下方代码块中的变量 bucket_name, job_path_prefix和line_of_business中)添加到 .tf 文件中。\n\n```\\nlocals {\\n bucket_name = \\"sample-bucket-glueetl\\"\\n job_path_prefix = toset([\\"hr-mysql-source1-python-scripts\\"])\\n line_of_business = \\"hr-department\\"\\n}\\n```\n\n第二步,通过 Terraform 提供的 data.aws_s3_bucket_objects 获取 Glue 脚本在 s3 上的存放路径。\n\n```\\ndata \\"aws_s3_bucket_objects\\" \\"glue_job_objects_for_people_mdm_staging\\" {\\n for_each = local.job_path_prefix\\n bucket = local.bucket_name\\n prefix = \\"\${local.line_of_business}/\${each.key}\\"\\n}\\n```\n\n下一步,配置 Glue module 所需的输入参数。以下示例中展现了如何通过字符串操作将 Glue 作业名与上传的脚本名进行对应(映射规则可以自定,本例中以 .py 文件前缀作为 Glue 作业名,见 Figure 8),并放入 \n job-name-map 的 local 变量中。在实际应用中,您有可能需要配置不止一个 local 变量作为 module 的输入参数。\n\n```\\nlocals {\\n job_name_map = { \\nfor job_prefix in \\n[for job_name in \\n[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]\\n] : split(\\".\\", job_name)[0]\\n] : job_prefix => \\"\${job_prefix}.py\\" if job_prefix != \\"\\" }\\n}\\n```\n\n最后,通过调用在 Terraform Cloud Workspace 中的 module(此例中为 glue-etl )批量创建某一规格下的 Glue Python shell 脚本。\n\n```\\nmodule \\"glue-etl-type1\\" {\\n source = \\"app.terraform.io/repo/glue-etl/aws\\"\\n subnet_list = [\\"subnet-1\\",\\"subnet-2\\",\\"subnet-3\\"]\\n bucket_name = local.bucket_name\\n line_of_business = local.line_of_business\\n secret_manager_id = \\"some-secretmanager-id\\"\\n if_connection = true\\n conn_name = local.connection_name_staging\\n glue_job_name_list_for_python = local.job_name_map\\n max_concurrent_runs_for_python = 4\\n max_retries_for_python = 0\\n}\\n```\n\n**(4) 实现 CodeBuild 驱动的 CI/CD 流水线**\n\n本文使用 EventBridge 来串联 CodeCommit 与 CodeBuild,您也可以根据使用习惯选择 Amazon CodePipeline 实现同样的功能。在开始之前,请您务必确保相应的 Amazon CodeCommit与 CodeBuild 已经被初始化。\n\n设置 CodeCommit 仓库增、改事件触发的 EventBridge 规则,如下所示。\n\n```\\n{\\n \\"source\\": [\\n \\"aws.codecommit\\"\\n ],\\n \\"detail-type\\": [\\n \\"CodeCommit Repository State Change\\"\\n ],\\n \\"detail\\": {\\n \\"event\\": [\\n \\"referenceCreated\\",\\n \\"referenceUpdated\\"\\n ]\\n }\\n}\\n```\n\n为此规则配置 Input Transformer,分别定义输入路径及输入模版,如下所示:\n\n```\\n{\\"referenceType\\":\\"\$.detail.referenceType\\",\\"region\\":\\"\$.region\\",\\"repositoryName\\":\\"\$.detail.repositoryName\\",\\"account\\":\\"\$.account\\",\\"referenceName\\":\\"\$.detail.referenceName\\"}\\n\\n{\\"environmentVariablesOverride\\": [\\n {\\n \\"name\\": \\"REFERENCE_NAME\\",\\n \\"value\\": <referenceName>\\n },\\n {\\n \\"name\\": \\"REFERENCE_TYPE\\",\\n \\"value\\": <referenceType>\\n },\\n {\\n \\"name\\": \\"REPOSITORY_NAME\\",\\n \\"value\\": <repositoryName>\\n },\\n {\\n \\"name\\": \\"REPO_REGION\\",\\n \\"value\\": <region>\\n },\\n {\\n \\"name\\": \\"ACCOUNT_ID\\",\\n \\"value\\": <account>\\n }\\n ]}\\n```\n\n配置 buildspec.yml,体现 CI/CD 流水线具体流程。本例中,流水线内容包括:\n\n- 安装 git-remote-codecommit 以及其他代码中所需的 Python 依赖包(本例中使用 Makefile 安装依赖)或命令(如本例中的 Terraform )\n- 实现对 ETL 脚本或.tf文件代码的 CI 过程,如代码质量检查,语法检查,安全漏洞扫描,Unit Test等\n- 当 CI 过程结束后,同步 CodeCommit 中更新的代码至存放 Glue 内容的 s3 路径中。当 s3 收到更新代码后,进行以下操作:\n- Terraform 的语法检查( terraform fmt, validate & lint )\n- 资源变更检查( terraform plan )\n- 最终发布( terraform apply )\n\n```\\nAWS CodeBuildversion: 0.2\\n\\nenv:\\n variables:\\n TF_VERSION: \\"1.0.6\\"\\n \\nphases:\\n install:\\n runtime-versions:\\n python: 3.8\\n commands:\\n - pip install git-remote-codecommit\\n - make install\\n pre_build:\\n commands:\\n - echo Hello pre build\\n - cd /usr/bin\\n - \\"curl -s -qL -o terraform.zip https://releases.hashicorp.com/terraform/\${TF_VERSION}/terraform_\${TF_VERSION}_linux_amd64.zip\\"\\n - unzip -o terraform.zip\\n - cd -\\n build:\\n commands:\\n - echo build\\n - make format\\n - make lint\\n - make test\\n - env\\n - git clone -b \$REFERENCE_NAME codecommit::\$REPO_REGION://\$REPOSITORY_NAME\\n - dt=\$(date '+%d-%m-%Y-%H:%M:%S');\\n - echo \\"\$dt\\" \\n - aws s3 sync . s3://sample-bucket-glueetl/hr-mysql-source1-python-scripts/\\n - terraform init\\n - terraform fmt -recursive\\n - terraform validate\\n - terraform apply -auto-approve\\n post_build:\\n commands:\\n - echo post build \\n - echo \\"terraform fmt & validate apply completed on `date`\\"\\n - echo \\"Makefile completed on `date`\\"\\n```\n\n将 buildspec.yml 文件上传至 CodeCommit 对应仓库内,新建 \n CodeBuild 项目并指向该仓库,使用 EventBridge 作为事件触发器监听 CodeCommit 内容变更,并将事件输出至 CodeBuild ,实现一整套 CI/CD 流水线。架构如下所示:\n\n![image.png](https://dev-media.amazoncloud.cn/691635a71a8d4a61b3181a904a7d6d10_image.png)\n\n#### **注意事项**\n\n- 为了实现上述解决方案,您需要注意各 Amazon 服务间的访问权限,所需的IAM角色执行权限是否足够等问题。\n- 本文讨论的方法对于不同配置的 Glue 脚本,无法实现资源新建的完全自动化。需要数据开发团队重新调用对应 Terraform module 并按需重复上述流程。\n- 本文提供的方案仅针对使用 Amazon Code 组件管理代码版本以及发布的场景。对于外部代码管理组件及 CI/CD 工具,本文不做进一步探讨。\n\n#### **总结**\n\n本文通过一个具体的案例,展现了数据开发人员通过 Terraform Cloud Workspace 调用远端 IaC 模块(module),结合 EventBridge 驱动的 Amazon CodeCommit 和 Amazon CodeBuild 开发 CI/CD 流水线,自动捕获数据应用脚本内的变更内容并批量创建相应的云上资源。通过对数据应用相关的资源管理与代码变更发布流程的自动化,云运维团队减轻了代码资产新增/变更带来的管理压力 – 他们不再需要关心数据应用中的代码增改带来的额外工作量,而数据开发团队也可以专注于 ETL 脚本的代码开发及运维,不需要担心代码变更对云上资源带来的后续影响。\n\n#### **参考文档**\n\n[1] [利用 Amazon Code 组件向 s3自动备份资料](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/automate-event-driven-backups-from-codecommit-to-amazon-s3-using-codebuild-and-cloudwatch-events.html)\n\n[2] [利用 Input Transformer 定制 EventBridge 的事件信息](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatch-Events-Input-Transformer-Tutorial.html)\n\n#### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/b14558789cc6444bacbc52a4eaa48a75_image.png)\n\n#### **毛元祺**\n\nAmazon 专业服务团队数据科学家。负责统计学习、[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)、数据挖掘以及云上数据平台设计方面的相关咨询服务。服务行业囊括医疗,金融,无人驾驶等,积累了丰富的开发运维经验\n\n![image.png](https://dev-media.amazoncloud.cn/08201fec07b44aa694c90750a8f42362_image.png)\n\n#### **梁宇**\n\nAmazon 专业服务团队 DevOps 顾问,主要负责 DevOps 技术实施。尤为热衷云原生服务及其相关技术。在工作之余,他喜欢运动,以及和家人一起旅游。","render":"<h4><a id=\\"_0\\"></a><strong>背景信息</strong></h4>\\n<p>企业客户在云上部署的一系列数据应用的过程中,数据开发团队往往负责脚本内容,而其背后一系列云上资源的管理通常由一支云运维职能团队通过 IaC(Infrastructre as Code)实现。然而,当数据开发团队开发及部署相应脚本内容时,不可避免会涉及到云上资源的变动,如 Glue、Lambda 的资源增改等。这就造成了两个团队在职能边界上的紧耦合:数据开发团队的迭代内容都需要提报需求至云运维团队进行相应 IaC 的运维,双方都增加了工作量。</p>\n<h4><a id=\\"_4\\"></a><strong>优化方案概述</strong></h4>\\n<p>为了减轻数据应用代码增改给双方带来的额外压力,本文通过一个案例入手,优化数据应用增改及部署过程中的关键流程:数据开发团队通过接口化的形式调用相应 Terraform module,配合 Amazon CodePipeline 或 EventBridge 驱动的事件模式来实现 CI/CD 流水线。</p>\n<p>此案例中,云运维团队负责IaC模块的部署和运维,使用 Terraform Cloud Workspace 进行 IaC 代码发布与管理。数据开发团队负责针对具体的 ETL 任务场景开发 Glue 脚本,使用 CodeCommit 进行代码管理,使用 CodeBuild 实现 CI/CD 内容,最后通过 CodePipeline 或 EventBridge 实现 CI/CD 流水线的串联。两支团队配合实现以下场景:</p>\n<p>“某企业hr部门需要将某数据源摄取至 MySQL 中供下游数据应用使用。在数据工程师完成 Glue 脚本开发后,使用云运维团队开发的 Glue 模版批量新建 Glue 脚本(Python shell模版)资源。在后续数据工程师新建或修改Glue脚本时,这一套流水线能自动捕获 CodeCommit 中的变更内容,并同步内容至 s3。s3 的变更将会直接反应至 Terraform 中触发新建/更新资源的功能,不需要 IaC 开发/云运维团队的介入。”</p>\n<p>下文的优化方案将会清晰定义云运维团队和数据开发团队在开发、维护云上数据应用时的责任边界。</p>\n<h4><a id=\\"_14\\"></a><strong>实施步骤</strong></h4>\\n<h5><a id=\\"1__16\\"></a>(1) 统一流程与规范</h5>\\n<p>数据开发团队与云运维团队间确认关键流程及步骤,包括 CI/CD 流水线如何实现,Glue 脚本的上传方式和存储位置,资源所需的配置信息(如实例类型,所需的 IAM 权限,网络)等。</p>\n<h5><a id=\\"2_Terraform__20\\"></a>(2) Terraform 脚本开发</h5>\\n<p>云运维团队负责 Glue 资源的 IaC 脚本开发,内容包括:配置参数,新增/变更资源的代码。开发好的内容会统一放置在 glue-etl 目录下。此目录中内容示例如下:</p>\n<pre><code class=\\"lang-\\">|____glue-etl\\n| |____output.tf\\n| |____data.tf\\n| |____main.tf\\n| |____Readme.md\\n| |____policy.tf\\n| |____variables.tf\\n</code></pre>\\n<p>云运维团队对 glue-etl 模块进行封装( module )以及发布至Terraform Cloud 相应的 Workspace 内。</p>\n<p>上述 glue-etl 模块中包含以下内容:</p>\n<ul>\\n<li>tf中包含了此 module 输出的一系列参数。</li>\n<li>tf包含了对 Amazon 环境中已有的一些资源的引用,如:当前所在区域,当前用户信息,Glue 脚本所需要访问的数据库所在的 Secret Manager密钥串,和部署 Glue 资源所需的子网组等必要信息。</li>\n<li>tf 中包含了 Glue 执行时所需的IAM角色对应的相关 IAM Policy 集合。</li>\n<li>tf中包含了需要用户调用此 module 需要传入的一系列配置参数。</li>\n</ul>\\n<p>由于篇幅问题,上述.tf具体代码内容已略去。</p>\n<p><strong>(3) 监听s3内容变更</strong></p>\\n<p>在云运维团队完成 glue-etl module 的开发与上传至 Terraform Workspace 后,数据开发团队需要初始化一份 .tf 文件,使用 local 关键词将脚本上传路径(如下方代码块中的变量 bucket_name, job_path_prefix和line_of_business中)添加到 .tf 文件中。</p>\n<pre><code class=\\"lang-\\">locals {\\n bucket_name = &quot;sample-bucket-glueetl&quot;\\n job_path_prefix = toset([&quot;hr-mysql-source1-python-scripts&quot;])\\n line_of_business = &quot;hr-department&quot;\\n}\\n</code></pre>\\n<p>第二步,通过 Terraform 提供的 data.aws_s3_bucket_objects 获取 Glue 脚本在 s3 上的存放路径。</p>\n<pre><code class=\\"lang-\\">data &quot;aws_s3_bucket_objects&quot; &quot;glue_job_objects_for_people_mdm_staging&quot; {\\n for_each = local.job_path_prefix\\n bucket = local.bucket_name\\n prefix = &quot;\${local.line_of_business}/\${each.key}&quot;\\n}\\n</code></pre>\\n<p>下一步,配置 Glue module 所需的输入参数。以下示例中展现了如何通过字符串操作将 Glue 作业名与上传的脚本名进行对应(映射规则可以自定,本例中以 .py 文件前缀作为 Glue 作业名,见 Figure 8),并放入<br />\\njob-name-map 的 local 变量中。在实际应用中,您有可能需要配置不止一个 local 变量作为 module 的输入参数。</p>\n<pre><code class=\\"lang-\\">locals {\\n job_name_map = { \\nfor job_prefix in \\n[for job_name in \\n[for py_name in data.aws_s3_bucket_objects.glue_job_objects_for_people_mdm_staging[&quot;hr-mysql-source1-python-scripts&quot;].keys : split(&quot;/&quot;, py_name)[2]\\n] : split(&quot;.&quot;, job_name)[0]\\n] : job_prefix =&gt; &quot;\${job_prefix}.py&quot; if job_prefix != &quot;&quot; }\\n}\\n</code></pre>\\n<p>最后,通过调用在 Terraform Cloud Workspace 中的 module(此例中为 glue-etl )批量创建某一规格下的 Glue Python shell 脚本。</p>\n<pre><code class=\\"lang-\\">module &quot;glue-etl-type1&quot; {\\n source = &quot;app.terraform.io/repo/glue-etl/aws&quot;\\n subnet_list = [&quot;subnet-1&quot;,&quot;subnet-2&quot;,&quot;subnet-3&quot;]\\n bucket_name = local.bucket_name\\n line_of_business = local.line_of_business\\n secret_manager_id = &quot;some-secretmanager-id&quot;\\n if_connection = true\\n conn_name = local.connection_name_staging\\n glue_job_name_list_for_python = local.job_name_map\\n max_concurrent_runs_for_python = 4\\n max_retries_for_python = 0\\n}\\n</code></pre>\\n<p><strong>(4) 实现 CodeBuild 驱动的 CI/CD 流水线</strong></p>\\n<p>本文使用 EventBridge 来串联 CodeCommit 与 CodeBuild,您也可以根据使用习惯选择 Amazon CodePipeline 实现同样的功能。在开始之前,请您务必确保相应的 Amazon CodeCommit与 CodeBuild 已经被初始化。</p>\n<p>设置 CodeCommit 仓库增、改事件触发的 EventBridge 规则,如下所示。</p>\n<pre><code class=\\"lang-\\">{\\n &quot;source&quot;: [\\n &quot;aws.codecommit&quot;\\n ],\\n &quot;detail-type&quot;: [\\n &quot;CodeCommit Repository State Change&quot;\\n ],\\n &quot;detail&quot;: {\\n &quot;event&quot;: [\\n &quot;referenceCreated&quot;,\\n &quot;referenceUpdated&quot;\\n ]\\n }\\n}\\n</code></pre>\\n<p>为此规则配置 Input Transformer,分别定义输入路径及输入模版,如下所示:</p>\n<pre><code class=\\"lang-\\">{&quot;referenceType&quot;:&quot;\$.detail.referenceType&quot;,&quot;region&quot;:&quot;\$.region&quot;,&quot;repositoryName&quot;:&quot;\$.detail.repositoryName&quot;,&quot;account&quot;:&quot;\$.account&quot;,&quot;referenceName&quot;:&quot;\$.detail.referenceName&quot;}\\n\\n{&quot;environmentVariablesOverride&quot;: [\\n {\\n &quot;name&quot;: &quot;REFERENCE_NAME&quot;,\\n &quot;value&quot;: &lt;referenceName&gt;\\n },\\n {\\n &quot;name&quot;: &quot;REFERENCE_TYPE&quot;,\\n &quot;value&quot;: &lt;referenceType&gt;\\n },\\n {\\n &quot;name&quot;: &quot;REPOSITORY_NAME&quot;,\\n &quot;value&quot;: &lt;repositoryName&gt;\\n },\\n {\\n &quot;name&quot;: &quot;REPO_REGION&quot;,\\n &quot;value&quot;: &lt;region&gt;\\n },\\n {\\n &quot;name&quot;: &quot;ACCOUNT_ID&quot;,\\n &quot;value&quot;: &lt;account&gt;\\n }\\n ]}\\n</code></pre>\\n<p>配置 buildspec.yml,体现 CI/CD 流水线具体流程。本例中,流水线内容包括:</p>\n<ul>\\n<li>安装 git-remote-codecommit 以及其他代码中所需的 Python 依赖包(本例中使用 Makefile 安装依赖)或命令(如本例中的 Terraform )</li>\n<li>实现对 ETL 脚本或.tf文件代码的 CI 过程,如代码质量检查,语法检查,安全漏洞扫描,Unit Test等</li>\n<li>当 CI 过程结束后,同步 CodeCommit 中更新的代码至存放 Glue 内容的 s3 路径中。当 s3 收到更新代码后,进行以下操作:</li>\n<li>Terraform 的语法检查( terraform fmt, validate &amp; lint )</li>\n<li>资源变更检查( terraform plan )</li>\n<li>最终发布( terraform apply )</li>\n</ul>\\n<pre><code class=\\"lang-\\">AWS CodeBuildversion: 0.2\\n\\nenv:\\n variables:\\n TF_VERSION: &quot;1.0.6&quot;\\n \\nphases:\\n install:\\n runtime-versions:\\n python: 3.8\\n commands:\\n - pip install git-remote-codecommit\\n - make install\\n pre_build:\\n commands:\\n - echo Hello pre build\\n - cd /usr/bin\\n - &quot;curl -s -qL -o terraform.zip https://releases.hashicorp.com/terraform/\${TF_VERSION}/terraform_\${TF_VERSION}_linux_amd64.zip&quot;\\n - unzip -o terraform.zip\\n - cd -\\n build:\\n commands:\\n - echo build\\n - make format\\n - make lint\\n - make test\\n - env\\n - git clone -b \$REFERENCE_NAME codecommit::\$REPO_REGION://\$REPOSITORY_NAME\\n - dt=\$(date '+%d-%m-%Y-%H:%M:%S');\\n - echo &quot;\$dt&quot; \\n - aws s3 sync . s3://sample-bucket-glueetl/hr-mysql-source1-python-scripts/\\n - terraform init\\n - terraform fmt -recursive\\n - terraform validate\\n - terraform apply -auto-approve\\n post_build:\\n commands:\\n - echo post build \\n - echo &quot;terraform fmt &amp; validate apply completed on `date`&quot;\\n - echo &quot;Makefile completed on `date`&quot;\\n</code></pre>\\n<p>将 buildspec.yml 文件上传至 CodeCommit 对应仓库内,新建<br />\\nCodeBuild 项目并指向该仓库,使用 EventBridge 作为事件触发器监听 CodeCommit 内容变更,并将事件输出至 CodeBuild ,实现一整套 CI/CD 流水线。架构如下所示:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/691635a71a8d4a61b3181a904a7d6d10_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_207\\"></a><strong>注意事项</strong></h4>\\n<ul>\\n<li>为了实现上述解决方案,您需要注意各 Amazon 服务间的访问权限,所需的IAM角色执行权限是否足够等问题。</li>\n<li>本文讨论的方法对于不同配置的 Glue 脚本,无法实现资源新建的完全自动化。需要数据开发团队重新调用对应 Terraform module 并按需重复上述流程。</li>\n<li>本文提供的方案仅针对使用 Amazon Code 组件管理代码版本以及发布的场景。对于外部代码管理组件及 CI/CD 工具,本文不做进一步探讨。</li>\n</ul>\\n<h4><a id=\\"_213\\"></a><strong>总结</strong></h4>\\n<p>本文通过一个具体的案例,展现了数据开发人员通过 Terraform Cloud Workspace 调用远端 IaC 模块(module),结合 EventBridge 驱动的 Amazon CodeCommit 和 Amazon CodeBuild 开发 CI/CD 流水线,自动捕获数据应用脚本内的变更内容并批量创建相应的云上资源。通过对数据应用相关的资源管理与代码变更发布流程的自动化,云运维团队减轻了代码资产新增/变更带来的管理压力 – 他们不再需要关心数据应用中的代码增改带来的额外工作量,而数据开发团队也可以专注于 ETL 脚本的代码开发及运维,不需要担心代码变更对云上资源带来的后续影响。</p>\n<h4><a id=\\"_217\\"></a><strong>参考文档</strong></h4>\\n<p>[1] <a href=\\"https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/automate-event-driven-backups-from-codecommit-to-amazon-s3-using-codebuild-and-cloudwatch-events.html\\" target=\\"_blank\\">利用 Amazon Code 组件向 s3自动备份资料</a></p>\\n<p>[2] <a href=\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatch-Events-Input-Transformer-Tutorial.html\\" target=\\"_blank\\">利用 Input Transformer 定制 EventBridge 的事件信息</a></p>\\n<h4><a id=\\"_223\\"></a><strong>本篇作者</strong></h4>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/b14558789cc6444bacbc52a4eaa48a75_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_227\\"></a><strong>毛元祺</strong></h4>\\n<p>Amazon 专业服务团队数据科学家。负责统计学习、机器学习、数据挖掘以及云上数据平台设计方面的相关咨询服务。服务行业囊括医疗,金融,无人驾驶等,积累了丰富的开发运维经验</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/08201fec07b44aa694c90750a8f42362_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_233\\"></a><strong>梁宇</strong></h4>\\n<p>Amazon 专业服务团队 DevOps 顾问,主要负责 DevOps 技术实施。尤为热衷云原生服务及其相关技术。在工作之余,他喜欢运动,以及和家人一起旅游。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭