バッチ設計
-
エラーハンドリング
- 通知
- ロギング
-
リトライ
- 自動
- 手動
- リトライできるように設計されていること
-
依存関係制御
- 「ジョブAはジョブBのあと」とか
-
単に時刻をずらして暗黙的に依存関係を表現するのはアンチパターン
- 【所感】処理時間が伸びてきたりリトライが走ったりすると狂うからかな
-
ジョブ管理
ECS Scheduled Tasks
- cronよりはマシ
-
ジョブ管理システムには及ばない
- エラー通知、リトライはアプリケーションで自前実装の必要あり
- 依存関係制御不可
タスク定義・コンテナ定義
- 略
CloudWatch Events
- 定期実行するためにCloudWatch Eventsを使う
resource "aws_cloudwatch_event_rule" "example_batch" {
name = "example-batch"
description = "important batch process"
schedule_expression = "cron(*/2 * * * ? *)"
}
-
schedule_expression = "cron(*/2 * * * ? *)"
- cron式とrate式が使える
-
cron式
- いつもの
-
rate式
rate(2 minutes)
とかrate(1 hour)
とか書ける
CloudWatchイベントIAMロール
- CloudWatch EventsからECSタスクを実行するためにIAMロールを付与する
module "ecs_events_role" {
source = "./iam_role"
name = "ecs-events"
identifier = "events.amazonaws.com"
policy = data.aws_iam_policy.ecs_events_role_policy.policy
}
data "aws_iam_policy" "ecs_events_role_policy" {
arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole"
}
-
ECSタスクの実行権と、IAMロールの付与権がある
- ECSタスク実行ロールの付与用
CloudWatchイベントターゲット
resource "aws_cloudwatch_event_target" "example_batch" {
target_id = "example-batch"
rule = aws_cloudwatch_event_rule.example_batch.name
role_arn = module.ecs_events_role.iam_role_arn
arn = aws_ecs_cluster.example.arn
ecs_target {
launch_type = "FARGATE"
task_count = 1
platform_version = "1.3.0"
task_definition_arn = aws_ecs_task_definition.example_batch.arn
network_configuration {
assign_public_ip = "false"
subnets = [aws_subnet.private_0.id]
}
}
}
- 2分ごとにタスクが実行される
- 動作確認としてログ取得
docker-compose run aws logs filter-log-events --log-group-name /ecs-scheduled-tasks/example
{
"events": [
{
"logStreamName": "batch/alpine/f639dc0f-2420-4b33-b5c6-82235ce683a2",
"timestamp": 1583938382268,
"message": "Wed Mar 11 14:53:02 UTC 2020",
"ingestionTime": 1583938382358,
"eventId": "35323006273131463711376913605029740017760879600706060288"
}
],
"searchedLogStreams": [
{
"logStreamName": "batch/alpine/f639dc0f-2420-4b33-b5c6-82235ce683a2",
"searchedCompletely": true
}
]
}