Как локально запустить мою серверную функцию cloudflare в процессе разработки?
Мне удалось развернуть моего первого работника 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/ нет примеров использования cloudflare.
1 ответ
В настоящее время нет способа запустить реальную среду Cloudflare Workers локально. Коллектив Workers знает, что разработчикам это необходимо, но для отделения основной среды выполнения Workers от остальной части программного стека Cloudflare, которая в противном случае слишком сложна для локального запуска, потребуется определенная работа.
Между тем, есть несколько вариантов, которые вы можете попробовать вместо:
Сторонний эмулятор
Cloudworker - это эмулятор для Cloudflare Workers, который работает локально поверх node.js. Он был построен инженерами в Dollar Shave Club, компании, которая использует Workers, а не Cloudflare. Поскольку это полностью независимая реализация среды Workers, между ее поведением и "реальной вещью", скорее всего, будут небольшие различия. Тем не менее, это достаточно хорошо, чтобы сделать некоторую работу.
API службы предварительного просмотра
Предварительный просмотр на https://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)
Важно, чтобы этот идентификатор сеанса был криптографически случайным, потому что любой, у кого есть идентификатор, сможет подключить devtools к вашему предварительному просмотру и отладить его.
Давайте также определим две части конфигурации:
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
в браузере и глядя на запросы, которые он делает.
Вы также можете выполнить локальное тестирование, загрузив работника 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>
Dollar Share Club создал Cloudworker. Он активно не поддерживается, но это способ запустить Cloudflare Рабочие локально.
Вы можете прочитать об этом в блоге Cloudflare в гостевом посте первоначального сопровождающего Cloudworker.