Привет и добро пожаловать 👋🏼 в эту серию блогов, состоящую из двух частей, в которой используется простое, но практичное приложение, демонстрирующее, как интегрировать Redis с AWS Lambda. Первая часть (эта) охватывает приложение — к концу этого блога вы должны развернуть решение, поэкспериментировать с ним и в процессе получить хороший обзор решения.

Вторая часть посвящена аспектам инфраструктуры (точнее, IaaC) — в основном она сосредоточена на AWS CDK, а также на некоторых примерах кода.

Из этой серии блогов вы узнаете:

  • Как использовать Lambda и Redis вместе, включая VPC и другие настройки, чтобы все заработало
  • Как использовать URL-адрес лямбда-функции
  • Как развернуть вашу функцию Lambda в виде контейнера Docker (а не zip-файла)
  • Используйте AWS CDK для создания всех компонентов решения — инфраструктуры (VPC, подсети и т. д.), базы данных, а также функций Lambda (включая несколько стеков в контексте одного приложения CDK).

Я использовал Go для лямбда-функций (aws-lambda-go), а также инфраструктуры (с поддержкой CKD Go), но вы без труда сможете применить концепции к выбранному вами языку программирования.

Как всегда, код доступен на Github

Вот краткий обзор сервисов, задействованных в решении:

  • Amazon MemoryDB for Redis — это надежная служба базы данных в оперативной памяти, совместимая с Redis, что позволяет создавать приложения с использованием тех же гибких и удобных структур данных, API и команд Redis, которые они уже используют сегодня.
  • URL-адрес функции Lambda — это относительно новая функция (на момент написания этого блога), которая предоставляет выделенную конечную точку HTTP(S) для вашей функции Lambda. Это действительно полезно, когда все, что вам нужно, — это одна конечная точка для вашей функции (например, для использования в качестве веб-перехватчика) и вы не хотите устанавливать и настраивать шлюз API.
  • AWS Cloud Development Kit (CDK) полностью посвящен IaaC (инфраструктура как код). Это платформа для определения облачной инфраструктуры в коде и предоставления ее через AWS CloudFormation. Вы можете выбрать из списка поддерживаемых языков программирования (на момент написания — TypeScript, JavaScript, Python, Java, C#/.Net и Go (в предварительной версии для разработчиков)) для определения компонентов вашей инфраструктуры в виде кода, как если бы вы с любым другим приложением!

Приложение Twitter Hashtag Leaderboard

Не волнуйтесь, это проще, чем кажется! Вот архитектура высокого уровня:

Решение можно разделить на две логические части:

  • Первая часть обрабатывает прием твитов: функция Lambda извлекает твиты (из Твиттера), извлекает хэштеги для каждого твита и сохраняет их в MemoryDB (в отсортированном наборе Redis). Эта функция вызывается по расписанию, основанному на правиле в триггере CloudWatch.
  • Вторая часть обеспечивает функциональность таблицы лидеров: это еще одна функция Lambda, которая предоставляет конечную точку HTTP (s) (благодаря URL-адресу функции Lambda) для запроса отсортированного набора и извлечения 10 лучших хэштегов (таблица лидеров).

Я же говорил, это очень просто!

Хорошо, со вступлением покончено, мы можем перейти к самой интересной части — развертыванию приложения. Перед этим убедитесь, что у вас есть следующее:

Требования

Развертывание приложения — по одному стеку CDK за раз

Подробности мы расскажем во второй части. Пока просто знайте, что инфраструктурная часть этого решения состоит из трех (CDK) стеков (в контексте одного CDK App). Хотя можно развернуть их все вместе (с cdk deploy --all), мы будем делать это по одному. Таким образом, вы можете просмотреть, что происходит на каждом этапе, изучить созданные компоненты и лучше понять, как все связано друг с другом.

Сначала клонируйте репозиторий Github:

git clone https://github.com/abhirockzz/twitter-leaderboard-app

Начнем с инфраструктуры…

Первый стек развертывает VPC (а также подсети, NAT-шлюз и т. д.), кластер MemoryDB для Redis и несколько групп безопасности.

Выберите пароль по вашему выбору для MemoryDB и экспортируйте его как переменную среды (это только для демонстрационных целей — для производства у вас будут специальные процессы для обработки конфиденциальной информации)

Помните о требованиях к паролю. Из документации:

«В частности, помните об этих ограничениях паролей пользователей при использовании ACL для MemoryDB:

  • Пароли должны содержать от 16 до 128 печатных символов.
  • Не допускаются следующие небуквенно-цифровые символы: , "" / @."

Перейдите в нужную папку и запустите развертывание стека:

export MEMORYDB_PASSWORD=<enter a password e.g. P@ssw0rd12345678>
cd cdk
# stack1 is the name of the stack - used for simplicity
cdk deploy stack1

Предстоит многое сделать. Пока CDK усердно работает для нас, вам нужно терпеливо ждать :) Сейчас самое время перейти к CloudFormation в консоли AWS и посмотреть, что происходит за кулисами.

После завершения создания стека перейдите в консоль AWS и проверьте свой только что созданный VPC, кластер MemoryDB и другие компоненты!

Вот вывод стека для справки:

Следующие два стека развертывают отдельные функции Lambda. Прежде чем двигаться дальше, убедитесь, что вы собрали двоичные файлы Go для обеих этих функций.

Иди, строй!

Перейдите в соответствующие папки и просто вызовите go build для каждой функции:

cd tweet-ingest && GOOS=linux go build -o app
cd leaderboard-function && GOOS=linux go build -o app

Чтобы упаковать функцию Lambda в виде контейнера Docker, я использовал базовый образ Go:1.x. Но вы можете изучить и другие варианты. Во время развертывания (через cdk deploy) образ Docker создается локально, помещается в частный реестр ECR и, наконец, создается функция Lambda — и все это с помощью нескольких строк кода!

Второй стек — для первой лямбда-функции

Для этой функции требуются ваши учетные данные Twitter API (вместе с паролем MemoryDB) — заполните их как переменные среды. Затем инициируйте создание стека:

export MEMORYDB_PASSWORD=<enter the password you had previously chosen e.g. P@ssw0rd12345678>
export TWITTER_API_KEY=<enter twitter API key>
export TWITTER_API_SECRET=<enter twitter API secret>
export TWITTER_ACCESS_TOKEN=<enter twitter access token>
export TWITTER_ACCESS_TOKEN_SECRET=<enter twitter API access token secret>
# note the name of the stack is stack2
cdk deploy stack2

Этот будет быстрее (по сравнению с stack1), обещаю!

После завершения создания стека, чтобы все заработало, требуется выполнить один ручной шаг. Перейдите в консоль AWS, откройте только что созданную функцию Lambda (с именем tweet-ingest-function), нажмите Добавить триггер и вручную добавьте конфигурацию триггера CloudWatch.

Теперь ваша функция будет автоматически запускаться раз в минуту!

Чтобы проверить, как идут дела, проверьте журналы для вашей функции Lambda (консоль AWS › Lambda › Monitor):

Я также рекомендую вам проверить конфигурацию VPC для вашей функции Lambda:

И, наконец, разверните функцию таблицы лидеров.

export MEMORYDB_PASSWORD=<enter the password you had previously chosen e.g. P@ssw0rd12345678>
# note the name of the stack is stack3
cdk deploy stack3

После успешного развертывания у вас должен быть готовый URL-адрес лямбда-функции — вы можете просто скопировать его из вывода стека!

Просто получите доступ к конечной точке (я использовал curl CLI, но браузер должен работать нормально):

curl -i <enter lambda function URL from the stack output>

Вы должны получить полезную нагрузку JSON с информацией о 10 лучших хэштегах вместе с их именами и количеством раз, когда они были упомянуты — что-то вроде этого:

[
  {
    "Score": 121,
    "Member": "AWS"
  },
  {
    "Score": 56,
    "Member": "gaming"
  },
  {
    "Score": 56,
    "Member": "RESTOCK"
  },
  {
    "Score": 56,
    "Member": "ALERT"
  },
  {
    "Score": 35,
    "Member": "aws"
  },
  {
    "Score": 26,
    "Member": "rtx3080"
  },
  {
    "Score": 26,
    "Member": "geforce3080"
  },
  {
    "Score": 24,
    "Member": "Infographic"
  },
  {
    "Score": 23,
    "Member": "箱マスク"
  },
  {
    "Score": 23,
    "Member": "startups"
  }
]

На этом заканчивается первая часть. Во втором мы погрузимся в аспекты CDK и посмотрим на код Go — увидимся там!