ecspressoで単発のバッチ処理を実行

に公開

環境

  • ecspresso 2.7.0

関連記事

https://zenn.dev/masatoshi_tada/articles/1e899786462567

前提

  • ECSクラスター
  • タスクロール
  • タスク実行ロール
  • ECRリポジトリ

などは、Terraformで別途作成済みとします。

併せて、アプリはコンテナイメージにビルドして、ECRにプッシュ済みとします。

ecspresso.yml

ecspresso.yml
region: ap-northeast-1
cluster: クラスター名
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
plugins:
  - name: tfstate
    config:
      url: {{ must_env `S3_TFSTATE_URL` }}

サービス定義

ロードバランサーなどは不要。

ecs-service-def.json
{
  "serviceName": "適当なサービス名",
  "desiredCount": 1,
  "launchType": "FARGATE",
  "platformVersion": "LATEST",
  "platformFamily": "LINUX",
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "サブネットID1",
        "サブネットID2"
      ],
      "securityGroups": [
        "セキュリティグループID"
      ],
      "assignPublicIp": "DISABLED"
    }
  },
  "healthCheckGracePeriodSeconds": 10,
  "schedulingStrategy": "REPLICA",
  "enableExecuteCommand": true,
  "availabilityZoneRebalancing": "ENABLED"
}

タスク定義

ecs-task-def.json
{
  "family": "適当な名前",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX",
    "cpuArchitecture": "ARM64"
  },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "コア数",
  "memory": "メモリ量",
  "taskRoleArn": "タスクロールARN",
  "executionRoleArn": "タスク実行ロールARN",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "コンテナ名",
      "image": "イメージ:タグ",
      "user": "appuser",
      "essential": true,
      "environment": [
        {
          "name": "TZ",
          "value": "Asia/Tokyo"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-region": "ap-northeast-1",
          "awslogs-group": "ロググループ名",
          "awslogs-stream-prefix": "適当なプレフィックス"
        }
      },
      "readonlyRootFilesystem": true,
      "mountPoints": [
        {
          "containerPath": "/tmp",
          "sourceVolume": "app-ephemeral-volume",
          "readOnly": false
        }
      ]
    }
  ],
  "volumes": [
    {
      "name": "app-ephemeral-volume"
    }
  ]
}

実行

run.sh
export S3_TFSTATE_URL=s3://バケット名/terraform.tfstate

ecspresso run --no-wait

これだけで、ECS上でバッチ処理を1回実行できます!

Discussion