Как поместить массив в Dynamo Db с помощью функции step

#node.js #amazon-web-services #aws-lambda #aws-step-functions

#node.js #amazon-веб-сервисы #aws-lambda #aws-step-функции

Вопрос:

У меня есть лямбда-функция, которая передает входные значения в функцию step. Ниже приведены входные данные, которые получает функция Step, и это хорошо. Предполагается, что моя пошаговая функция записывает эти поля в таблицу Dynamo. У меня возникли проблемы с объектами в пошаговой функции. Я просто хочу взять массив объектов как он есть из входных данных и поместить в таблицу dynamo. Я пытался использовать путь к элементам и параметр массива, но это не удалось. Любая помощь будет оценена. // Ввод в функцию Step

 {
  "CLIENT_ID": "fa1188",
  "CLIENT_NAME": "Country Village 1188",
  "SOURCE_IDENTIFIER": "abc-123-Country_Village 1188",
  "ENTITIES": {
    "L": [
      {
        "S": "Test1"
      },
      {
        "S": "Test8"
      },
      {
        "S": "Test8"
      }
    ]
  },
  "CREATED_TIMESTAMP": "1597436891604"
}
  

// Пошаговая функция

 {
  "Comment": "PutItem into DynamoDB",
  "StartAt": "1st",
  "States": {
    "1st": {
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:putItem",
  "Parameters": {
    "TableName": "CLIENTS",
    "Item": {
      "CLIENT_ID": {
        "S.$": "$.CLIENT_ID"
      },
      "CLIENT_NAME": {
        "S.$": "$.CLIENT_NAME"
      },
      "SOURCE_IDENTIFIER": {
        "S.$": "$.SOURCE_IDENTIFIER"
      },
    "CREATED_TIMESTAMP": {
        "S.$": "$.CREATED_TIMESTAMP"
    },
     **"ENTITIES": {         
        "S.$":"$.ENTITIES.L"
     }**
    }
    },
    "End":true,
    "ResultPath":"$.DynamoDB"
    }
  }
}
  

Я могу сохранить все другие сохраненные значения, отличные от entity.Я хочу, чтобы столбец Entity в таблице Dynamo сохранял значение, подобное приведенному ниже
[{«S»: «Test1»}, {«S»: «Test8»},{«S»: «Test8»}]

Ответ №1:

Для вашего первого блока кода вам не нужен дополнительный синтаксис при определении вашего ENTITIES атрибута, поскольку это просто обычные вызовы API PutItem для раздела Item. Подойдет обычный массив JavaScript. Это подтверждается синтаксисом запроса PutItem API DynamoDB

И модификация вашего первого блока кода:

 {
  "CLIENT_ID": "fa1188",
  "CLIENT_NAME": "Country Village 1188",
  "SOURCE_IDENTIFIER": "abc-123-Country_Village 1188",
  "ENTITIES": ["Test1", "Test8", "Test8"],
  "CREATED_TIMESTAMP": "1597436891604"
}
  

Для определения конечного автомата во 2-м блоке кода вашего поста у вас был ENTITIES атрибут, определенный как строковый тип с "S.$":"$.ENTITIES.L" , и .L в конце не было необходимости. Просто измените это определение типа с S на L вместо этого для типа списка.

Вот как это выглядит с измененным вашим исходным 2-м блоком кода:

 {
  "Comment": "PutItem into DynamoDB",
  "StartAt": "1st",
  "States": {
    "1st": {
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:putItem",
  "Parameters": {
    "TableName": "CLIENTS",
    "Item": {
      "CLIENT_ID": {
        "S.$": "$.CLIENT_ID"
      },
      "CLIENT_NAME": {
        "S.$": "$.CLIENT_NAME"
      },
      "SOURCE_IDENTIFIER": {
        "S.$": "$.SOURCE_IDENTIFIER"
      },
    "CREATED_TIMESTAMP": {
        "S.$": "$.CREATED_TIMESTAMP"
    },
     "ENTITIES": {         
        "L.$":"$.ENTITIES"
     }
    }
    },
    "End":true,
    "ResultPath":"$.DynamoDB"
    }
  }
}
  

Протестировано и работает, как ожидалось. API PutItem обрабатывает преобразование типов массивов JS в типы списков DynamoDB под капотом:

Успешный результат DynamoDB PutItem со списком строк, выполненных на языке Amazon States