亚马逊AWS官方博客
使用 AWS Batch 与 Amazon CloudWatch 规则调度并运行 Amazon RDS 作业
在传统意义上,数据库管理员与开发人员一般在数据库运行所在的主机之上,使用系统cron实现数据库的脚本化调度。作为托管数据库服务,Amazon关系数据库服务(Amazon Relational Database Service,简称RDS)不再提供指向基础设施的访问通道,因此在将数据库工作负载由本地设施迁移至云端时,您实际需要迁移的就只是这些调度作业。在本文中,我们将共同探讨另一种集中实现作业调度与运行的方法。
AWS Batch是一项托管服务,负责对配置、管理、监控以及扩展计算作业中的复杂性因素进行抽象,保证用户能够轻松高效地在AWS上运行各类作业。此外,AWS Batch还允许大家使用所选语言构建作业,并将作业以Docker容器的形式进行部署。
本文将向大家演示如何将AWS Batch与Amazon CloudWatch规则相结合以动态配置资源,并在PostgreSQL数据库上调度及运行函数或存储过程。大家也完全可以使用相同的过程在任意Amazon RDS数据库上运行作业。
解决方案概述
先决条件
在着手进行之前,请先处理好以下先决条件:
- 在您的设备上安装Docker Desktop。
- 在您的设备上安装git。
- 安装并配置AWS CLI。关于更多详尽说明,请参阅“安装AWS CLI”。
- 在AWS CloudFormation模板中,以参数的形式列出由逗号分隔的默认子网与安全组列表。
演练步骤
在本次演练中,我们需要完成以下操作步骤:
- 从AWS代码示例库中克隆整个项目。
- 部署CloudFormation模板以创建所需服务。
- 前往AWS CloudFormation控制台,并确保资源已成功创建。
- 运行数据库脚本并创建所需的表与函数。
- 构建、标记Docker镜像,并将镜像push至Amazon ECR。
- 通过CloudWatch规则验证AWS Batch是否开始成功运行作业。
本文还将提供一系列可选说明,包括如何通过AWS CodeCommit与AWS CodeBuild管理作业变更及调度。
从AWS示例中克隆源代码
下载必要文件以建立运行环境。相关操作代码如下:
部署CloudFormation模板
要运行CloudFormation脚本,请完成以下步骤:
- 在Amazon VPC控制台上,前往Subnets部分。
- 记录您打算使用的VPC Subnet ID。
- 记录安全组ID,并将其附加至上一步中您已经记录完成的Subnet与VPC,具体如下图截屏所示。
- 在
batchenv-cf.yaml
中,将以逗号分隔的默认Subnets与安全组设置为输入参数。
运行这套CloudFormation模板以配置所需服务,具体操作代码如下:
此模板将创建以下内容:
- Docker 注册表,用于存储Docker镜像。
- 作业定义,用于定义作业的Docker镜像、IAM角色以及资源要求。
- 作业等待队列,直到各项作业准备好在计算环境中运行。
- 计算环境,AWS Batch将在其中管理作业所使用的计算资源。
- PostgreSQL实例。
- AWS Secrets Manager与PostgreSQL数据库登录凭证。
- CloudWatch规则,根据调度规划运行AWS Batch作业。
- 为角色指定适当权限。
以下是各项辅助服务。仅当您选择使用CodeCommit以及CodeBuild管理作业及调度规则中的变更时,才需要涉及这些辅助服务:
- 存储库,用于存储buildspec.yml与src文件夹。
- CodeBuild项目,用于构建、标记Docker镜像并将该镜像push至注册表。
各项服务将使用CloudFormation堆栈名作为前缀创建而成。以下截屏所示,为成功完成CloudFormation部署后的详细信息。
运行数据库脚本
要运行各数据库脚本,我们需要完成以下步骤:
- 在Amazon RDS控制台的Database下,选择Connectivity & Security。
- 记录数据库端点URL与端口,具体如以下截屏所示。
- 在Secrets Manager控制台的Secrets下,选择您的secret。
- 选择Retrieve secret value以检索secret值。
- 记录您的数据库凭证。
- 接入CloudFormation模板配置完成的PostgreSQL数据库。
- 从GitHub处下载SQL脚本
CreateSampleDataAndSP.sql
。运行此脚本,在您的数据库中创建以下对象:
构建、标记Docker镜像,并将镜像push至Amazon ECR
要构建、标记Docker镜像,并将镜像push至Amazon ECR,您需要完成以下操作步骤:
- 在本地设备上,前往容纳已下载源代码的文件夹,具体操作代码如下:
- 打开此文件并变更以下值(具体取决于您在部署CloudFormation模板时选择的不同堆栈名称及区域而定)。具体操作代码如下:
请注意,我们需要对负责连接及运行数据库作业的Python脚本(
src/runjob.py
)进行配置,保证其在US-East-1
区域中查找拥有batchjob
前缀的数据库secret名称。 - 要接入Amazon ECR,请使用以下操作代码:
- 要将Python以及requirements.txt中提到的所有库共同打包为Docker容器形式,请使用以下操作代码:
- 在Amazon ECR控制台的Repositories下,选择您的存储库链接。
- 要获取关于当前环境的特定标记与推送命令,请选择View Push Commands。 以下截屏所示为push命令的使用位置。
- 输入此前第3步中截屏所示的代码,具体可参阅以下示例代码:
- 输入此前第4步中截屏所示的代码,具体可参阅以下示例代码:
- 验证您是否已经成功将Docker镜像从本地设备push至Amazon ECR。 以下截屏所示为Amazon ECR控制台中显示的已成功上传docker镜像。
手动运行AWS Batch作业
要手动运行AWS Batch作业,请完成以下步骤。
- 在AWS Batch控制台中选择Jobs。
- 选择Submit job。
- 在Job name部分,为作业输入一个名称。
- 在Job definition部分,选择作业定义。
- 在Job queue部分,选择作业队列。
- 修改vCPU与内存设置(在本演练中,可直接使用默认设置)。
- 选择Submit job。
- 在Jobs下,选择作业ID链接并查看日志,以确保作业成功完成。 The following screenshot shows the successful completion of the job. 作业成功完成的状态如下图。 根据配置,这里的AWS Batch作业将运行以下函数,并显示出以输入形式(在runjob.py脚本中)提供的部门内员工最高与最低薪酬数值:
您可以使用AWS Batch生成的CloudWatch Logs验证作业。以下截屏所示,为AWS Batch控制台上的作业详细信息。
以下截屏所示,为该作业的CloudWatch Logs。
验证AWS Batch作业是否按计划运行
CloudFormation模板还会创建CloudWatch规则,用于按计划运行该作业。您可以编辑这条规则以变更调度计划。
- 在CloudWatch控制台的Rules下,选择您的规则。
- 在Actions下拉菜单中,选择Edit。
- 根据您的需要调整调度计划。
- 在批量作业队列输入中,选择Use existing role。
- 选择BatchServiceRole。
- 选择Configure details。
- 选择Update rule。
- 在Dashboard页面监控该调度作业。
- 要确认这项作业是否成功,请在Jobs页面中选择succeeded。
资源清理
在AWS Management Console上前往CloudFormation堆栈 batchjob
并将其删除。
或者,也可以在AWS CLI中输入以下代码:
在CodeCommit与CodeBuild中管理作业与调度规则变更
您也可以使用以下步骤管理对Docker镜像的变更,这就免去了手动构建、标记镜像并将其push至ECR的麻烦。
要将代码提交至CodeCommit存储库,请完成以下步骤:
- 在控制台的Developer Tools下,选择CodeCommit。
- 选择Repositories。
- 选择batch-job-codecommit。
- 选择Clone URL。
- 选择Clone HTTPS。
- 克隆
batchjob-codecommit
。详见以下代码: - 将您从AWS示例处下载到的
src
文件夹与buildspec.yml文件复制至您从CodeCommit处克隆获得的存储库内。 其中的src
文件夹容纳着用于连接及运行各项函数的Python代码。根据配置,其中的Python脚本(src/funjob.py)将查找一切以batchjob
为前缀的数据库secrets(例如secret_name = "batchjob-secret
“)。如果您选择了其他不同前缀,则需要修改这部分值。详见以下代码:
以下截屏所示,为成功上传至存储库的代码。
点击Build run以监控该构建任务。
以下截屏所示,为构建作业的日志。
成功完成构建作业后,Docker镜像、Python脚本以及其他库都将被发布至Amazon ECR。
总结
本文演示了如何将多项不同AWS服务集成起来,进而在PostgresSQL数据库上调度及运行作业的方法。您可以使用同样的解决方案在任意RDS数据库上运行作业,或者编排复杂的作业工作流——唯一的区别是,您需要在Docker容器内添加兼容的python适配器,并将其导入python脚本当中。
此外,这套解决方案还可帮助您利用AWS Batch与CloudWatch规则建立起CI/CD工具链,借此管理一切指向作业及调度计划的变更。