Я пытаюсь использовать функции Lambda для базового API базы данных, при этом вызовы должны выполняться непосредственно для каждой функции Lambda через URL-адрес ее функции.
Он отлично работает для получения элемента базы данных по его идентификатору, но когда я пытаюсь вместо этого использовать put, элемент не добавляется в таблицу.
Я пробовал несколько разных методов и примеров, но не смог заставить ни один из них работать. С некоторыми примерами из документации AWS и других руководств/потоков у меня были различные ошибки 502 и проблемы с версией узла, импортом и требованием и т. д.
С другими функция работает без ошибок, но элемент просто не добавляется в таблицу DynamoDB. Роль выполнения лямбда-функции имеет DynamoDBFullAccess (собственно, я дал ей все политики с DynamoDB в названии).
Я был бы очень признателен за решение, которое представляет собой не просто фрагмент кода, но включает информацию о настройке функции, например. для какой версии узла предназначен код и полный код, включая импорт и экспорт.
Рабочая лямбда-функция для получения предмета по id:
const AWS = require ('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({
region: 'us-east-1'
});
exports.handler = async (event) => {
const id = +event.queryStringParameters.id
const params = {
TableName: "test",
Key: {
"id": id
}
};
const data = await dynamoDb.get(params).promise();
const response = {}
if ((typeof data) === "object") {
response.statusCode = 200;
response.body = JSON.stringify(data);
} else {
response.statusCode = 500;
}
return response;
};
Попытка использования put. Это возвращает пустой объект с кодом состояния 200, как и ожидалось, но жестко закодированный элемент не добавляется в таблицу «тест». Ошибок в CloudWatch нет вообще.
const AWS = require ('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({
region: 'us-east-1'
});
exports.handler = async (event) => {
const params = {
TableName: "test",
Item: {
"id": 1
}
};
const data = await dynamoDb.put(params).promise();
const response = {}
if ((typeof data) === "object") {
response.statusCode = 200;
response.body = JSON.stringify(data);
} else {
response.statusCode = 500;
}
return response;
};
Вы определенно думаете в правильном направлении! Я проверял количество предметов на столе, к счастью, я наткнулся на ресурс, в котором упоминалось, что обновление количества предметов занимает 6 часов... Пошел исследовать предметы на столе, и там есть все мои предметы! Упс... Я оставлю это на случай, если это поможет кому-то еще, кто может совершить ту же ошибку. Спасибо за Ваш ответ!
Также обратите внимание, что при вызове put, если элемент с таким же первичным ключом уже существует, этот элемент будет просто заменен. (Конечное) количество предметов не изменится. Неясно, является ли принятый ответ на самом деле ответом tbh, несмотря на то, что в целом он полезен.
Вы всегда должны заключать асинхронные методы в блоки try/catch, чтобы выявить любые исключения.
Несмотря на это, похоже, что ваш GetItem использует строку как id
, тогда как ваш PutItem использует число.
Убедитесь, что вы используете правильный тип данных, и добавьте try/catch, и ваша проблема должна быть отсортирована.
Оказывается, моя проблема была простой ошибкой пользователя, как обычно! Я проверял количество элементов в таблице, чтобы увидеть, был ли элемент опубликован, не осознавая, что для обновления количества элементов требуется 6 часов. Элементы на самом деле были размещены в конце концов!
Код выглядит разумным. Как вы определяете, что пункт не был написан? Есть вероятность, что вы просматриваете таблицу с именем test не в том регионе AWS?