Как передать JSON в задачу ECS в AWS StepFunction? - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь создать рабочий процесс AWS StepFunctions , где у меня есть задача Lambda , за которой следует задача ECS / Fargate .

Lambda принимает идентификатор в качестве входных данных и выводит некоторые данные в форме JSON, которая используется задачей ECS, которая выполняет сценарий Python в своей среде контейнера. В StepFunctions я хотел бы выполнить следующий поток:

{ id: 1234 } -> [Lambda] -> { id: 1234, data: {...} }

{ id: 1234, data: {...} } -> [ECS] -> { id: 1234, result: "bar"}

Для справки приведен пример конфигурации задачи ECS: https://docs.aws.amazon.com/step-functions/latest/dg/sample-project-container-task-notification.html

Я не могу найти способ передать структурированную JSON input Задачу ECS контейнеру, выполняющему задачу.

Вот что я нашел до сих пор:

  • Я могу передать отдельные поля ввода JSON в контейнер с помощью JSONPath, чтобы выбрать отдельные поля ввода и установить их в качестве переменных среды. Но если я назначу весь объект input ($) переменной среды, то произойдет сбой во время выполнения с ошибкой сериализации ([Object] cannot be converted to a string).
  • Я могу создать промежуточную лямбду, которая принимает введите и преобразует ее в JSON строку, которая хранится в единственном значении ключа в output, затем назначьте это единственное строковое значение ключа переменной среды задачи ECS и проанализируйте ее. Тем не менее, это требует добавления всей дополнительной задачи и нескольких секунд времени выполнения + стоимость.

Вот некоторые вещи, которые я не могу сделать:

  • Кажется, в boto3 нет механизма для получения input существующей задачи ECS. Я могу получить input из неназначенного Activity, или я могу получить ввод всего выполнения. Но не существует API для простого ввода данных существующей работающей Задачи, хотя у меня есть Жетон Задачи.
  • Я не могу изменить исходную лямбду для вывода JSON в виде строки. Я использую этот результат в нескольких местах (параллельные задачи), а другими задачами являются лямбда-выражения, которые используют указанные c подполя output в качестве input.

Что такое предназначение механизм передачи структурированного объекта JSON, определенного как input, в задачу в контейнер выполнения задачи ECS / Fargate?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Учитывая, что вы не указываете на шаге, который запускает Lambda, путь к результату, вход вашего контейнера будет выходом вашего Lambda, что будет означать:

"Overrides": {
   "ContainerOverrides": [
      {
        "Name": "container-name",
        "Environment": [
          {
            "Name": "SOME_ENV_VAR",
            "Value.$": "$"
          },

Но даже это ограничено тем, что вы можете хранить как ENV, поэтому вам нужно убедиться, что ваш JSON действительно является строкой

0 голосов
/ 13 апреля 2020

Какой механизм предназначен для передачи структурированного JSON объекта, определенного как входные данные для Задачи, в исполняющий контейнер Задачи ECS / Fargate?

Взгляните на документы обработки Input и OutPut: https://docs.aws.amazon.com/step-functions/latest/dg/concepts-input-output-filtering.html

Это поможет вам решить, какой из входных данных JSON вы хотите передать в состояние «Run Fargate Task» (из примера Вы связали свой вопрос)

Шаговые функции поддерживают «RunTask» ECS и пару параметров: https://docs.aws.amazon.com/step-functions/latest/dg/connect-ecs.html

Например,

  1. Предположим, у меня есть вывод лямбда-функции: JSON

    {
        "commands": [
            "foo": { "bar" },
            "some command 1",
            "some command 2"
        ]
    }
    
  2. Я хочу, чтобы у моей задачи Run Fargate был путь ввода, который получает только все входные данные , В моей конечной машине после "Type": "Task", я поставлю:

    "InputPath":"$.commands",
    
  3. Затем в моем "Parameters" для моей Задачи Fargate после "NetworkConfigurations:{....}," я помещу переопределения контейнера, которые я хотите использовать синтаксис JSON Path: https://github.com/json-path/JsonPath. Однако я не хочу вводить все данные из JSON, просто значение "foo"

    "Overrides": {
        "ContainerOverrides": [
            {
                "Name": "container-name",
                "Command.$": "$.commands.foo"
            }
        ]
    }
    

Вы можете использовать синтаксис, использованный здесь: https://docs.aws.amazon.com/step-functions/latest/dg/connect-ecs.html

...