使用AWS Batch运行Python脚本(保姆级教程)
1.前言
最近工作上需要让我使用AWS batch来实现一些定时任务,基本没怎么使用过这个服务的我直接就懵了,研究了一下,发现AWS batch其实就是启动一个Docker容器来执行你的的任务。经常玩Docker的我瞬间感觉好了起来,看来还能吼得住,参考官方文档和搜索的各种教程,最后有了这篇使用指南的教程,我会详细记录从如何 搭建环境,构建一个容器,最后在AWS batch上跑一个简单的Python脚本。
设置方面因为我自己也还没有完全摸透,可能有不严谨的地方还请见谅。
2.什么是AWS Batch?
AWS Batch是亚马逊网络服务(AWS)的一项计算服务,用于帮助您高效地批量处理大规模的计算工作负载。以下是AWS Batch的简单总结说明:
- 批处理作业管理:AWS Batch允许您轻松管理和运行批处理作业,这些作业可以是计算密集型、数据处理、图像处理等各种类型的工作负载。
- 资源自动扩展:AWS Batch会自动扩展计算资源,以满足您的作业需求。您无需手动配置或管理服务器,这有助于降低管理成本。
- 作业队列:您可以定义作业队列,将作业提交到队列中,然后AWS Batch将根据队列中的作业来自动分配和管理计算资源。
- 容器化支持:AWS Batch支持容器化工作负载,您可以使用Docker容器来运行作业,从而实现更好的隔离和可移植性。
- 调度和优先级:您可以为作业定义调度规则和优先级,以确保关键作业获得足够的计算资源,并按需执行。
- 监控和日志:AWS Batch提供了监控和日志功能,可让您跟踪作业的执行情况、性能和资源使用情况。
- 可与其他AWS服务集成:AWS Batch可以轻松集成到其他AWS服务中,如Amazon S3、Amazon DynamoDB等,以便在处理作业时使用不同的数据存储和计算资源。
3.目标
这次要实现的目标如下
自动克隆CodeCommit里面写的python脚本执行他,让他每分钟在S3存储桶里面创建一个空的文件一共创建10个
4.步骤拆解
要使用AWS Batch实现上面的任务,配置起来确实有点复杂不如Lambda,但是没有办法,一步一步配置应该是没有问题的。我把需要的步骤大致拆解为一下几步
- [ ] 在CodeCommit准备好运行的代码
- [ ] 搭建Docker环境
- [ ] 构建一个可以运行Python的环境镜像
- [ ] 上传镜像到Elastic Container Service私有库
- [ ] 设置IAM
- [ ] 设置AWS Batch
大概的思维导图是这样的
5.构建容器之前的准备工作
在正式配置我们的容器之前我们先来准备我们需要运行的Python脚本和执行代码
5.1创建代码库
-
访问AWS界面搜索CodeCommit并访问
-
右上角创建存储库
名字随便填,描述随便填
-
直接点击创建即可
5.2添加Python脚本和shell脚本
-
点击添加文件****
-
创建一个test.py的文件并填入一下内容
# -*- coding: utf-8 -*- import boto3 from time import sleep # S3 BUCKET_NAME = "test-bucket-batch-tutu" TARGET_DIR = "batch" FILE_CONTENTS = "" # Timer MAX_ITER = 10 SEC = 60 def PutS3(i): s3 = boto3.resource('s3') bucket = s3.Bucket(BUCKET_NAME) filename = str(i+1) obj = bucket.put_object(ACL='private', Body=FILE_CONTENTS, Key=TARGET_DIR + "/" + filename, ContentType='text/plain') return str(obj) def count(i): print("{}秒経過しました。".format((i+1)*SEC)) if __name__ == '__main__': for i in range(MAX_ITER): sleep(SEC) count(i) PutS3(i)
代码来自https://dev.classmethod.jp/articles/aws-batch-5min-over/#toc-11
-
创建一个名为run.sh的`启动脚本填入以下内容
#!/bin/bash python3 /root/test/batch/test.py
除了还需要准备一台服务器之外准备工作到此为止
6.搭建Docker环境并准备好运行Python环境
服务器请自行准备,我用的是EC2创建了一个Ubuntu22.04系统下进行操作的。
6.1安装Docker
#1.更新系统
sudo apt update && sudo apt upgrade -y
#2.安装Docker
wget -qO- get.docker.com | bash
#3.开机自动启动
systemctl enable docker
6.2拉取Ubuntu的镜像并进入容器
#拉取最新版本Ubuntu
docker pull ubuntu:latest
#查看存在的镜像
docker images
#进入容器内部
docker run -it ubuntu /bin/bash
6.3安装各种依赖
#1.更新系统
sudo apt update && sudo apt upgrade -y
#2.安装python3
apt install python3 -y
#3.验证安装是否成功。输入以下命令:
python3 --version
#4.安装 pip3
apt install python3-pip
#6.安装 awscli
pip install awscli
#6.安装 boto3
pip install boto3
#7.安装 git
apt install -y git
#8.安装 vim
apt install -y vim
6.4创建克隆库并运行代码的脚本
#创建一个工作文件夹
mkdir /root/test
#创建shell脚本并编辑
vim /root/test/clone.sh
#填入如下内容库名需要你自行修改自己的
#!/bin/bash
CODE_REPO=https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/库名
CODE_DIR=/root/test/batch
git clone --config credential.helper='!aws --region ap-northeast-1 codecommit credential-helper $@' --config credential.UseHttpPath=true $CODE_REPO $CODE_DIR
sh /root/test/batch/run.sh
6.6配置容器内AWS CLI环境
aws --version #查看版本
sudo apt -y install awscli #如果没有就执行安装
aws configure #输入后配置下面的信息
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]: JSON
到这里环境就配置好了。每次启动容器运行/root/test/clone.sh这个脚本就可以执行我们写的脚本。
可以试着运行测试一下。理论上那个日本大佬写的脚本是没什么问题的。
最后退出容器
7.构建并上传镜像
来到容器外的本机,我们来制作镜像
7.1制作镜像
#输入
docker ps -a -n=5
#可以看到刚刚编辑过的容器
3181b2be2f8f ubuntu "/bin/bash" 5 hours ago Exited (0) 4 hours ago happy_diffie
#构建一个test-container的镜像
docker commit 3181b2be2f8f test-container
#确认镜像
docker images
#确认镜像可以跑起来
docker run -it test-container /bin/bash
7.2创建储存库
-
来到AWS管理界面访问Amazon ECR >存储库
-
创建存储库
- 填入名称即可,其他都可以默认然后直接创建
7.3上传镜像到存储库
来到服务器输入下面命令
aws ecr get-login --no-include-email --region ap-northeast-1
#会输出docker login -u AWS -p 一大串神秘代码
docker login -u AWS -p <输出的一大串神秘代码> https://你的用户ID.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
#给 Docker 镜像添加标签(tag),并将其推送到 AWS Elastic Container Registry (ECR) 中的特定存储库。
docker tag test-container:latest 你的用户ID.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
#将一个名为 test-repo 的 Docker 镜像推送(上传)到 AWS Elastic Container Registry (ECR) 存储库中的指定标签
docker push 你的用户ID.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
上传后可以确认
到这里大部分准备都差不多了,然后是去设置AWS Batch
8.AWS Batch设置
网页访问AWS Batch
要设置Batch我们大致步骤是
- 设置计算环境
- 设置任务队列
- 设置任务定义
- 设置任务
8.1设置计算环境
-
找到侧边栏计算环境点击创建
名称随便填,服务角色会自动帮我选择。
点击下一步
-
最大CPU我选择了4,根据具体需求选择即可,然后点击下一步
-
网络配置这里你需要选择自己的VPC,子网一定要有关联IGW的子网,不然没网!然后安全组选自己设置好的即可。最后点击下一步
-
最后点击创建环境
8.2设置计算环境
-
名称随便填入其他全部默认
-
点击创建
8.3设置任务定义
-
编排类型选择Fargate
-
常规配置如下
-
Fargate 平台配置如下,记得勾选 分配公共 IP
⚠️注意!!
看到这里的红框没有,我就是在这里卡了很久,一般到这里你会发现你没有执行角色所以我们要先去创建一个执行角色
8.3.1创建执行角色
我们来到AWS管理界面的IAM服务
-
ecsTaskExecutionRole
在 IAM 控制台中检查-
打开 IAM 控制台: https: //console.aws.amazon.com/iam/。
-
在导航窗格中,选择角色。
-
在角色列表中搜索
ecsTaskExecutionRole
. 如果您找不到该角色,请参阅创建执行 IAM 角色。如果您找到该角色,请选择该角色以查看附加的策略。 -
在Permissions选项卡上,验证 AmazonECSTaskExecutionRolePolicy托管策略是否已附加到该角色。如果附加了策略,则您的执行角色已正确配置。如果没有,请按照以下子步骤附加策略。
- 选择添加权限,然后选择附加策略。
- 搜索AmazonECSTaskExecutionRolePolicy。
- 选中AmazonECSTaskExecutionRolePolicy策略左侧的框 ,然后选择 附加策略。
-
选择信任关系。
-
验证信任关系是否包含以下策略。如果信任关系符合以下策略,则角色配置正确。如果信任关系不匹配,请选择编辑信任策略,输入以下内容,然后选择更新策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
这里你会发现信任关系内容不一样必须输入上面的这个策略才可以,AWS真坑啊。
因为我们还要对S3和AWSCodeCommit操作所以这里添加对应的策略。很重要!
-
-
-
回到我们刚刚设置任务定义的界面选择对应的IAM后然后下一步
映像填写 你的用户ID.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
这个链接你可以在你的映像存储库找到
-
命令填写
["sh","/root/test/clone.sh"]
-
环境配置默认即可,也可以自定义然后点击下一步。
-
日志驱动程序选择awslogs后继续下一步即可
-
最后点击创建 作业定义
8.4设置任务配置
最后我们来设置任务了(job)
填入名称和定义好的环境
这里什么都不用改直接下一步
最后点击创建作业即可。
到这里就跑起来了。
成功后显示SUCCEEDED为1
搞定了,我们去看看S3怎么样了。
9.确认
任务跑完我们去查看S3内容
生成了很多空文件,达到我们的目的了成功!
到这里你应该就已经掌握了AWS Batch的使用方法了。
10. 使用Amazon EventBridge定期执行Batch
创建好了Batch我们需要让他在计划好的时间自动执行,就需要使用到Amazon EventBridge
10.1Amazon EventBridge 是什么?
Amazon EventBridge 是亚马逊云服务中的事件总线服务,用于在不同的 AWS 服务和应用程序之间传递事件数据。它提供了一种灵活的方式来连接、路由和处理事件,可以帮助您构建高度可扩展的分布式应用程序、微服务架构和自动化工作流程。
EventBridge 可以将事件从各种 AWS 服务、第三方 SaaS 应用程序、自定义应用程序以及您的应用程序中捕获,然后将这些事件发送到目标,如 AWS Lambda 函数、Amazon SNS 主题、AWS Batch 作业等,以触发进一步的处理。
要与Batch联动我们需要大致如下步骤:
- 创建规则: 在 Amazon EventBridge 控制台中创建一个规则,以定义您希望捕获的事件和将其发送到的目标。您可以选择使用事件模式、规则表达式等来精确匹配事件。
- 指定目标: 在规则中,选择 AWS Batch 作为事件的目标。这样,当规则匹配到事件时,EventBridge 将事件发送到 AWS Batch 队列或作业定义。
- 配置 AWS Batch: 确保您已在 AWS Batch 中设置好所需的队列、作业定义和计算环境,以便能够接受通过 EventBridge 发送的事件。
- 事件触发作业: 当满足规则条件的事件发生时,EventBridge 将触发 AWS Batch 作业。该作业可以执行您定义的计算任务。
可以参考我的配置来自己修改。
10.2设置 AWS EventBridge
-
通过AWS官网搜索AWS EventBridge服务进入,单击创建规则
-
填入名称,规则计划类型选择计划然后选择继续创建规则
-
输入cron表达式因为是UTC时间所以你需要自己转换成你本地的时间,比如我这里填入的cron的意思是每天8点55执行一次,换算成本地时区+8:00 就是每天17:55执行一次。具体的cron表达式的具体信息,你可以参考这里的 Cron 表达式参考
-
选择服务名称,填写必填的内容,ARN可以在我们之前创建的Batch中找到,并选择屏幕截图中所示的选项。EventBridge 将自动为您创建一个角色,该角色将用于通过 EventBridge 执行批处理作业。理论上也可以选择我们之前创建的执行角色。最后点击下一步
-
配置标签 – 可选 直接下一步
-
查看并创建我们确认一下内容点击下一步即可
总结
到此,整个配置大致就结束了。你可以在指定的时间来查看任务是否被执行。
也可以通过可以使用CloudTrail检查触发器,在CloudTrail中找到SubmitJob事件
也可以在Batch界面 使用CloudWatch来审查日志
虽然Batch配置起来真的繁琐,只要配置好了,还是很方便的。
参考的各种教程
感谢提供各种教程的大佬们
https://dev.classmethod.jp/articles/cdk-event-bridge-lambda-batch/
https://zenn.dev/megazone_japan/articles/b2680244e49c43
https://dev.classmethod.jp/articles/aws-batch-5min-over/#toc-11
https://qiita.com/itawn/items/00f6deaf6534980063d1
https://qiita.com/yacchin/items/f9ed4197bc23dfae6f64#aws-batch%E3%81%A8%E3%81%AF
写的非常详细,但是太长了,以后再看。
现在就看
Pingback:如何用IAM角色限制AWS Batch的权限 – Tutu的个人博客