使用 AWS Step Functions 启动多个不同的 Fargate 任务

75次阅读
没有评论

问题描述

正在构建一个服务,其中有两个独立的步骤。第一个步骤是数据转换步骤,对所有下游流程都是必需的且相同的,然后第二步是启动几十个独立的并行流程,这些流程使用相同的输入数据,除了一些不同的运行时指定参数。

用户知道可以使用 Step Functions 来触发数据转换步骤,并在启动单个 Fargate 任务之前等待其完成。但是,用户想知道是否可以通过一个共同的 Docker 对象并传递每个运行略有不同的参数值的方式,让 Step Functions 启动几十个(或更多)并行流程。

用户希望使用 Fargate,因为他们是一个小团队,不想花费团队资源来维护计算资源。另外,由于任务的运行时间往往会超过 15 分钟,无法轻松地将问题进一步分解,以确保作业能够在 15 分钟内执行完毕。

解决方案

方案1

使用 AWS Step Functions 结合 ECS Fargate 运行任务,并通过参数传递来实现每个任务的定制化配置。

AWS Step Functions 允许您从流程状态图中的一个状态启动 ECS Fargate 任务,并传递自定义参数。下面是一个基本的状态机示例,用于演示如何实现您的需求:

{
  "StartAt": "RunParallelFargateTasks",
  "States": {
    "RunParallelFargateTasks": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "RunFargateTask",
          "States": {
            "RunFargateTask": {
              "Type": "Task",
              "Resource": "arn:aws:states:::ecs:runTask.sync",
              "Parameters": {
                "LaunchType": "FARGATE",
                "Cluster": "your-cluster-name",
                "TaskDefinition": "your-task-definition",
                "Overrides": {
                  "ContainerOverrides": [
                    {
                      "Name": "your-container-name",
                      "Command": ["custom-command-1", "param-value-1"]
                    }
                  ]
                }
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "RunFargateTask",
          "States": {
            "RunFargateTask": {
              "Type": "Task",
              "Resource": "arn:aws:states:::ecs:runTask.sync",
              "Parameters": {
                "LaunchType": "FARGATE",
                "Cluster": "your-cluster-name",
                "TaskDefinition": "your-task-definition",
                "Overrides": {
                  "ContainerOverrides": [
                    {
                      "Name": "your-container-name",
                      "Command": ["custom-command-2", "param-value-2"]
                    }
                  ]
                }
              },
              "End": true
            }
          }
        },
        // ... Add more branches for additional tasks
      ]
    }
  }
}

在上述示例中,我们定义了一个名为 “RunParallelFargateTasks” 的并行状态,其中包含多个分支,每个分支都对应一个要运行的 Fargate 任务。每个分支的 “RunFargateTask” 状态指定了要运行的任务的参数,包括容器名称、自定义命令以及参数值。

方案2

使用 AWS Batch 进行更灵活的任务调度和管理。

如果您的任务需要更复杂的参数传递、调度和管理,您还可以考虑使用 AWS Batch。AWS Batch 是一项托管服务,可用于调度和执行大规模的计算工作负载,支持容器和自定义环境。您可以通过 AWS Batch 在不同的计算环境中运行任务,并对任务进行更详细的配置。

要使用 AWS Batch,您需要创建 Job Definitions 和 Job Queues,然后通过 Step Functions 调用 AWS Batch 提交任务。这样可以为每个任务提供更丰富的配置和参数传递选项。

总结

使用 AWS Step Functions 结合 ECS Fargate 或 AWS Batch,您可以实现在启动多个并行任务时传递不同的参数值,从而满足您的需求。不同方案的选择取决于您的任务复杂性以及对灵活性和管理的需求。在进行实际部署之前,建议进行必要的测试和验证,以确保系统的可靠性和性能。

请记住,上述方案中涉及的 AWS 服务和功能可能会随时间变化而更新,请查阅官方文档以获取最新信息。

正文完