Я настроил лямбда-триггер Dynamodb, используя эту документацию. Функция успешно запускается при обновлении таблицы dynamodb, и я могу нормально просматривать выходные данные.
Я хочу найти личность пользователя, обновившего таблицу dynamodb, но эта информация, похоже, не включена в событие. Как я могу это сделать?
Событие выглядит так:
{
"Records": [
{
"eventID": "1725dad5b286b22b02cffc28e5006437",
"eventName": "INSERT",
"eventVersion": "1.1",
"eventSource": "aws:dynamodb",
"awsRegion": "us-west-2",
"dynamodb": {
"ApproximateCreationDateTime": 1607759729,
"Keys": {
"receiver": {
"S": "c2217b13-12e8-42a4-a1ab-627f764493c9"
},
"sender": {
"S": "6fad5bc8-a389-4d73-b171-e709d5d8bdd8"
}
},
"NewImage": {
"createdAt": {
"S": "2020-12-12T07:55:29.105Z"
},
"receiver": {
"S": "c2217b13-12e8-42a4-a1ab-627f764493c9"
},
"sender": {
"S": "6fad5bc8-a389-4d73-b171-e709d5d8bdd8"
},
"__typename": {
"S": "FriendRequest"
},
"updatedAt": {
"S": "2020-12-12T07:55:29.105Z"
}
},
"SequenceNumber": "4092400000000003379896405",
"SizeBytes": 261,
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"eventSourceARN": "arn:aws:dynamodb:us-west-2:213277979580:table/FriendRequest-rmzuppsajfhzlfgjehczargowa-apisecure/stream/2020-12-11T07:48:02.462"
}
]
}
Интерфейсное приложение используется для обновления файла dynamodb. В целях безопасности я надеялся сделать лямбда-функцию для проверки пользователя, выполняющего обновление. Поскольку это не представляется возможным, я попытаюсь добавить поле идентификатора пользователя в элемент dynamodb, который каким-то образом заполняется автоматически.
DynamoDB не предоставляет идентификатор пользователя, создавшего запись. Единственный способ добиться этого — сделать так, чтобы идентификатор пользователя был частью элемента DynamoDB. Но это означает, что ваше приложение должно идентифицировать пользователя и записать этот атрибут.
Но это, очевидно, не сработает, если элемент вставляется с помощью консоли AWS. В этом случае вашему пользователю потребуется ввести свой собственный идентификатор (или идентификатор другого пользователя) вручную.
У нас есть аналогичный сценарий, в котором мы хотели бы отслеживать, кто (пользователь) или что (сервис) сделал последнее обновление записи. сначала наша арка выглядит так:
User/Service changes -> API Lambda -> DynamoDB Stream -> Lambda (normalizes stream data) -> Service Event SNS Topic
Все службы или функции, которые заботятся об изменениях, присоединяются к теме SNS, а НЕ к потоку.
Это отлично работает с вставкой/обновлением, у нас есть поле внутреннего использования, в котором мы храним эти данные, они не возвращаются через API CRUD. что-то вроде: updated_by: app:service:region:user/1
Когда мы получаем запись, мы знаем, что этот элемент был обновлен пользователем с идентификатором 1. Поэтому, когда мы создаем тему sns, мы добавляем атрибут сообщения с этим значением.
Удаление немного сложнее, так как вы не можете обновлять и удалять элемент одновременно. то, как мы делаем это в настоящее время, заключается в создании события удаления вручную при удалении, поэтому вместо того, чтобы полагаться на поток, мы асинхронизируем лямбда-функцию и передаем данные пользователя/службы.
User/Service changes -> API Lambda -> Lambda (normalizes stream data) -> Service Event SNS Topic
Зачем вам идентификатор пользователя? И создается ли запись ddb пользователем с помощью консоли ddb или aws cli? Или каким-то внутренним приложением?