Как локально запустить мою бессерверную функцию cloudflare worker во время разработки?

Мне удалось развернуть моего первого воркера Cloudflare с использованием бессерверной среды в соответствии с https://serverless.com/framework/docs/providers/cloudflare/guide/, и он работает, когда я попадаю в облако.

Во время разработки хотел бы иметь возможность тестировать на http://localhost:8080/ *

Каков самый простой способ вызвать локальный http-сервер и обрабатывать мои запросы с помощью функции, указанной в serverless.yml?

Я просмотрел https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint, но сценария запуска нет.

Кажется, нет примеров для облачной вспышки на https://github.com/serverless/




Ответы (3)


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

А пока есть несколько вариантов, которые вы можете попробовать:

Сторонний эмулятор

Cloudworker - это эмулятор для Cloudflare Workers, который запускается локально поверх node.js. Он был построен инженерами Dollar Shave Club, компании, которая использует Workers, а не Cloudflare. Поскольку это полностью независимая реализация среды Workers, вероятно, будут небольшие отличия между ее поведением и «реальной вещью». Однако этого достаточно, чтобы поработать.

Предварительный просмотр Service API

Предварительный просмотр на cloudflareworkers.com доступен через API. С помощью некоторых curl команд вы можете загрузить свой код на cloudflareworkers.com и запустить на нем тесты. Это не совсем "локально", но если вы все равно всегда подключены к Интернету, это почти то же самое. Вам не нужны какие-либо специальные учетные данные для использования этого API, поэтому вы можете написать несколько скриптов, которые будут использовать его для запуска модульных тестов и т. Д.

Загрузите скрипт под названием worker.js, POST поместив его в https://cloudflareworkers.com/script:

SCRIPT_ID=$(curl -sX POST https://cloudflareworkers.com/script \
  -H "Content-Type: text/javascript" --data-binary @worker.js | \
  jq -r .id)

Теперь $SCRIPT_ID будет 32-значным шестнадцатеричным числом, идентифицирующим ваш скрипт. Обратите внимание, что идентификатор основан на хэше, поэтому, если вы дважды загрузите один и тот же скрипт, вы получите тот же идентификатор.

Затем сгенерируйте случайный идентификатор сеанса (32 шестнадцатеричных цифры):

SESSION_ID=$(head -c 16 /dev/urandom | xxd -p)

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

Также определим две части конфигурации:

PREVIEW_HOST=example.com
HTTPS=1

Они указывают, что при запуске вашего воркера предварительный просмотр должен работать так, как если бы он был запущен на https://example.com. URL-адрес и заголовок Host входящих запросов будут переписаны на этот протокол и имя хоста. Установите HTTPS=1, если URL-адреса должны быть HTTPS, или HTTPS=0, если нет.

Теперь вы можете отправить своему работнику запрос, например:

curl https://00000000000000000000000000000000.cloudflareworkers.com \
  -H "Cookie: __ew_fiddle_preview=$SCRIPT_ID$SESSION_ID$HTTPS$PREVIEW_HOST"

(32 нуля могут быть любыми шестнадцатеричными цифрами. При предварительном просмотре в браузере они генерируются случайным образом, чтобы файлы cookie и кешированный контент не мешали сеансам. Однако при использовании curl это не имеет значения, поэтому все нулевые Это хорошо.)

Вы можете изменить эту строку curl, чтобы включить путь в URL-адрес, использовать другой метод (например, -X POST), добавить заголовки и т. Д. Пока имя хоста и файл cookie такие, как показано, он будет передан вашему рабочему предварительному просмотру.

Наконец, вы можете подключить консоль devtools для отладки в Chrome (в настоящее время, к сожалению, работает только в Chrome):

google-chrome https://cloudflareworkers.com/devtools/inspector.html?wss=cloudflareworkers.com/inspect/$SESSION_ID&v8only=true

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

person Kenton Varda    schedule 23.12.2018
comment
Спасибо за отличный ответ. - person tzador; 24.12.2018
comment
Параметры API службы предварительного просмотра открывают несколько интересных дверей, мы попробуем немного поиграть с ними. - person tzador; 24.12.2018
comment
Есть ли способ добавить модуль wasm? - person Edouard; 18.01.2019
comment
@Edouard Да, формат multipart / form-data, используемый для загрузки модулей script + WASM в обычный Cloudflare API, также поддерживается cloudflareworkers.com/script API. - person Kenton Varda; 18.01.2019
comment
Просто чтобы сообщить, что есть небольшая опечатка в документации по адресу (developers.cloudflare.com/workers/api/resource-bindings/) с application/javsacript вместо application/javascript (раздел вызовов API). - person Edouard; 18.01.2019

Вы также можете протестировать локально, загрузив работника Cloudflare в качестве работника сервиса.

Примечание:

  • Используйте локальный веб-сервер с https :. Рабочие не загружаются с использованием протоколов file: или http :.
  • Ваш браузер должен поддерживать воркеров, поэтому вы не можете использовать IE.
  • Смоделируйте любые особенности Cloudflare, например KV.

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
</head>

<body>
  <!-- Service worker registration -->
  <script>
    if ('serviceWorker' in navigator) {
      // Register the ServiceWorker
      navigator.serviceWorker.register('/service-worker.js')
        .then(
          function(reg) {
            // Registration succeeded
            console.log('[registerServiceWorker] Registration succeeded. Scope is ' + reg.scope)
            window.location.reload(true)
          })
        .catch(
          function(error) {
            // Registration failed
            console.log('[registerServiceWorker] Registration failed with ' + error)
          })
    } else {
      console.log('[registerServiceWorker] Service workers aren\'t supported')
    }
  </script>
</body>

</html>

person Aaron Queenan    schedule 05.07.2019

Dollar Share Club создал Cloudworker. Он не поддерживается активно, но является способом локального запуска Cloudflare Workers.

Вы можете прочитать об этом в блоге Cloudflare в гостевой сообщение оригинального сопровождающего Cloudworker.

person Tomáš Hübelbauer    schedule 21.03.2020