如何使用aws_cloudwatch_event_target覆盖resourceRequirements?

0

【以下的问题经过翻译处理】 我在Terraform中定义了一个AWS Batch作业,并在AWS中正常运行。我使用cronExpression()创建了几个覆盖规则,以便在特定时间调用作业。我正在使用aws_cloudwatch_event_targetaws_cloudwatch_event_rule。大部分功能都正常工作。我使用正确的名称、arn等触发规则,即使是正确的命令。我的TF代码如下:

resource "aws_cloudwatch_event_rule" "batchjob" {
  name       = "foo"
  is_enabled = true
  # runs on the first of every month at 15:00 UTC 
  # https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html
  schedule_expression = "cron(0 15 1 * ? *)"
}

resource "aws_cloudwatch_event_target" "batchjob_target" {
  rule     = "foo"
  arn      = "<queue arn>"
  role_arn = "<role arn>"
  input = jsonencode({
    # https://docs.aws.amazon.com/batch/latest/APIReference/API_ContainerOverrides.html
    "ContainerOverrides" : {
      "Command" : [
        "/bin/java",
        "-jar",
        "/batch-jobs.jar",
        "foobar"
      ],
      # VCPU and MEMORY are linked: https://docs.aws.amazon.com/batch/latest/APIReference/API_ResourceRequirement.html
      # https://repost.aws/questions/QUP1kkGbDrT1uC4jTW6DXZ4A/set-cpu-and-memory-requirements-for-a-fargate-aws-batch-job-from-an-aws-cloudwatch-event
      "ResourceRequirements" : [
        {
          "Type"  = "VCPU"
          "Value" = "4"
        },
        {
          "Type"  = "MEMORY"
          "Value" = "8192"
        }
      ]
    }
    }
  )
}
batch_target {
  job_name       = "foo"
  job_definition = aws_batch_job_definition.job_definition.arn
}

我已确认“ContainerOverrides”和“Command”必须是pascal大小写才能正常工作。如果使用camel大小写,则看不到这些覆盖选项。

profile picture
专家
已提问 5 个月前43 查看次数
1 回答
0

【以下的回答经过翻译处理】 嗨Eric,感谢您联系我们!

经过调查,我确认了在将Batch Job配置为EventBridge规则目标时,ContainerOverrides下的ResourceRequirement参数将不被处理。Command下的参数将被接受,但是ResourceRequirements不会从EventBridge Target传递到Batch Job。此外我还可以确认,有一个功能请求可以支持这个需求,但我无法提供何时可用的具体时间。

不过,我可以建议您使用一个比较新的EventBridge Scheduler功能(https://docs.aws.amazon.com/eventbridge/latest/userguide/scheduler.html)而不是使用cron表达式的EventBridge规则来完成您的用例。此功能TerraForm是支持的,将允许您按计划直接调用Batch SubmitJob调用并传递所有要传递的参数,包括带有ResourceRequirement字段的Container Override参数。

我在控制台中使用Scheduler调度测试了这个功能,VCPU和内存ResourceRequirements,并传递了以下JSON进行API调用:

{ "JobDefinition":"arn:aws:batch:us-west-1:123456789012:<definition>", "JobName":"MyData", "JobQueue":"arn:aws:batch:us-west-1:123456789012:<queue>", "ContainerOverrides":{ "ResourceRequirements":[ { "Type":"VCPU", "Value":"4" }, { "Type":"MEMORY", "Value":"8192" } ] } }

可以看到,在ContainerOverride字段中指定的VCPU和MEMORY的情况下,作业可以成功启动。

我希望这些信息有所帮助!

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则