
Реализация систем, управляемых событиями с помощью потоков AWS Lambda и DynamoDB
22 июня 2025 г.По мере того, как облачные архитектуры становятся нормой, разработчики все чаще обращаются к дизайну, управляемую событиями, для создания масштабируемых и слабо связанных приложений. Один мощный шаблон в этом пространстве используетAWS Lambdaв сочетании сDynamoDB потокиПолем Эта настройка позволяет в реальном времени без серверов ответов на изменения данных без опроса или ручного управления инфраструктурой.
В этой статье объясняется, как реализовать систему, управляемую событиями, используя потоки DynamoDB и AWS Lambda. Пошаговый пример реализации с использованием LocalStack также включен для демонстрации того, как архитектура может быть смоделирована локально для целей разработки и тестирования.
Зачем идти на мероприятии?
Архитектуры, управляемые событиями, предлагают несколько ключевых преимуществ:
- Масштабируемость:Параллельное выполнение и упругое вычисление
- Свободная связь:Компоненты общаются через события, а не обдуманные интеграции
- Отзывчивость:Почти в реальном времени обработка изменений
В сочетании с серверами, такими как AWS Lambda, эти преимущества переводятся в системы, которые являются экономически эффективными, устойчивыми и простыми в обслуживании.
Системная архитектура
Вот основная идея:
- Таблица DynamoDB настроена с включенными потоками.
- Когда строка вставлена, обновлена или удалена, генерируется запись потока.
- AWS Lambda вызывается автоматически с партией этих записей.
- Lambda обрабатывает данные и запускает нижестоящие рабочие процессы (например, обмен сообщениями, аналитика, обновления).
Общий вариант использования
Представьте себе систему, которая отслеживает обновления профиля. Когда пользователь меняет свои данные:
- Таблица DynamoDB обновляется.
- Функция Lambda запускается через поток.
- Lambda проверяет обновление, регистрирует его и выдвигает уведомления.
Он полностью автоматизирован и не требует сервера для обслуживания.
Шаги внедрения
Шаг 1: Включить потоки DynamoDB
Включите потоки для вашей таблицы с соответствующим типом представления:
"StreamSpecification": {
"StreamEnabled": true,
"StreamViewType": "NEW_AND_OLD_IMAGES"
}
Шаг 2: Подключите лямбду к потоку
Используя консоль AWS или инфраструктуру в качестве кода (например, SAM, CDK), создайте отображение источника событий между потоком ARN и вашей Lambda.
Шаг 3: Напишите обработчик Lambda
Вот базовый пример Node.js:
exports.handler = async (event) => {
for (const record of event.Records) {
const newImage = AWS.DynamoDB.Converter.unmarshall(record.dynamodb.NewImage);
console.log('Processing update:', newImage);
// Run your business logic
}
};
Шаг 4: Добавьте устойчивость
- Повторение повторения: Настройте DLQS (Dead Letters Ofeues) для неудачных сообщений.
- Идемпотентность: Логика дизайна, чтобы безопасно обрабатывать дублирующие поставки.
- Мониторинг: Используйте CloudWatch и рентгеновский рост, чтобы отслеживать и вызовы журнала.
Оперативное понимание и лучшие практики
- Используйте подготовленную параллелизм для чувствительных к задержке Lambdas.
- Настройка размера партии и параллелизм.
- Используйте журналы CloudWatch, метрики и рентген.
- Сохраняйте выполнение функции за несколько секунд.
- Потоки DynamoDB не гарантируют глобальное упорядочение событий в осколках. Системы должны быть разработаны, чтобы переносить и правильно обрабатывать обработку событий вне порядка.
- Потоковые записи сохраняются максимум 24 часа. Потребители вниз по течению должны быстро обрабатывать события, чтобы избежать потери данных.
- Убедитесь, что IAM Роли и политики тесно подходят. Чрезвычайные конфигурации могут представлять риски безопасности, особенно когда Lambdas взаимодействуют с несколькими службами AWS.
Когда этот шаблон подходит
- Вы должны ответить на изменения данных почти в режиме реального времени без опроса.
- Рабочая нагрузка без хранения и очень масштабируемой, что делает ее идеальной для выполнения без сервера.
- Решение должно легко интегрироваться с другими службами AWS, такими как SNS, SQS или функции Step.
Когда рассмотреть другие подходы
- Ваша система требует строгого глобального упорядочения событий во всех разделах данных.
- Вам необходимо поддерживать сложные многоэтапные транзакции с участием нескольких служб или баз данных.
- Приложение требует, чтобы обработка точно снялась, что может быть трудно достичь без индивидуальной идентичности и логики дедупликации.
Доказательство концепции с использованием LocalStack
Предварительные условия
- Docker - https://www.docker.com
- AWS CLI - https://aws.amazon.com/cli/
- Awslocal CLI - PIP установка AwsCli -Local
- Python 3.9+
Шаг 1: Docker Compose Setup
Create a docker-compose.yml file in your project root:
version: '3.8'
services:
localstack:
image: localstack/localstack
ports:
- "4566:4566" # LocalStack Gateway
- "4510-4559:4510-4559" # External services
environment:
- SERVICES=lambda,dynamodb
- DEFAULT_REGION=us-east-1
- DATA_DIR=/tmp/localstack/data
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./lambda-localstack-project:/lambda-localstack-project
networks:
- localstack-network
networks:
localstack-network:
driver: bridge
Затем разверните LocalStack:
docker-compose up -d
Шаг 2: Создайте таблицу DynamoDB с включенными потоками
awslocal dynamodb create-table \
--table-name UserProfileTable \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--billing-mode PAY_PER_REQUEST
Шаг 3: Напишите обработчик Lambda
Создайте файл с названиемhandler.py:
import json
def lambda_handler(event, context):
"""
Lambda function to process DynamoDB stream events and print them.
"""
print("Received event:")
print(json.dumps(event, indent=2))
for record in event.get('Records', []):
print(f"Event ID: {record.get('eventID')}")
print(f"Event Name: {record.get('eventName')}")
print(f"DynamoDB Record: {json.dumps(record.get('dynamodb'), indent=2)}")
return {
'statusCode': 200,
'body': 'Event processed successfully'
}
Шаг 4: Упакуйте функцию Lambda
zip -r my-lambda-function.zip handler.py
Шаг 5: Создайте функцию лямбды
awslocal lambda create-function \
--function-name my-lambda-function \
--runtime python3.9 \
--role arn:aws:iam::000000000000:role/execution_role \
--handler handler.lambda_handler \
--zip-file fileb://function.zip \
--timeout 30
Шаг 6: Получите поток ARN
awslocal dynamodb describe-table \
--table-name UserProfileTable \
--query "Table.LatestStreamArn" \
--output text
Шаг 7: Создать картирование источника событий
awslocal lambda create-event-source-mapping \
--function-name my-lambda-function \
--event-source <stream_arn> \
--batch-size 1 \
--starting-position TRIM_HORIZON
Заменить `<stream_arn>
`С значением, возвращенным с предыдущего шага.
Шаг 8: Добавьте запись в таблицу
awslocal dynamodb put-item \
--table-name UserProfileTable \
--item '{"id": {"S": "123"}, "name": {"S": "John Doe"}}'
Шаг 9: Проверьте журналы Docker, чтобы увидеть сообщение, напечатанное функцией Lambda
Это должно быть что -то вроде ниже:
Полученное мероприятие:
{
"Records": [
{
"eventID": "98fba2f7",
"eventName": "INSERT",
"dynamodb": {
"ApproximateCreationDateTime": 1749085375.0,
"Keys": {
"id": {
"S": "123"
}
},
"NewImage": {
"id": {
"S": "123"
},
"name": {
"S": "John Doe"
}
},
"SequenceNumber": "49663951772781148680876496028644551281859231867278983170",
"SizeBytes": 42,
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"eventSourceARN": "arn:aws:dynamodb:us-east-1:000000000000:table/UserProfileTable/stream/2025-06-05T01:00:30.711",
"eventSource": "aws:dynamodb",
"awsRegion": "us-east-1",
"eventVersion": "1.1"
}
]
}
Event ID: 98fba2f7
Event Name: INSERT
DynamoDB Record: {
"ApproximateCreationDateTime": 1749085375.0,
"Keys": {
"id": {
"S": "123"
}
},
"NewImage": {
"id": {
"S": "123"
},
"name": {
"S": "John Doe"
}
},
"SequenceNumber": "49663951772781148680876496028644551281859231867278983170",
"SizeBytes": 42,
"StreamViewType": "NEW_AND_OLD_IMAGES"
}
Краткое содержание
На этом этапе вы успешно создали полностью функциональную, местную систему, управляемую событиями, которая имитирует готовую к производству архитектуру AWS-все не оставляя среду разработки.
Эта реализация демонстрирует, как DynamoDB-потоки могут использоваться для захвата изменений в реальном времени в хранилище данных и как эти изменения могут быть эффективно обработаны с помощью AWS Lambda, без серверной вычислительной службы. Включив LocalStack и Docker Compose, вы создали местную среду разработки, которая имитирует ключевые услуги AWS, обеспечивая быструю итерацию, тестирование и отладку.
Вместе эти компоненты предоставляют масштабируемую, экономически эффективную основу для создания современных приложений, управляемых событиями. Эта настройка идеально подходит для вариантов использования, таких как асинхронная обработка, регистрация аудита, обогащение данных, уведомления в реальном времени и многое другое,-все время следования передовым методам в микросервисах и облачном дизайне.
С этим фундаментом вы хорошо полагаете, чтобы расширить архитектуру, интегрируя дополнительные услуги AWS, такие как SNS, SQS, Eventbridge или Step Functs, чтобы поддержать более сложные рабочие процессы и масштабируемость корпоративного класса.
Заключение
Потоки AWS Lambda и DynamoDB вместе предоставляют мощную основу для реализации архитектур, основанных на событиях в облачных приложениях. Обеспечивая реакцию в реальном времени на изменения данных без необходимости постоянных серверов или механизмов опроса, эта комбинация снижает оперативную нагрузку и ускоряет циклы разработки. Разработчики могут сосредоточиться на написании бизнес -логики, в то время как AWS обрабатывает тяжелую работу масштабирования, устойчивости к разломам и управлению инфраструктурой.
Имея лишь несколько шагов конфигурации, вы можете создавать рабочие процессы, которые мгновенно реагируют на создание, обновление или удаление событий в вашем уровне данных. Независимо от того, обогащаете ли вы данные, запускаете уведомления, активность аудита или организацию нижестоящих услуг, этот подход без сервера позволяет вам обрабатывать миллионы событий в день, сохраняя при этом высокую доступность и низкую стоимость.
Помимо технических преимуществ, архитектура, управляемая событиями, способствует чистому разделению проблем, улучшению реагирования на систем и большей гибкости. Это позволяет командам создавать слабо связанные сервисы, которые могут развиваться независимо - хотя бы для микросервисов и распределенных систем.
Дальнейшее чтение
- DynamoDB Streams -https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/streams.html
- AWS Lambda Source Source Mappings -https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapp.html
- Строительство Idempotent Lambdas -https://aws.amazon.com/blogs/compute/building-idempotent-applications-on-aws/
Оригинал