使用 AWS Batch 和 AWS Step Functions 将 AWS Batch 与 Step Functions 结合使用以创建视频处理工作流
基于云的视频托管服务会定期对上传到云端的视频进行视频转码和特征提取。视频处理管道往往需要一套复杂的工作流来管理多个并行计算作业并处理异常。
在本教程中,您将创建一套 AWS Step Functions 工作流,用于模拟上传到云端的视频的处理流程。该工作流将通过把作业提交到 Amazon Batch 服务上的多优先级队列来处理视频。
Step Functions 工作流将用于指定提交到 AWS Batch 的依赖项和序列作业。在 AWS Batch 中,用户可以定义计算环境、队列和队列优先级。Step Functions 工作流可用于指定如何在工作流中处理异常。
注意:该工作流不会执行任何实际的处理操作。在本教程中,您可以在 AWS 免费套餐的范围内试用 AWS Step Functions 和 AWS Batch。请务必在配置计算环境时遵循教程建议,并在完成教程后删除所有资源,以免产生额外费用。

关于本教程 | |
时间 | 10 分钟 |
费用 | 免费 |
使用场景 | 无服务器 |
产品 | AWS Batch、AWS Step Functions |
级别 | 100 |
上次更新时间 | 2019 年 10 月 10 日 |
步骤 1:设置
1.1 打开浏览器并前往 AWS Batch 控制台。如果您已经拥有 AWS 账户,请登录该控制台。否则,请创建一个新 AWS 账户以开始学习。
步骤 2:设置 Batch 作业
下一步是设置 AWS Batch 计算环境。该计算环境会指定可用于运行批处理作业的最小、理想和最大 CPU 数量。
步骤 3:设置 AWS Batch 队列
现在,您将创建两个具有不同优先级的 AWS Batch 队列。
步骤 4:设置作业定义
现在,您将创建一系列虚拟作业,系统可将其作为批处理作业的一部分执行。
4.2 点击 Create(创建)。
注意:为了完成本教程,我们将使用一个 Amazon Linux 容器来帮助说明各个工作流步骤。该容器不会执行任何实际工作。为目标使用场景创建批处理环境时,您需要提供一个能够执行所需处理操作的容器。有关更多详细信息,请参阅 AWS Batch 用户指南中的创建作业定义。
步骤 5:使用状态机创建工作流
现在,您将创建一个状态机来控制工作流和调用 AWS Batch。工作流将一个流程描述为一系列可以不断重复执行的离散任务。您将在 AWS Step Functions 中设计工作流。AWS Step Function 会使用状态机来创建工作流。状态机使用 Amazon States Language (ASL) 语言以 JSON 格式进行编码。
5.1 打开 AWS Step Functions 控制台以创建状态机。选择 Author with code snippets(使用代码段编写)。在 Name(名称)文本框中,将您的状态机命名为 StepsBatchTutorial_VideoWorkflow。
5.2 将 State machine definition(状态机定义)窗口中的内容替换为以下基于 Amazon States Language (ASL) 的状态机定义。Amazon States Language 是基于 JSON 的结构化语言,用于定义状态机。
此状态机表示使用批处理执行视频处理的工作流。大多数步骤都是执行 AWS Batch 作业的 Task 状态。Task 状态还可用于调用其他 AWS 服务,例如调用 Lambda 进行无服务器计算,或者调用 SNS 发送扇出到其他服务的消息。
{
"StartAt": "Extract Metadata",
"States": {
"Extract Metadata": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_ExtractMetadata:1",
"JobName": "SplitVideo",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_HighPriorityQueue"
},
"Next": "Process Video"
},
"Process Video": {
"Type": "Parallel",
"End": true,
"Branches": [
{
"StartAt": "Extract Features",
"States": {
"Extract Features": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_ExtractFeatures:1",
"JobName": "ExtractFeatures",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_LowPriorityQueue"
},
"End": true
}
}
},
{
"StartAt": "Transcode Video",
"States": {
"Transcode Video": {
"Type": "Parallel",
"End": true,
"Branches": [
{
"StartAt": "Transcode_4k-1",
"States": {
"Transcode_4k-1": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_4k-1",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_HighPriorityQueue"
},
"Next": "Transcode_4k-2"
},
"Transcode_4k-2": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_4k-2",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_LowPriorityQueue"
},
"End": true
}
}
},
{
"StartAt": "Transcode_1080p-1",
"States": {
"Transcode_1080p-1": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_1080p-1",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_HighPriorityQueue"
},
"Next": "Transcode_1080p-2"
},
"Transcode_1080p-2": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_1080p-2",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_LowPriorityQueue"
},
"End": true
}
}
},
{
"StartAt": "Transcode_720p-1",
"States": {
"Transcode_720p-1": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_720p-1",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_HighPriorityQueue"
},
"Next": "Transcode_720p-2"
},
"Transcode_720p-2": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_720p-2",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_LowPriorityQueue"
},
"End": true
}
}
},
{
"StartAt": "Transcode_480p-1",
"States": {
"Transcode_480p-1": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_480p-1",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_HighPriorityQueue"
},
"Next": "Transcode_480p-2"
},
"Transcode_480p-2": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:REGION:112233445566:job-definition/StepsBatchTutorial_TranscodeVideo:1",
"JobName": "Transcode_480p-2",
"JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_LowPriorityQueue"
},
"End": true
}
}
}
]
}
}
}
]
}
}
}
步骤 6:执行工作流
下一步是执行您已构建的 Step Functions 工作流。您将手动触发开始执行。可以指定以 JSON 格式向 Step Functions 提供输入数据。Step Functions 还可以由 Lambda 函数或 CloudWatch 事件触发。
6.11(可选)对于第二个作业,将 Transcode_4k-1 的 JobDefinition 替换为 arn:aws:batch:us-west-2:134029540168:job-definition/StepsBatchTutorial_TranscodeVideo_DOES_NOT_EXIST:1。
重新执行状态机,并注意以下情况:如果一个并行批处理作业失败,则系统将取消所有其他并行作业。一旦失败,所有批处理作业都会被移出队列。
在状态机中引入故障处理。可以使用 Task 状态的 Retry 字段来多次重试作业。可以引入 Catch 语句来执行错误处理。有关更多信息,请参阅 Amazon States Language 错误处理。
步骤 7:终止资源
在此步骤中,您将终止 AWS Step Functions 和 AWS Batch 相关资源。重要说明:终止当前未使用的资源可降低成本,这是一种最佳做法。如果没有终止资源,系统可能会收取费用。
7.1 首先,您将删除您的 Step 函数。在 AWS 管理控制台菜单中点击 Services(服务),然后选择 Step Functions。
在 State machines(状态机)窗口中,选择状态机 StepsBatchTutorial_VideoWorkflow,然后点击 Delete(删除)。在对话框中选择 Delete state machine(删除状态机),以确认删除操作。一旦 Step Functions 确认任何进程中的执行操作已完成,您的状态机就会在一两分钟内被删除。
恭喜您
现在,您已使用 AWS Step Functions 和 AWS Batch 编排了一个试验视频转码工作流。如果您需要编排复杂的批处理作业以及处理错误和作业失败,那么 Step Functions 非常适合您。
推荐的后续步骤
进一步了解错误处理
您现已学会如何创建与 Batch 集成的状态机,可以继续学习下一个教程,其中您将了解如何处理无服务器应用程序中的错误。Step Functions 能让您轻松处理工作流运行时错误。
阅读文档
通过阅读 AWS Step Functions 开发人员指南,了解 AWS Step Functions 的功能和能力。
探索 AWS Step Functions
如果您想要进一步了解 AWS Step Functions,请访问 AWS Step Functions 产品页面以浏览相关文档、视频、博客等。