The issue you’re facing arises because the `input` property of the `aws_cloudwatch_event_target` resource passes the data to the Batch job as a JSON string. However, your Batch job definition expects the `inputCommand` to be an environment variable or command argument rather than a direct JSON input.
To solve this, you can use the `input_transformer` property of the `aws_cloudwatch_event_target` resource to transform the CloudWatch event input into a format that can be correctly interpreted by the Batch job’s `command` field.
Here’s how you can modify your Terraform configuration:
– Ensure your job definition is set up to take the `inputCommand` as part of the command in a format compatible with what will be passed through the `input_transformer`.
```hcl container_properties = <<CONTAINER_PROPERTIES { "command": ["echo", "Ref::inputCommand"], ... } CONTAINER_PROPERTIES ```
– Use the `input_transformer` property to map the `inputCommand` from the CloudWatch event to the Batch job.
hcl resource "aws_cloudwatch_event_target" "test_target" { rule = aws_cloudwatch_event_rule.every_minute.name role_arn = aws_iam_role.event_iam_role.arn arn = aws_batch_job_queue.test_queue.arn batch_target { job_definition = aws_batch_job_definition.test.arn job_name = "job-test" job_attempts = 2 } input_transformer { input_paths { command = "$.inputCommand" } input_template = "{\"inputCommand\":}" } }
– Modify the input to the CloudWatch event so that the `inputCommand` is passed correctly:
{
"inputCommand": "commandToRun"
}
– The `input_paths` block maps the CloudWatch event’s JSON key (`inputCommand`) to a variable (`command`).
– The `input_template` block then formats the input as a JSON string that the Batch job can parse.
– This formatted input will be passed to the job, where `Ref::inputCommand` will resolve to `”commandToRun”`.
Full Terraform Configuration
hcl resource "aws_cloudwatch_event_target" "test_target" { rule = aws_cloudwatch_event_rule.every_minute.name role_arn = aws_iam_role.event_iam_role.arn arn = aws_batch_job_queue.test_queue.arn batch_target { job_definition = aws_batch_job_definition.test.arn job_name = "job-test" job_attempts = 2 } input_transformer { input_paths { command = "$.inputCommand" } input_template = "{\"inputCommand\":}" } }
– `$.inputCommand` refers to the path in the JSON object passed by the CloudWatch Event.
– `
This setup should correctly pass the `inputCommand` to your AWS Batch job when triggered by the CloudWatch Event rule.