Давайте создадим безопасный и наблюдаемый Python REST API с FastAPI, AWS Lambda, API Gateway, CloudWatch и AWS X-Ray.

В Части 1 этой статьи мы обсудили, как создать и развернуть приложение FastAPI в AWS с помощью API Gateway и Amazon Lambda. В части 2 мы будем опираться на это, чтобы убедиться, что наш API безопасен, прост в повторном развертывании и что мы можем отслеживать его работоспособность с помощью распределенного ведения журнала и трассировки. Эта статья основана на нисходящем подходе: сначала мы создадим все ресурсы, а затем более подробно рассмотрим их и обсудим, как все эти службы работают вместе.

Оглавление:

  1. Защитите API, создав ключ API и назначив ему план использования.
  2. Тестирование ключа API в Postman
  3. Внесение изменений в API и его повторное развертывание
  4. Включение журналов CloudWatch и распределенной трассировки через X-Ray
  5. Погрузитесь глубже в то, как все это работает вместе
  6. Заключение

1. Защитите API, создав ключ API и назначив ему план использования.

Требуется ключ API

Во-первых, в API-шлюзе нам нужно установить для параметра «Требуется ключ API» значение true как для прокси метода, так и для ресурса:

Создать ключ API

Перейдите в раздел «Ключи API» на левой панели навигации:

Теперь мы можем создать КЛЮЧ API: Действия → Создать ключ API → Сохранить:

Создать план использования

Затем давайте создадим план использования [1]: перейдите в Планы использования (на левой панели навигации над ключами API) → Создать:

Когда у нас есть план использования, мы можем связать его с нашим API, развернутым на dev этапе:

Давайте также свяжем ранее созданный КЛЮЧ API с этим планом использования:

Теперь важная часть: чтобы активировать изменения ключа API, нам нужно повторно развернуть наш dev этап API:

2. Тестирование ключа API

Теперь в нашем браузере мы должны увидеть сообщение «запрещено» (изменения вступят в силу в течение 1-2 минут).

Мы можем протестировать использование с нашим ключом API через Почтальон:

  • Сначала нажмите «Показать» рядом с ключом API, затем скопируйте ключ API и вставьте его в Postman в заголовок запроса в поле Value:

  • Key должен быть установлен на x-api-key, а Value - это ваш ключ API, скопированный из консоли управления:

После того, как вы нажмете «Отправить», вы должны увидеть правильный ответ API.

3. Внесение изменений в API и повторное развертывание.

Вы можете скачать код этого проекта из этого репозитория Github.

Давайте внесем небольшие изменения в возвращаемое значение корневого пути:

Чтобы внести эти изменения в API, развернутый в AWS, мы повторяем шаги по упаковке кода, как указано в части 1 этой статьи:



Нам необходимо:

  • заархивируйте код со всеми его зависимостями
  • загрузите этот zip-файл на S3
  • обновите лямбда-функцию.

Все это можно сделать с помощью следующих строк:

После выполнения команды: bash package_and_update_lambda_code.bash мы должны увидеть изменения, отраженные в API (нет необходимости повторно развертывать этап API, поскольку мы внесли изменения только в базовую функцию Lambda, а не в ресурс шлюза API ):

4. Включение журналов CloudWatch и распределенной трассировки через X-Ray.

Чтобы воспользоваться преимуществами централизованного ведения журнала, все, что нам нужно сделать, это установить флажок рядом с CloudWatch Logs. Вот и все! Мы можем выбрать желаемый уровень журнала и указать, нужно ли регистрировать полные данные запроса / ответа.

Кроме того, мы можем включить ведение журнала доступа, которое может быть полезно, чтобы увидеть, какие пользователи или агенты используют определенные конечные точки. Таким образом, мы будем отслеживать записи доступа, если что-то пойдет не так.

Рентген: карта обслуживания

После включения X-Ray Tracing и выполнения нескольких запросов API мы должны увидеть собранные трассировки и метрики:

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

Отслеживание журналов API в CloudWatch

Чтобы найти правильную группу журналов для вашего API, найдите ту, которая начинается с идентификатора API. Затем вы можете найти журналы всех запросов и ответов API:

5. Погрузитесь глубже в то, как все это работает вместе.

Давайте подробнее рассмотрим, как работают эти сервисы и как их эффективно использовать.

1. Что такое план использования?

API Gateway позволяет нам создавать API, которые можно монетизировать как продукт. План использования вместе со связанными ключами API позволяет нам предлагать наш API авторизованным клиентам с определенной частотой запросов и скоростью:

«В плане использования указывается, кто может получить доступ к одному или нескольким развернутым этапам и методам API, а также сколько и насколько быстро они могут получить к ним доступ ». [4]

Это означает, что, назначая ключ API конкретному плану использования на определенном этапе API (например, dev или prod), мы можем достичь другого уровня разрешений и различных ограничений регулирования для различных этапов API. Мы можем назначить множество ключей API для каждого плана использования, что обеспечивает точный контроль доступа.

2. Как мы используем ключи API?

Ключи API - это простые строки (30–128 символов), которые могут быть назначены планам использования или авторизаторам Lambda. Они позволяют нам назначать разрешения на этапе API и уровне типа запроса.

Например, мы могли бы хотеть иметь более открытый доступ на этапе dev и более ограниченный доступ на этапе prod. Это означает, что привилегированный пользователь может получить доступ к обоим этапам dev и prod, в то время как другой пользователь может получить ключ API, который назначается только плану использования, соответствующему этапу dev API.

3. Как мы можем различать журналы CloudWatch для выполнения Lambda и запросов шлюза API?

CloudWatch хранит журналы в отдельных группах журналов, соответствующих каждой службе (например, API-шлюз) и ресурсу в этой службе (ваш конкретный API). Вы можете определить группу журналов, соответствующую журналам вашего API Gateway, посмотрев свой идентификатор API. Вы можете найти его в своей конечной точке URL или в консоли управления:

https://<API-ID>.execute-api.<REGION>.amazonaws.com/<API_STAGE>

Группа журналов, соответствующая вашему API в API Gateway, будет выглядеть примерно так:

API-Gateway-Execution-Logs_<YOUR_API_ID>/<YOUR_API_STAGE>

Журналы Amazon Lambda можно идентифицировать по имени функции:

/aws/lambda/<YOUR_FUNCTION_NAME>

4. Как работает рентген?

X-Ray - это сервис для распределенной трассировки. Он отслеживает такие показатели, как задержка и процент успешных запросов к нашему API, а также то, как различные компоненты в нашем сервисе зависят друг от друга. Основное преимущество X-Ray заключается в том, что он генерирует карту услуг, которая позволяет нам анализировать, за какими запросами следуют другие нисходящие запросы и каковы потенциальные узкие места в нашем API.

На внутреннем уровне X-Ray генерирует трассировки, используя сегменты, т. Е. Вычислительные ресурсы, которые выполняют наши запросы API, такие как API Gateway и Amazon Lambda. Эти сегменты можно разбить на подсегменты для более детальной трассировки - например, мы могли бы использовать Python SDK X-Ray в нашем коде FastAPI, чтобы добавлять новые подсегменты, делать аннотации и в целом делать наши следы более зернистые.

Одна трассировка собирает все сегменты и подсегменты, созданные в результате определенного запроса.

5. Автоматически ли X-Ray отслеживает и записывает каждый запрос?

Короткий ответ: нет. Измерение каждого отдельного запроса было бы дорогостоящим и, вероятно, ненужным (если для первых 50 запросов одного типа потребовалось 200 мсек каждый, то это, вероятно, будет таким же для следующих пяти миллионов последующих запросов). X-Ray использует репрезентативные образцы: по умолчанию он отслеживает первый запрос в секунду плюс 5% всех дополнительных запросов. Это правило выборки можно настроить на основе свойств ваших конкретных запросов [2].

Также существует два разных типа отслеживания: активное и пассивное. Оба имеют одинаковый эффект, поскольку они приводят к рентгеновской выборке запросов и сбору трассировок.

Когда мы включаем X-Ray в API-шлюзе, который вызывает нашу лямбда-функцию, это означает, что для этой лямбда-функции включена пассивная трассировка в качестве восходящей службы (т.е. API-шлюз). заботится о добавлении заголовка трассировки, который сообщает Lambda, отправлять ли трассировки или нет. Напротив, если мы включили трассировку непосредственно из конфигурации Lambda, а не из шлюза API, это будет активная трассировка.

5. Чем X-Ray отличается от CloudWatch и CloudTrail?

X-Ray позволяет нам собирать показатели о нашем конкретном API или микросервисе. CloudTrail имеет гораздо более широкую «аудиторию»: поскольку все в AWS является вызовом API, каждое действие, совершаемое в нашей учетной записи AWS, можно отслеживать с помощью CloudTrail. Можно интегрировать X-Ray с CloudTrail, чтобы отслеживать дополнительные действия, совершаемые пользователем, ролью IAM или любым сервисом AWS, и анализировать их с помощью трассировок X-Ray [3].

Напротив, CloudWatch позволяет нам отслеживать журналы выполнения, журналы доступа или даже полные данные запросов и ответов и анализировать их либо непосредственно в консоли CloudWatch, либо в таком инструменте, как Kibana или Grafana.

В то время как CloudWatch предоставляет нам подробные журналы, X-Ray предоставляет только показатели задержки и статуса выбранных запросов.

6. Сколько стоят эти услуги?

Цены зависят от вашего региона AWS, типа API (REST, HTTP) и количества запросов (массовая скидка). На момент написания:

  • API Gateway стоит от 1 до 4,25 доллара за миллион запросов.
  • AWS X-Ray оценивается примерно в 1 доллар за миллион трасс.
  • Плата за AWS Lambda взимается в зависимости от количества вызовов и продолжительности работы вашего кода, измеряемой в миллисекундах.
  • Наконец, журналы CloudWatch стоят от 0,50 до 0,90 доллара за гигабайт журналов, собираемых в месяц (опять же, цена варьируется в зависимости от региона).

Вы можете использовать AWS Pricing Calculator, чтобы получить более реалистичную оценку, соответствующую вашему варианту использования. Также обратите внимание, что с уровнем бесплатного пользования вы получаете (ограниченный) бесплатный доступ к журналам API Gateway, Amazon Lambda и CloudWatch.

6. Заключение

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

Если эта статья была полезной, подписывайтесь на меня, чтобы увидеть мои следующие статьи.

Ссылки:

[1] Документация по API Gateway о планах использования

[2] Документы AWS X-Ray по запросам выборки и трассировке.

[3] Курс AWS Edx Создание современных приложений Python на AWS