LoginSignup
0
0

More than 1 year has passed since last update.

AWSでサーバーレスバッチ処理のアーキテクチャを考えてみた

Posted at

概要

AWSのフルマネージド型バッチ処理サービスのAWS Batchを使用して、サーバーレスバッチ処理をTerraform構築してみます。
ソースはこちら: 777nancy/batch-infra

前提

  • 定期処理を想定
    • 日次
    • 月次
  • バッチ処理のコンテナイメージは別途用意が必要
    • 本記事ではDocker Hubのbusyboxを使用
  • コンピューティングリソースにFargate Spotを使用
    • 運用する場合はFargateの使用を想定

構成図

architecture.png

AWSサービス

  • AWS Batch
    • Fargate
  • AWS Step Functions
  • Amazon EventBridge

Terraform

ジョブ、ステートマシーンを説明します。

Job Definitions

本記事ではbusyboxのコンテナイメージを使用したジョブを定義しています。
運用する場合は、実行する処理(コンテナイメージ)の数に合わせてジョブを定義します。

batch.tf
resource "aws_batch_job_definition" "busybox_job_definition" {
  name = "${var.system}-busy-box-job-definition"
  type = "container"
  platform_capabilities = [
    "FARGATE",
  ]
  container_properties = templatefile(
    "container_properties/busybox.tftpl",
    {
      execution_role_arn = aws_iam_role.aws_batch_execution_role.arn
      job_role_arn       = aws_iam_role.aws_batch_job_role.arn
  })
  tags = {
    "Name" = "${var.system}-busy-box-job-definition"
  }
  depends_on = [
    aws_iam_role.aws_batch_execution_role,
    aws_iam_role.aws_batch_job_role
  ]
}
container_properties/busybox.tftpl
{
    "command": [
        "echo",
        "test"
    ],
    "image": "busybox",
    "fargatePlatformConfiguration": {
        "platformVersion": "1.4.0"
    },
    "networkConfiguration": {
        "assignPublicIp": "ENABLED"
    },
    "resourceRequirements": [
        {
            "type": "VCPU",
            "value": "0.25"
        },
        {
            "type": "MEMORY",
            "value": "512"
        }
    ],
    "executionRoleArn": "${execution_role_arn}",
    "jobRoleArn": "${job_role_arn}"
}

実行するコンテナイメージに合わせてレジストリを設定します。(AWSのサービスであればAmazon ECRのレジストリ)
また、AWSのブログでCreating a Simple “Fetch & Run” AWS Batch Jobより、シンプルなジョブのコンテナイメージ作成方法が紹介されています。

"image": "busybox"

また、Fargateは4 vCPU-30GBの上限あります。

"resourceRequirements": [
        {
            "type": "VCPU",
            "value": "0.25"
        },
        {
            "type": "MEMORY",
            "value": "512"
        }
    ]

State Machine

State Machineを使用して、ジョブの依存関係を定義します。

image.png

{
    "Comment": "batch-system-state-machine",
    "StartAt": "first_job",
    "States": {
        "first_job": {
            "Type": "Task",
            "Resource": "arn:aws:states:::batch:submitJob.sync",
            "Parameters": {
                "JobName": "first_job",
                "JobDefinition": "${job_definition_arn}",
                "JobQueue": "${job_queue_arn}",
                "ContainerOverrides": {
                    "Command": [
                        "echo",
                        "first",
                        "job"
                    ]
                }
            },
            "Next": "second_job"
        },
        "second_job": {
            "Type": "Task",
            "Resource": "arn:aws:states:::batch:submitJob.sync",
            "Parameters": {
                "JobName": "second_job",
                "JobDefinition": "${job_definition_arn}",
                "JobQueue": "${job_queue_arn}",
                "ContainerOverrides": {
                    "Command": [
                        "echo",
                        "second",
                        "job"
                    ]
                }
            },
            "End": true
        }
    }
}

各ステートごとにJob Definitionsで定義している実行コマンドを上書きできるため、同じジョブ定義でも異なる処理を実行できます。

"ContainerOverrides": {
                    "Command": [
                        "echo",
                        "second",
                        "job"
                    ]
                }

課題

  • Fargateのリソース制限
    • GPU使用不可
    • 4 vCPU-30GB以上のリソースを指定不可
    • 上記のリソースを使用する場合処理はAWS BatchでコンピューティングリソースにEC2を使用
      • EC2を使用する場合はサーバーレスではない

最後に

Terraformを勉強し始めたばかりで、汎用的な記述になっていませんが、本記事が誰かのお役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0