Как автоматически обновлять иконку Gravatar с помощью AWS

Вам когда-нибудь хотелось иметь до смерти простую идею проекта для начала работы с AWS?

Что ж, вот вам идея. Создайте функцию Lambda для обновления вашего значка Gravatar, а затем используйте правило EventBridge для запуска этой функции раз в день.

В этом посте я объясню, как можно объединить несколько сервисов AWS для регулярного обновления значка Gravatar.


TL;DR

Посмотрите демонстрационный код.

  1. Используйте grav.client для обновления вашего значка Gravatar
  2. Используйте Secrets Manager для хранения учетных данных для входа в Gravatar
  3. Разверните код обновления Gravatar на Lambda
  4. Создайте правило EventBridge для запуска функции Lambda
  5. Используйте SNS для доставки уведомлений по электронной почте
  6. Настройте сигнализацию CloudWatch для обнаружения сбоя

Содержание

  • Клиент Gravatar
  • AWS CLI
  • Менеджер секретов AWS
    • Ведение домашнего хозяйства
    • Сохранение секретов
    • Получение секретов
  • AWS Lambda
    • Разрешения
    • Создание функции
    • Развертывание функции
    • Тестирование функции
  • Amazon EventBridge
    • Создание правила
    • Фиксированные расписания
  • Amazon Simple Notification Service
    • Создание темы
    • Создание подписки
  • Amazon CloudWatch
    • Создание сигнала тревоги
    • Метрика
    • Условия
  • Заключение
  • Смотрите также

Клиент Gravatar

Прежде всего, необходимо написать код для обновления иконки Gravatar. Мы будем использовать grav.client для использования API Gravatar XML-RPC:

// index.js

const { 
  GravatarClient, 
  LoadNextImageUseCase
} = require('grav.client');

async function handler () {

    const email = "user@example.com";

    const password = "letmein";

    const useCase = new LoadNextImageUseCase();

    useCase.client = new GravatarClient(email, password);

    await useCase.execute();

}

exports.handler = handler;
Вход в полноэкранный режим Выход из полноэкранного режима

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

AWS CLI

Остальная часть нашего обсуждения связана с AWS. AWS CLI может пригодиться, поэтому не забудьте установить его.

Для настройки AWS CLI вам понадобится идентификатор ключа доступа и секретный ключ доступа. Если у вас их нет:

  1. Войдите в консоль управления AWS как пользователь IAM.
  2. Нажмите на свое имя пользователя (заголовок, справа вверху)
  3. В выпадающем списке нажмите Мои учетные данные безопасности
  4. Найдите раздел «Ключи доступа для CLI, SDK и API».
  5. Нажмите Создать ключ доступа

Теперь, с вашего терминала:

$ aws configure
Войдите в полноэкранный режим Выйдите из полноэкранного режима

В результате вам будет предложено ввести ID ключа доступа и секретный ключ доступа. Также будет запрошено имя региона по умолчанию, например us-east-1 или eu-west-2. В этой таблице перечислены название и код для каждого региона.

Вы можете пропустить Формат вывода по умолчанию (по умолчанию это json).

Если все прошло нормально, вы можете провести быстрый эксперимент для проверки:

# sanity check
$ aws sts get-caller-identity

# output
{
    "UserId": "ALP4ABR4V0CH4RL1E",
    "Account": "0123456789012",
    "Arn": "arn:aws:iam::0123456789012:user/example"
}
Войдите в полноэкранный режим Выйти из полноэкранного режима

С этим разобрались, давайте поговорим о менеджере секретов AWS.

Менеджер секретов AWS

Хотя AWS предлагает бесплатную 30-дневную пробную версию, важно отметить, что AWS Secrets Manager не является бесплатным. На момент написания статьи эта услуга стоит $0,40 за секрет в месяц и $0,05 за 10 000 вызовов API. В любом случае, обязательно ознакомьтесь с прайсингом AWS Secrets Manager.

Идея заключается в том, что мы можем использовать Secrets Manager для хранения наших учетных данных для входа в Gravatar. Эти конфиденциальные значения не будут храниться в коде клиента. Вместо этого они будут извлекаться из Secrets Manager на лету.

УХОД

Прежде чем мы продолжим, давайте рефакторим обработчик для размещения кода Secrets Manager.

Эта новая функция будет инкапсулировать вызов API Secrets Manager и возвращать учетные данные для входа в Gravatar:

// get-gravatar-login.js

module.exports = async function getGravatarLogin(){

  // TODO: return Gravatar creds from AWS Secrets Manager

}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь мы можем использовать getGravatarLogin для изменения обработчика:

// index.js

const { 
  GravatarClient, 
  LoadNextImageUseCase
} = require('grav.client');

const getGravatarLogin = require('./get-gravatar-login');

async function handler () {

    const { email, password } = await getGravatarLogin();

    const useCase = new LoadNextImageUseCase();

    useCase.client = new GravatarClient(email, password);

    await useCase.execute();

}
Войти в полноэкранный режим Выход из полноэкранного режима

СОХРАНЕНИЕ СЕКРЕТОВ

AWS Secrets Manager выведет пример кода, который нам нужен для реализации getGravatarLogin.

Найдя Secrets Manager в AWS Management Console, нажмите Store a new secret. Будет 4 шага:

  1. Тип секрета
    • Выберите Другой тип секретов
    • Добавьте пары ключ/значение для электронной почты и пароля вашего Gravatar
      • email: user@example.com
      • пароль: letmein
  2. Название и описание
    • Назовем его demo/gravatar-login.
  3. Настроить ротацию
    • Пропустить
  4. Просмотреть
    • Прокрутите вниз до кода примера
    • Перейдите на вкладку JavaScript
    • Скопируйте/вставьте код примера в тело функции getGravatarLogin.
    • Наконец, не забудьте нажать кнопку Сохранить

Секрет demo/gravatar-login теперь должен быть загружен в Secrets Manager. Используйте AWS CLI для двойной проверки:

# sanity check
$ aws secretsmanager get-secret-value --secret-id demo/gravatar-login

# output
{
    "ARN": "arn:aws:secretsmanager:us-east-1:0123456789012:secret:demo/gravatar-login-dtRw9f",
    "Name": "demo/gravatar-login",
    "VersionId": "e1209b21-4a62-96f1-89cf-bc3c7d2b4c19",
    "SecretString": "{"email":"user@example.com","password":"letmein"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2021-01-03T20:12:11.327000-05:00"
}

Войдите в полноэкранный режим Выйдите из полноэкранного режима

ПОЛУЧЕНИЕ СЕКРЕТОВ

С помощью примера кода, предоставленного Secrets Manager, мы можем реализовать getGravatarLogin. Однако нам потребуется внести несколько изменений.

Во-первых, обратите внимание, что пример кода ссылается на весь aws-sdk, который включает в себя каждый клиент сервиса AWS. Нам нужен только aws-sdk/client-secrets-manager:

// Load the AWS SDK
// var AWS = require('aws-sdk'),
var AWS = require('@aws-sdk/client-secrets-manager'),
...
Вход в полноэкранный режим Выйти из полноэкранного режима

Далее рассмотрим, что код примера полагается на обратный вызов:

client.getSecretValue({SecretId: secretName},
  function(err, data) { ...
Войти в полноэкранный режим Выход из полноэкранного режима

Чтобы избежать ада обратных вызовов, мы вернем Promise, который обернет вызов client.getSecretValue:

function getGravatarLogin(){
  ...
  return new Promise((resolve, reject) => {
    client.getSecretValue({SecretId: secretName}, 
      function(err, data) {
        if(err){
          ...
          reject(err);
        } else {
          ...
          resolve(JSON.parse(secret));
        }
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

В целом, отрефакторенный код должен отражать get-gravatar-login.js.

Функция обработчика импортирует get-gravatar-login.

AWS Lambda

После настройки функции Lambda мало что изменится. Мы просто будем вызывать этот обработчик из облака, а не с локальной машины.

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

ПЕРМИССИИ

Многие сервисы AWS требуют определения роли, которая предоставляет доступ к другим сервисам AWS. Например, вы можете создать роль, которая позволит Lambda взаимодействовать с Secrets Manager.

Вспомните, что наш обработчик делает вызов API к Secrets Manager. Причина, по которой Secrets Manager принимает этот запрос с вашей локальной машины, заключается в том, что вы настроили AWS CLI.

Когда вы развернете обработчик на Lambda, Secrets Manager не примет вызов API, если мы не предоставим функции Lambda достаточные разрешения.

Прежде чем погрузиться в AWS Lambda, давайте создадим новую роль, которая позволит нашей функции Lambda получить доступ к Secrets Manager (и CloudWatch):

  1. Найдите IAM в консоли управления
  2. В разделе Управление доступом нажмите Роли
  3. Нажмите Создать роль
  4. Выберите вариант использования, нажмите Lambda
  5. Нажмите Далее: Разрешения
  6. Найдите SecretsManagerReadWrite и установите флажок
    • То же самое для CloudWatchLogsFullAccess.
  7. Далее: Теги
    • Пропустить
  8. Обзор:
    • Имя роли: UpdateGravatarServiceRole
    • Нажмите Создать роль

Теперь при создании лямбда-функции вы сможете указать UpdateGravatarServiceRole в качестве роли выполнения по умолчанию.

СОЗДАНИЕ ФУНКЦИИ

  1. Найдите AWS Lambda в консоли управления
  2. Нажмите Создать функцию
  3. Основная информация:
    • Имя функции: update-gravatar
    • Роль выполнения: UpdateGravatarServiceRole
    • Нажмите Создать функцию

После создания функции вы увидите опцию конфигурации под названием Основные параметры. Увеличьте значение Timeout с 3 секунд до 30 секунд.

По моему опыту, 3 секунды — это слишком мало. 30 секунд — это разумно. Что-то может быть не так, если обработчик вращается в течение 30 секунд.

РАЗВЕРТЫВАНИЕ ФУНКЦИИ

Теперь мы переносим обработчик с нашей локальной машины в облако.

Обычно мы просто используем консольный редактор Lambda для создания нашей функции непосредственно в облаке. Но консольный редактор не поддерживает npm install.

Решение проблемы:

  1. Запустите npm install локально.
  2. Запилите папку с проектом
    • Вызовите zip-архив update-gravatar.zip.

Дерево папок должно выглядеть следующим образом:

.
├── get-gravatar-login.js
├── index.js
├── node_modules
├── package.json
├── package-lock.json
└── update-gravatar.zip

Войдите в полноэкранный режим Выход из полноэкранного режима

Чтобы отправить zip-архив в Lambda:

# this will take a moment
$ aws lambda update-function-code 
  --function-name update-gravatar 
  --zip-file fileb://update-gravatar.zip
Войти в полноэкранный режим Выйти из полноэкранного режима

ТЕСТИРОВАНИЕ ФУНКЦИИ

Давайте проверим, работает ли это.

В новой вкладке браузера зайдите на сайт https://en.gravatar.com/emails, где вы сможете увидеть свой текущий значок Gravatar и все остальные изображения в вашем аккаунте. Вам потребуется загрузить сюда как минимум 2 изображения.

Вернитесь в другую вкладку, где у вас есть AWS Lambda:

  1. Выберите Настроить тестовые события из выпадающего списка в правом верхнем углу, рядом с кнопкой Тест
  2. Назовите тестовое событие UpdateGravatar.
  3. Нажмите Создать
  4. Нажмите Тест
  5. Перезагрузите Gravatar

Ваш основной значок Gravatar должен обновиться.

Нажатие кнопки Test имеет тот же эффект, что и вызов нашего обработчика с локальной машины. Здесь нет никакой автоматизации.

Нам нужен какой-то другой компонент, управляемый событиями, чтобы периодически и неограниченно вызывать эту функцию Lambda, подобно заданию cron. Для этого мы будем использовать Amazon EventBridge.

Amazon EventBridge

EventBridge возник на базе CloudWatch Events и по сути является ребрендингом CloudWatch Events. Фактически, он использует ту же инфраструктуру и API сервисов, что и CloudWatch Events.

Учитывая это, интересно отметить, что создание правила EventBridge не сильно отличается от создания правила CloudWatch Events. На самом деле, правило EventBridge, которое мы создаем здесь, также приведет к созданию правила CloudWatch Events. Я оставляю доказательство (так сказать) в качестве упражнения для читателя.

СОЗДАНИЕ ПРАВИЛА

Создание правила EventBridge довольно простое, оно следует интуитивно понятной схеме, аналогичной другим службам, которые мы настраивали. Важно отметить, что вы должны нацелиться на лямбда-функцию update-gravatar:

  1. Найдите Amazon EventBridge в консоли управления AWS.
  2. Нажмите Создать правило
  3. Имя: MorningScheduledEvent
  4. Определите шаблон:
    • Выбрать расписание
    • Выражение Cron: «0 10 * * ? *»
  5. Выберите цели:
    • Цель: Лямбда-функция
    • Функция: update-gravatar
  6. Нажмите Создать

ФИКСИРОВАННЫЕ РАСПИСАНИЯ

Вместо использования выражения Cron вам может быть проще тестировать и устранять неполадки с помощью расписания с фиксированной частотой, настроенного на выполнение каждую минуту.

Однако я рекомендую использовать менее частый интервал для показа времени. Имейте в виду, что браузеры будут кэшировать ваш значок в течение 5 минут, прежде чем снова обратиться к Gravatar. Вы можете убедиться в этом, используя Gravatar Email Checker.

Служба простых уведомлений Amazon

Отлично. Теперь у нас есть автоматически обновляющийся значок Gravatar.

Но если из-за чего-то обновление Gravatar не происходит, мы хотим знать об этом.

К счастью, мы можем получать уведомления по электронной почте о любых сбоях. Сначала нам нужно настроить канал связи, называемый темой. Затем мы подпишемся на эту тему, указав адрес электронной почты.

СОЗДАНИЕ ТЕМЫ

  1. Найдите Simple Notification Service в консоли управления AWS Management Console
  2. Нажмите Темы
  3. Нажмите Создать тему
    • Тип: Стандартный
    • Имя: gravatar-updates
    • Нажмите Создать тему

СОЗДАНИЕ ПОДПИСКИ

  1. Нажмите Создать подписку
  2. Подробности
    • Тема: gravatar-updates
    • Протокол: Email
    • Конечная точка: ваш адрес электронной почты

Через несколько минут после создания подписки вы получите письмо с предложением подтвердить подписку.

После подтверждения подписки проверьте ее, нажав кнопку Опубликовать сообщение в консоли SNS. Отправьте форму на следующем экране, и вы получите электронное письмо.

Amazon CloudWatch

Наконец, мы создадим тревогу CloudWatch, чтобы сообщать об ошибках в теме gravatar-updates.

  1. Найдите CloudWatch в консоли управления AWS Management Console
  2. Нажмите Сигналы тревоги
  3. Нажмите Создать сигнал тревоги

СОЗДАТЬ СИГНАЛ ТРЕВОГИ

В разделе Укажите метрику и условия нажмите Выбрать метрику. Внутри появившегося оверлея:

  1. На вкладке Все метрики выберите Лямбда, По имени функции.
  2. Установите флажок Ошибки для функции update-gravatar.
  3. Нажмите Выбрать метрику

Когда оверлей исчезнет и вы вернетесь к шагу 1 (Укажите метрику и условия), появятся два поля, одно для метрики, а другое — для условий:

МЕТРИКА

В этом поле мы настроим сигнализацию на подсчет общего количества ошибок за последние 5 минут.

  • Оставьте имя метрики как «Ошибки».

  • Используйте «Sum» для поля статистики

УСЛОВИЯ

В этом поле мы настроим сигнал тревоги на оценку Метрики по пороговому значению. Выберите Greater/Equal и введите «1» в текстовое поле. Это настроит сигнал тревоги на срабатывание при ошибке лямбда-функции один или более раз.

Нажмите Далее, чтобы перейти к шагу 2, Настройка действий. Здесь мы устанавливаем тему gravatar-updates в качестве получателя уведомлений.

На шаге 3 дайте вашему оповещению имя, а на шаге 4 просмотрите и создайте.

Чтобы увидеть сигнал тревоги в действии:

  1. Перейдите в Менеджер секретов.
  2. Удалите пароль для секрета demo/gravatar-login.
    • Не забудьте вернуть его обратно
  3. Перейдите в Lambda
  4. Запустите функцию update-gravatar.

Вскоре после ошибки функции вы получите уведомление по электронной почте.

Заключение

Это упражнение — довольно легкое введение в serverless на AWS. Если вы новичок в AWS, я рекомендую более подробно изучить каждый из сервисов, которые мы рассмотрели в этом руководстве:

  • Функция-обработчик обновляет Gravatar
  • Lambda размещает обработчик как бессерверную функцию
  • Secrets Manager защищает учетные данные Gravatar
  • EventBridge вызывает функцию Lambda
  • SNS доставляет уведомления по электронной почте
  • CloudWatch отслеживает работу функции Lambda и сообщает SNS об ошибках.

Ваш значок Gravatar должен меняться ежедневно, но если процедура обновления заглохнет, вы получите уведомление по электронной почте.

Спасибо за чтение.

Смотрите также

Генерация ключей доступа для программного доступа

Основы конфигурации AWS

Справочник по командам AWS CLI

Создание и получение секрета

Развертывание лямбда-функций Node.js с помощью архивов .zip-файлов

Выражения расписания для правил

Создание правила для службы AWS

Начало работы с Amazon SNS

Использование аварийных сигналов Amazon CloudWatch

Оцените статью
devanswers.ru
Добавить комментарий