亚马逊AWS官方博客

使用 AWS Batch 与 Amazon CloudWatch 规则调度并运行 Amazon RDS 作业

Original URL: https://aws.amazon.com/cn/blogs/database/scheduling-and-running-amazon-rds-jobs-with-aws-batch-and-amazon-cloudwatch-rules/

 

在传统意义上,数据库管理员与开发人员一般在数据库运行所在的主机之上,使用系统cron实现数据库的脚本化调度。作为托管数据库服务,Amazon关系数据库服务(Amazon Relational Database Service,简称RDS)不再提供指向基础设施的访问通道,因此在将数据库工作负载由本地设施迁移至云端时,您实际需要迁移的就只是这些调度作业。在本文中,我们将共同探讨另一种集中实现作业调度与运行的方法。

AWS Batch是一项托管服务,负责对配置、管理、监控以及扩展计算作业中的复杂性因素进行抽象,保证用户能够轻松高效地在AWS上运行各类作业。此外,AWS Batch还允许大家使用所选语言构建作业,并将作业以Docker容器的形式进行部署。

本文将向大家演示如何将AWS Batch与Amazon CloudWatch规则相结合以动态配置资源,并在PostgreSQL数据库上调度及运行函数或存储过程。大家也完全可以使用相同的过程在任意Amazon RDS数据库上运行作业。

解决方案概述

该解决方案的基本架构如下图所示。

先决条件

在着手进行之前,请先处理好以下先决条件:

演练步骤

在本次演练中,我们需要完成以下操作步骤:

  1. 从AWS代码示例库中克隆整个项目。
  2. 部署CloudFormation模板以创建所需服务。
  3. 前往AWS CloudFormation控制台,并确保资源已成功创建。
  4. 运行数据库脚本并创建所需的表与函数。
  5. 构建、标记Docker镜像,并将镜像push至Amazon ECR
  6. 通过CloudWatch规则验证AWS Batch是否开始成功运行作业。

本文还将提供一系列可选说明,包括如何通过AWS CodeCommitAWS CodeBuild管理作业变更及调度。

从AWS示例中克隆源代码

下载必要文件以建立运行环境。相关操作代码如下:

$ git clone https://github.com/aws-samples/aws-batch-rds-job-scheduling

$ cd aws-batch-rds-job-scheduling

部署CloudFormation模板

要运行CloudFormation脚本,请完成以下步骤:

  1. 在Amazon VPC控制台上,前往Subnets部分。
  2. 记录您打算使用的VPC Subnet ID。
  3. 记录安全组ID,并将其附加至上一步中您已经记录完成的Subnet与VPC,具体如下图截屏所示。
  4. batchenv-cf.yaml中,将以逗号分隔的默认Subnets与安全组设置为输入参数。

运行这套CloudFormation模板以配置所需服务,具体操作代码如下:

$ aws cloudformation create-stack --stack-name batchjob --template-body file://batchenv-cf.yaml --capabilities CAPABILITY_NAMED_IAM --region us-east-1
{
"StackId": "arn:aws:cloudformation:us-east-1:XXXXXXXXXXXXXX:stack/batchjob/73448940-63c5-11ea-918d-1208f0f76cbf"
}

此模板将创建以下内容:

  • Docker 注册表,用于存储Docker镜像。
  • 作业定义,用于定义作业的Docker镜像、IAM角色以及资源要求。
  • 作业等待队列,直到各项作业准备好在计算环境中运行。
  • 计算环境,AWS Batch将在其中管理作业所使用的计算资源。
  • PostgreSQL实例。
  • AWS Secrets Manager与PostgreSQL数据库登录凭证。
  • CloudWatch规则,根据调度规划运行AWS Batch作业。
  • 为角色指定适当权限。

以下是各项辅助服务。仅当您选择使用CodeCommit以及CodeBuild管理作业及调度规则中的变更时,才需要涉及这些辅助服务:

  • 存储库,用于存储buildspec.yml与src文件夹。
  • CodeBuild项目,用于构建、标记Docker镜像并将该镜像push至注册表。

各项服务将使用CloudFormation堆栈名作为前缀创建而成。以下截屏所示,为成功完成CloudFormation部署后的详细信息。

运行数据库脚本

要运行各数据库脚本,我们需要完成以下步骤:

  1. 在Amazon RDS控制台的Database下,选择Connectivity & Security。
  2. 记录数据库端点URL与端口,具体如以下截屏所示。
  3. 在Secrets Manager控制台的Secrets下,选择您的secret。
  4. 选择Retrieve secret value以检索secret值。
  5. 记录您的数据库凭证。
  6. 接入CloudFormation模板配置完成的PostgreSQL数据库。
  7. GitHub处下载SQL脚本CreateSampleDataAndSP.sql。运行此脚本,在您的数据库中创建以下对象:
  • DEPT – Table
  • EMP – Table
  • LOW_HIGH_SALARIES – Function

构建、标记Docker镜像,并将镜像push至Amazon ECR

要构建、标记Docker镜像,并将镜像push至Amazon ECR,您需要完成以下操作步骤:

  1. 在本地设备上,前往容纳已下载源代码的文件夹,具体操作代码如下:
    $ cd aws-batch-rds-job-scheduling/src
  2. 打开此文件并变更以下值(具体取决于您在部署CloudFormation模板时选择的不同堆栈名称及区域而定)。具体操作代码如下:
    secret_name = "batchjob-secret"
    region_name = "us-east-1"

    请注意,我们需要对负责连接及运行数据库作业的Python脚本(src/runjob.py)进行配置,保证其在US-East-1区域中查找拥有batchjob前缀的数据库secret名称。

  3. 要接入Amazon ECR,请使用以下操作代码:
    $(aws ecr get-login --region us-east-1 --no-include-email)
  4. 要将Python以及requirements.txt中提到的所有库共同打包为Docker容器形式,请使用以下操作代码:
    $ docker build -t batchjob-ecr .
  5. 在Amazon ECR控制台的Repositories下,选择您的存储库链接。
  6. 要获取关于当前环境的特定标记与推送命令,请选择View Push Commands。 以下截屏所示为push命令的使用位置。
  7. 输入此前第3步中截屏所示的代码,具体可参阅以下示例代码:
    $ docker tag batchjob-ecr:latest 765500136580.dkr.ecr.us-east-1.amazonaws.com/batchjob-ecr:latest
  8. 输入此前第4步中截屏所示的代码,具体可参阅以下示例代码:
    $ docker push 765500136580.dkr.ecr.us-east-1.amazonaws.com/batchjob-ecr:latest
  9. 验证您是否已经成功将Docker镜像从本地设备push至Amazon ECR。 以下截屏所示为Amazon ECR控制台中显示的已成功上传docker镜像。

手动运行AWS Batch作业

要手动运行AWS Batch作业,请完成以下步骤。

  1. 在AWS Batch控制台中选择Jobs。
  2. 选择Submit job。
  3. 在Job name部分,为作业输入一个名称。
  4. 在Job definition部分,选择作业定义。
  5. 在Job queue部分,选择作业队列。
  6. 修改vCPU与内存设置(在本演练中,可直接使用默认设置)。
  7. 选择Submit job。
  8. 在Jobs下,选择作业ID链接并查看日志,以确保作业成功完成。 The following screenshot shows the successful completion of the job. 作业成功完成的状态如下图。 根据配置,这里的AWS Batch作业将运行以下函数,并显示出以输入形式(在runjob.py脚本中)提供的部门内员工最高与最低薪酬数值:
    # Call stored procedure
    cur.callproc('low_high_salaries', (10,))

您可以使用AWS Batch生成的CloudWatch Logs验证作业。以下截屏所示,为AWS Batch控制台上的作业详细信息。

以下截屏所示,为该作业的CloudWatch Logs。

验证AWS Batch作业是否按计划运行

CloudFormation模板还会创建CloudWatch规则,用于按计划运行该作业。您可以编辑这条规则以变更调度计划。

  1. 在CloudWatch控制台的Rules下,选择您的规则。
  2. 在Actions下拉菜单中,选择Edit。
  3. 根据您的需要调整调度计划。
  4. 在批量作业队列输入中,选择Use existing role。
  5. 选择BatchServiceRole。
  6. 选择Configure details。
  7. 选择Update rule。
  8. 在Dashboard页面监控该调度作业。
  9. 要确认这项作业是否成功,请在Jobs页面中选择succeeded。

资源清理

在AWS Management Console上前往CloudFormation堆栈 batchjob并将其删除。

或者,也可以在AWS CLI中输入以下代码:

$ aws cloudformation delete-stack --stack-name batchjob

在CodeCommit与CodeBuild中管理作业与调度规则变更

您也可以使用以下步骤管理对Docker镜像的变更,这就免去了手动构建、标记镜像并将其push至ECR的麻烦。

要将代码提交至CodeCommit存储库,请完成以下步骤:

  1. 在控制台的Developer Tools下,选择CodeCommit。
  2. 选择Repositories
  3. 选择batch-job-codecommit
  4. 选择Clone URL
  5. 选择Clone HTTPS
  6. 克隆batchjob-codecommit 。详见以下代码:
    $ git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/batchjob-codecommit
  7. 将您从AWS示例处下载到的src文件夹与buildspec.yml文件复制至您从CodeCommit处克隆获得的存储库内。 其中的src文件夹容纳着用于连接及运行各项函数的Python代码。根据配置,其中的Python脚本(src/funjob.py)将查找一切以batchjob为前缀的数据库secrets(例如secret_name = "batchjob-secret“)。如果您选择了其他不同前缀,则需要修改这部分值。详见以下代码:
    $ cp -Rf aws-batch-rds-job-scheduling/src ./batchjob-codecommit/.
    $ cp -Rf aws-batch-rds-job-scheduling/buildspec.yml ./batchjob-codecommit/.
    $ cd ./batchjob-codecommit/
    $ git add --all
    $ git commit -m "first commit"
    $ git push origin master

以下截屏所示,为成功上传至存储库的代码。

点击Build run以监控该构建任务。

以下截屏所示,为构建作业的日志。

成功完成构建作业后,Docker镜像、Python脚本以及其他库都将被发布至Amazon ECR。

总结

本文演示了如何将多项不同AWS服务集成起来,进而在PostgresSQL数据库上调度及运行作业的方法。您可以使用同样的解决方案在任意RDS数据库上运行作业,或者编排复杂的作业工作流——唯一的区别是,您需要在Docker容器内添加兼容的python适配器,并将其导入python脚本当中。

此外,这套解决方案还可帮助您利用AWS Batch与CloudWatch规则建立起CI/CD工具链,借此管理一切指向作业及调度计划的变更。

 

本篇作者

Udayasimha Theepireddy (uday)

为Amazon Web Services公司高级云架构师。他与AWS客户联手,为大规模云迁移项目提供指导与技术帮助,引导客户在实施AWS解决方案时获得更高的价值回报。

Vinod Ramasubbu

Amazon Web Services公司云应用程序架构师。他与客户一道在AWS云上实现大规模业务软件的构建、设计与自动化。