こんにちは。株式会社シーズの倉岡です。
今回は、AWS BatchでFargateをEventBridgeルール経由で使用していた際に遭遇したContainerOverridesのCommandは読み取ってくれるのに、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を試してみてください!