【AWS】JobStateTimeLimitActionsReasonで「Invalid job reason」のエラーが出た場合

# 概要
AWS Batchでは、`RUNNABLE`状態でスタックしたジョブを検出することができます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/03/aws-batch-alerts-detect-jobs-runnable-state/

こちらをAWS Cloudformationを使って構築しようと思ったら以下のエラーに。

> Resource handler returned message: "Invalid job reason...

原因と解決方法を紹介します。

# 原因

ジョブキューは以下のように定義しました。

```yaml
  BatchJobQueue:
    Type: 'AWS::Batch::JobQueue'
    Properties:
      ComputeEnvironmentOrder:
        - ComputeEnvironment: !Ref BatchComputeEnvironment
          Order: 1
      Priority: 1
      State: ENABLED
      JobStateTimeLimitActions:
        - State: RUNNABLE
          Reason: INSUFFICIENT_INSTANCE_CAPACITY
          MaxTimeSeconds: 600
          Action: CANCEL
        - State: RUNNABLE
          Reason: COMPUTE_ENVIRONMENT_MAX_RESOURCE
          MaxTimeSeconds: 600
          Action: CANCEL
        - State: RUNNABLE
          Reason: JOB_RESOURCE_REQUIREMENT
          MaxTimeSeconds: 600
          Action: CANCEL
      JobQueueName: sample-batch-job-queue
```

上記で`Invalid job reason`が出た理由は何か？
それは`Reason`の値が適切ではなかったためです。

ちなみに上記のReasonは、CDKではそのように設定する、と記載があったためです。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_batch.JobStateTimeLimitActionsReason.html#members

ちなみに以下のAWS公式ドキュメントの方にはどんな値が設定できるかの記述はありませんでした。

https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-batch-jobqueue-jobstatetimelimitaction.html


# 解決方法

AWSマネジメントコンソールで手動で`JobStateTimeLimitActions`パラメーターを設定してCLIを叩いてみると以下のように出てきました。

```json
{
    "jobQueues": [
        {
            "jobQueueName": "sample-batch-job-queue",
            "jobQueueArn": "arn:aws:batch:ap-northeast-1:xxxxxxxxxx:job-queue/sample-batch-job-queue",
            "state": "ENABLED",
            "status": "VALID",
            "statusReason": "JobQueue Healthy",
            "priority": 1,
            "computeEnvironmentOrder": [
                {
                    "order": 1,
                    "computeEnvironment": "arn:aws:batch:ap-northeast-1:xxxxxxxxxx:compute-environment/sample-batch-ec2-compute-environment"
                }
            ],
            "tags": {},
            "jobStateTimeLimitActions": [
                {
                    "reason": "MISCONFIGURATION:COMPUTE_ENVIRONMENT_MAX_RESOURCE",
                    "state": "RUNNABLE",
                    "maxTimeSeconds": 600,
                    "action": "CANCEL"
                },
                {
                    "reason": "MISCONFIGURATION:JOB_RESOURCE_REQUIREMENT",
                    "state": "RUNNABLE",
                    "maxTimeSeconds": 600,
                    "action": "CANCEL"
                },
                {
                    "reason": "CAPACITY:INSUFFICIENT_INSTANCE_CAPACITY",
                    "state": "RUNNABLE",
                    "maxTimeSeconds": 600,
                    "action": "CANCEL"
                }
            ]
        }
    ]
```

あら、Reasonの値の頭に`MISCONFIGURATION`とかついている！？

なるほど、CDKのENUMと値が違うのですね。。
ということでyamlｗ以下のように修正したらエラーが出なくなりました。

```yaml
  BatchJobQueue:
    Type: 'AWS::Batch::JobQueue'
    Properties:
      ComputeEnvironmentOrder:
        - ComputeEnvironment: !Ref BatchComputeEnvironment
          Order: 1
      Priority: 1
      State: ENABLED
      JobStateTimeLimitActions:
        - State: RUNNABLE
          Reason: CAPACITY:INSUFFICIENT_INSTANCE_CAPACITY
          MaxTimeSeconds: 600
          Action: CANCEL
        - State: RUNNABLE
          Reason: MISCONFIGURATION:COMPUTE_ENVIRONMENT_MAX_RESOURCE
          MaxTimeSeconds: 600
          Action: CANCEL
        - State: RUNNABLE
          Reason: MISCONFIGURATION:JOB_RESOURCE_REQUIREMENT
          MaxTimeSeconds: 600
          Action: CANCEL
      JobQueueName: sample-batch-job-queue
```

解決！

## 参考

https://dev.classmethod.jp/articles/aws-batch-alerts-detect-jobs-runnable-state/