Интеграция Apache APISIX с Azure Serverless
API7.ai
December 1, 2021

Apache APISIX предоставляет поддержку серверных фреймворков для популярных облачных провайдеров (и продолжает расширять список). Вместо того чтобы жестко прописывать URL функции в приложении, Apache APISIX предлагает определить маршрут с включенным плагином для серверных функций. Это дает разработчикам гибкость в обновлении URI функции "на лету", а также возможность полностью сменить провайдера FaaS на другого облачного поставщика без лишних хлопот. Кроме того, этот подход устраняет проблемы авторизации и аутентификации из логики приложения, так как Apache APISIX обладает мощной поддержкой аутентификации, которая может быть использована для идентификации и авторизации клиентов, запрашивающих доступ к определенному маршруту с FaaS. В этой статье рассказывается о недавнем добавлении нового плагина azure-functions, а также даются подробные инструкции по интеграции Azure Functions, широко используемого серверного решения, в серверный набор Apache APISIX.
Как работает плагин azure-functions
Плагин azure-functions позволяет пользователям определить апстрим для серверной функции HTTP Trigger Azure для URI шлюза. Если плагин включен, он завершает текущий запрос к этому URI и инициирует новый запрос к FaaS Azure (новый апстрим) от имени клиента с подходящими данными авторизации, установленными пользователями, заголовками запроса, телом запроса и параметрами (все эти три компонента передаются из оригинального запроса), а затем возвращает тело ответа, код состояния и заголовки обратно клиенту, который инициировал запрос к агенту Apache APISIX.
Плагин поддерживает авторизацию для сервиса FaaS Azure через API-ключи и Azure Active Directory.
Как использовать Azure Functions с Apache APISIX
Основная цель плагина — проксировать маршрут шлюза, указанный в конфигурации маршрута, на URI функций Azure. В этом разделе приведено практическое руководство по настройке и созданию серверного HTTP Trigger в облаке Azure.
-
Сначала зарегистрируйтесь/войдите в Microsoft Azure и настройте пробный план. Azure Functions бесплатны до 1 миллиона вызовов. Чтобы узнать больше о ценах, посетите здесь.
-
Перейдите на портал Azure (FYI, сервисы Azure доступны через веб-портал, CLI и VSCode. Для удобства мы используем веб-портал).
- Сначала создайте группу ресурсов для логического разделения вашего FaaS, который вы собираетесь создать.

- Создайте приложение-функцию с URL-адресом по вашему выбору (я выберу test-apisix).

- Сначала создайте группу ресурсов для логического разделения вашего FaaS, который вы собираетесь создать.
-
Установите расширение Azure Functions в редактор VSCode. После установки пройдите аутентификацию через расширение и установите инструмент Azure Functions Core Tools для локальной разработки с помощью:
npm install -g azure-functions-core-tools@3 --unsafe-perm true -
Разверните следующий фрагмент кода в том же приложении-функции, которое мы только что создали, через панель расширения Azure Functions в VSCode:
module.exports = async function (context, req) { context.log("HTTP trigger invoked on Test-APISIX."); const name = req.query.name || (req.body && req.body.name); const responseMessage = name ? "Hello, " + name : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response."; context.res = { // status: 200, /* По умолчанию 200 */ body: responseMessage, }; };
Этот фрагмент кода берет имя из параметров запроса (если присутствует, иначе из тела запроса) и приветствует пользователя.
Активация плагина azure-functions
Ниже приведен пример того, как включить плагин azure-functions для конкретного маршрута. Мы предполагаем, что ваш HTTP Trigger развернут и готов к использованию.
# включение плагина для конкретного маршрута curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger", "authorization": { "apikey": "<Сгенерированный API-ключ для доступа к Azure-Function>" } } }, "uri": "/azure" }'
Теперь любые запросы (HTTP/1.1, HTTPS, HTTP2) к URI /azure на шлюзе Apache APISIX будут вызывать HTTP-вызов к указанному URI функции, а тело ответа, заголовки и код состояния будут проксированы обратно клиенту. Например (здесь облачная функция Azure просто берет параметр запроса name и возвращает Hello $name):
curl -i -XGET http://localhost:9080/azure\?name=Bisakh HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071 Date: Wed, 19 Nov 2021 18:46:55 GMT Server: APISIX/2.10.2 Hello, Bisakh
Учитывая, что Apache APISIX также работает с enable_http2: true в config-default.yaml для порта 9081 (например), любое общение по HTTP/2 между клиентом и агентом APISIX будет проксировано в FaaS Azure аналогично HTTP/1.1, а ответы будут проксированы обратно клиенту с соответствующими заголовками. Например:
curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh HTTP/2 200 content-type: text/plain; charset=utf-8 request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071 Date: Wed, 19 Nov 2021 18:46:56 GMT server: APISIX/2.10.2 Hello, Bisakh
Деактивация плагина azure-functions
Теперь, чтобы отключить плагин, просто удалите соответствующую JSON-конфигурацию в конфигурации плагина, чтобы отключить плагин azure-functions, и добавьте подходящую конфигурацию апстрима. Плагины Apache APISIX перезагружаются "на лету", поэтому нет необходимости перезапускать Apache APISIX.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/azure", "plugins": {}, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'
Пользовательская конфигурация
В минимальной конфигурации при создании нового маршрута с включенным плагином azure-functions обязательным атрибутом конфигурации плагина является function_uri, который указывает на URL функции. Существует множество дополнительных опций, которые можно настроить с помощью схемы плагина и схемы метаданных.
Схема плагина
| Имя | Тип | Обязательно | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|---|
| function_uri | string | required | n/a | n/a | Конечная точка функции Azure, которая запускает серверный код функции (например, http://test-apisix.azurewebsites.net/api/HttpTrigger). |
| authorization | object | optional | n/a | n/a | Учетные данные авторизации для доступа к облачной функции. |
| authorization.apikey | string | optional | n/a | n/a | Поле внутри authorization. Сгенерированный API-ключ для авторизации запросов к этой конечной точке. |
| authorization.clientid | string | optional | n/a | n/a | Поле внутри authorization. Client ID (Azure Active Directory) для авторизации запросов к этой конечной точке. |
| timeout | integer | optional | 3000 | [100,...] | Таймаут прокси-запроса в миллисекундах. |
| ssl_verify | boolean | optional | true | true/false | Включена ли проверка SSL сервера. |
| keepalive | boolean | optional | true | true/false | Повторное использование одного и того же прокси-соединения в ближайшем будущем. Установите false, чтобы отключить keepalive и немедленно закрыть соединение. |
| keepalive_pool | integer | optional | 5 | [1,...] | Максимальное количество соединений в пуле. |
| keepalive_timeout | integer | optional | 60000 | [1000,...] | Максимальное время простоя (мс). |
Это дает большую гибкость для точной настройки поведения FaaS Azure — от настройки таймаута до пула keepalive и проверки SSL-сертификата серверного FaaS. Честно говоря, это действительно важно, когда речь идет о серверных функциях, так как сервисы являются событийно-ориентированными, а ресурсы выделяются облачным провайдером на лету.
Схема метаданных
Аналогично, есть несколько атрибутов, которые можно настроить с помощью метаданных.
| Имя | Тип | Обязательно | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|---|
| master_apikey | string | optional | "" | n/a | Главный API-ключ, который может быть использован для доступа к URI функции Azure. |
| master_clientid | string | optional | "" | n/a | Client ID (Active Directory), который может быть использован для авторизации URI функции. |
Метаданные для плагина azure-functions предоставляют функциональность для резервной авторизации. Они определяют master_apikey и master_clientid (Client ID Azure Active Directory), где пользователи (опционально) могут определить главный API-ключ или Client ID для критически важных приложений. Таким образом, если в атрибутах плагина не найдены данные авторизации, используются данные авторизации из метаданных.
Относительный порядок приоритета следующий:
- Сначала плагин ищет ключи
x-functions-keyилиx-functions-clientidв заголовке запроса к агенту Apache APISIX. - Если они не найдены, плагин
azure-functionsпроверяет данные авторизации в атрибутах плагина. Если они присутствуют, он добавляет соответствующий заголовок в запрос, отправляемый в облачную функцию Azure. - Если данные авторизации не найдены в атрибутах плагина, Apache APISIX извлекает конфигурацию метаданных для этого плагина и использует главные ключи.
Чтобы добавить новый главный API-ключ, выполните запрос к конечной точке /apisix/admin/plugin_metadata с обновленными метаданными следующим образом:
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "master_apikey" : "<Ваш главный ключ доступа Azure>" }'
Итог
Плагин azure-functions — это второй плагин Apache APISIX, разработанный для серверных функций. Мы разрабатываем другие серверные плагины и представим их в будущих выпусках Apache APISIX. Если вы заинтересованы, не стесняйтесь создать issue, чтобы поделиться своими идеями. Вы также можете обсудить свои предложения по разработке нового плагина в нашем списке рассылки!