hero_picture

【CPUメモリが変わらない!?】EventBridgeルールで AWS Batch(Fargate) を実行する際のContainerOverridesにおけるResourceRequirementsが反映されない

こんにちは。株式会社シーズの倉岡です。

今回は、AWS BatchでFargateをEventBridgeルール経由で使用していた際に遭遇したContainerOverridesCommandは読み取ってくれるのに、ResourceRequirementsが読み取ってくれずFargateのスペックが変更できない問題と、その解決策について共有します。

AWS Batchでのジョブ定義

AWS Batchでバッチ処理を行うために、以下のジョブ定義を設定していました。

  • Fargate使用
  • VCPU: 1
  • MEMORY: 2048(2GB)

EventBridgeルールで、cronで毎日2時に設定をしてAWS batchを使ってバッチ処理を行っているのですが、バッチ処理を行った際にメモリ不足になることが度々ありました。

メモリを増やすための設定変更

そこで、EventBridgeルールの入力定数の定義を以下のように変更し、メモリを4GBまで増やして実行するようにしました。

1{
2  "ContainerOverrides": {
3    "Command": ["php", "/var/www/html/hogehoge/html/public/index.php", "batch", "export", "execute", "data_export", "1"],
4    "ResourceRequirements": [
5      {"Type": "VCPU", "Value": "1"},
6      {"Type": "MEMORY", "Value": "4096"}
7    ]
8  }
9}
10

しかし、コマンドはオーバーライドされるものの、ResourceRequirementsの部分が反映されませんでした

その結果、ジョブは依然として2GBのメモリで実行され続けてしまいました。override部分に設定してもスペックが変わらないのです。


なぜ反映されない…?ということで調査をしてみました。

調査の結果、EventBridgeルールの制約が判明

中々同じようにしているユーザーさんがいないのか中々同様な案件が見つからず…困り果てながらも調査を続けてました。AWSサポートに問い合わせるしかないのかなと半ば諦めていたところ、AWSのフォーラム「AWS RePost」に同様の問題についての投稿を発見しました。

「cloudwatch_event_ruleでCommandは実行されるが、ResourceRequirementsが実行されない」

EventBridgeはcloudwatch_event_ruleの進化版。これは類似している!ということで早速読むことに…

How to override ResourceRequirements with AWS CloudWatch Event Target

するとこの記事の回答によると、EventBridgeルールのターゲットとしてバッチジョブを設定すると、ContainerOverridesのResourceRequirementsパラメータは適用されないことがAWSの内部調査で確認されているとのことでした。

Commandのパラメータは適用されるが、ResourceRequirementsはEventBridgeのターゲットからBatchジョブに渡されません。ただし、新しいEventBridge Scheduler 機能を使用してユースケースを実現することをお勧めします。

EventBridgeルールではなく、新しい「EventBridge Scheduler」を使用すると解決できるらしいです。

え、EventBridgeルールはダメで、EventBridge Schedulerならできるの!?これは盲点。。。

EventBridge Schedulerを使った解決策

さっそく、EventBridge Schedulerを使って設定を変更し、問題が解決するか検証してみました。

事前準備:IAMロールの設定

EventBridge Schedulerで使用する新しいIAMロールを作成します。

信頼関係を設定はこのようにします。

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Effect": "Allow",
6            "Principal": {
7                "Service": "scheduler.amazonaws.com"
8            },
9            "Action": "sts:AssumeRole"
10        }
11    ]
12}
13

次に、最小限の権限を付与するIAMポリシーを設定しました。

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Action": [
6                "batch:SubmitJob"
7            ],
8            "Resource": "*",
9            "Effect": "Allow"
10        }
11    ]
12}
13

これで事前準備は完了です。

EventBridge Schedulerの設定

EventBridgeサービスのスケジューラを開く

スケジュールを新規作成し、1分ごとにテスト実行

AWS BatchのSubmitJobを選択

以下の入力データを設定

1{
2  "JobName": "my-job-instance-overwrite",
3  "JobQueue": "arn:aws:batch:ap-northeast-1:(自分のアカウントID):job-queue/my-job-queue",
4  "JobDefinition": "my-job",
5  "ContainerOverrides": {
6    "Command": [
7      "php",
8      "/var/www/html/hogehoge/html/public/index.php",
9      "batch",
10      "export",
11      "execute",
12      "data_export",
13      "1"
14    ],
15    "ResourceRequirements": [
16      { "Type": "VCPU", "Value": "1" },
17      { "Type": "MEMORY", "Value": "4096" }
18    ]
19  }
20}
21

あとは下記の設定をします。

先ほど作成したIAMロールを設定し、スケジュールを作成

あとは保存を押して完了となります。

検証結果

ジョブ一覧から実行結果を確認すると、メモリが4GBにしっかり変更されていました!

コマンドもしっかりoverrideされていて自分のしたいことが出来ました。

このように、AWS BatchでFargateを使用し、EventBridgeルール経由でリソース変更が適用されない場合は、EventBridge Schedulerを使用することで解決可能です。

まとめ

  • EventBridgeルールでは、AWS BatchのResourceRequirementsのオーバーライドは適用されない
  • EventBridge Schedulerを使うことで、リソースのオーバーライドが可能
  • IAMロールの適切な設定が必要

AWS BatchでFargateを使用している方で、リソースオーバーライドがうまく適用されない場合は、ぜひEventBridge Schedulerを試してみてください!