将环境变量传递到由步骤函数触发的批处理作业时遇到问题

问题描述 投票:0回答:1

基本上,我正在构建一个集成,通过 AWS 批处理作业定义在 ECS 上运行 ECR 映像。这段代码适用于 atm,我们现在开始通过 AWS 步骤函数运行作业定义。

这是我当前状态机的副本(为了保护参与此代码的公司的隐私而进行了一些编辑)

{
  "Comment": "A description of my state machine",
  "StartAt": "xxxxxx Job",
  "QueryLanguage": "JSONata",
  "States": {
    "blahblah Job": {
      "Type": "Task",
      "Resource": "arn:aws:states:::batch:submitJob.sync",
      "Arguments": {
        "JobName": "blahJob",
        "JobDefinition": "job-def-arn:69",
        "JobQueue": "job-queue"
      },
      "Next": "bleg Job",
      "Assign": {
        "apiCall": "$states.input.apiCall",
        "wid": "$states.input.wid"
      }
    },
    "bleg Job": {
      "Type": "Task",
      "Resource": "arn:aws:states:::batch:submitJob.sync",
      "Arguments": {
        "JobDefinition": "job-arn:69",
        "JobQueue": "job-queue",
        "JobName": "blegJob"
      },
      "End": true,
      "Assign": {
        "apiCall": "$states.input.apiCall",
        "person": "$states.input.person",
        "endpoint": "$states.input.endpoint"
      }
    }
  }
}

我一直在尝试几种不同的方法。我的 ECR 映像是运行 Nodejs 代码的 alpine linux 映像。 ECR 存储库和批处理作业都是通过 Terraform 创建的。上面的分配块无法正常工作。

这是通过步骤函数运行的 terraform 作业定义的副本。您可以看到我也尝试通过 terraform 设置环境变量,但这对我来说也不起作用。

如果我可以提供更多有关我的设置的信息,或者是否有任何我应该尝试的技术或技巧,请告诉我。

resource "aws_batch_job_definition" "managed" {
  for_each = var.manage_job_definitions ? var.job_definitions : {}

  name = "${var.app_name}-${var.environment}-${each.key}"
  type = "container"
  platform_capabilities = [
    "FARGATE",
  ]

  container_properties = <<CONTAINER_PROPERTIES
{
  "fargatePlatformConfiguration": {
    "platformVersion": "LATEST"
  },
  "executionRoleArn": "${aws_iam_role.ecs_task_execution_role.arn}",
  "jobRoleArn": "${local.ecs_job_role}",
  "mountPoints": ${jsonencode(var.mount_points)},
  "volumes": ${jsonencode(var.volumes)},
  "containers": [
      {
        "name": "xxxxx",
        "image": "${xxxxx}",
        "environment": [
          {
            "name": "apiCall",
            "value": "{% $states.input.apiCall $}"
          },
          {
            "name": "wid",
            "value": "{% $states.input.xxx $}"
          }
        ],
        "environment": ${jsonencode(concat(local.common_env_vars, each.value.environment_variables))},
        "essential": true,
        "resourceRequirements": [
          {"type": "VCPU", "value": "0.25"},
          {"type": "MEMORY", "value": "512"}
        ]
      },
      {
        "name": "xxxxxImage",
        "image": "${var.xxxx_image}",
        "environment": [
          {
            "name": "apiCall",
            "value": "{% $states.input.apiCall $}"
          },
          {
            "name": "wid",
            "value": "{% $states.input.wid $}"
          }
        ],
        "essential": true,
        "resourceRequirements": [
          {"type": "VCPU", "value": "0.25"},
          {"type": "MEMORY", "value": "512"}
        ]
      },
      {
        "name": "dataImage",
        "image": "${var.node_server_image}",
        "environment": ${jsonencode(concat(local.common_env_vars, each.value.environment_variables))},
        "essential": true,
        "resourceRequirements": [
          {"type": "VCPU", "value": "0.25"},
          {"type": "MEMORY", "value": "512"}
        ]
      }
  ]
}
CONTAINER_PROPERTIES
}
node.js amazon-web-services aws-step-functions amazon-ecr aws-batch
1个回答
0
投票

感谢 Reddit 上的一些人,我最终找到了答案。您只需添加

"ContainerOverrides": {
  "Environment": [
    {
      "Name": "var1",
      "Value": "{% $states.input.value1 %}"
    },
    {
      "Name": "var2",
      "Value": "{% $states.input.value2 %}"
    }
  ]
}

到您尝试将变量放入“参数”字段下的“状态机/步进函数”定义中的任何容器。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.