Локальная разработка с облачными функциями для Node.js с использованием кода Visual Studio

1. Обзор

Google Cloud Functions — это бессерверная вычислительная платформа, управляемая событиями. Облачные функции позволяют вам писать код, не беспокоясь о предоставлении ресурсов или масштабировании для удовлетворения меняющихся требований.

Облачные функции, написанные на Javascript, выполняются в среде Node.js на Google Cloud Platform. Вы можете запустить свою облачную функцию в любой стандартной среде выполнения Node.js, чтобы обеспечить переносимость и локальное тестирование.

Прохождение

В этой лаборатории кода вы создадите облачную функцию для Node.js, которая сообщает, является ли указанная температура приемлемой или слишком высокой. Вы будете создавать, тестировать и отлаживать свою облачную функцию с помощью кода Visual Studio на своем локальном компьютере. Наконец, вы развернете свою функцию в Google Cloud Platform.

Что вы узнаете

  • Фреймворк функций для Node.js.
  • Создайте и протестируйте облачную функцию HTTP локально.
  • Отладьте функцию HTTP на своем локальном компьютере.
  • Разверните функцию HTTP на своем локальном компьютере.

2. Настройка и требования

Предварительные условия

Затраты

Хотя для этой лаборатории кода требуется только один вызов развернутой облачной функции, вам все равно следует обратиться к информации о ценах API облачных функций , чтобы понять, как работает выставление счетов.

Хотя многие API Google можно использовать бесплатно, использование Google Cloud Platform (т. е. ее продуктов и API) не является бесплатным. Для использования облачных функций вам понадобится активная учетная запись для выставления счетов. Имейте в виду, что некоторые продукты Google Cloud Platform (GCP) имеют уровень «Всегда бесплатно», превышение которого необходимо для выставления счетов. Для целей лаборатории кода каждый вызов облачных функций учитывается в рамках этого уровня бесплатного пользования. Пока вы остаетесь в пределах его совокупного лимита (в течение каждого месяца), вы не должны нести никаких расходов.

3. Установите платформу функций для Node.js.

Платформа функций для Node.js — это платформа FaaS (функция как услуга) с открытым исходным кодом для написания переносимых функций Node.js, которую предлагает вам команда Google Cloud Functions.

Платформа функций позволяет писать облегченные функции, которые выполняются в самых разных средах, в том числе:

  • Облачные функции Google
  • Ваша локальная машина разработки
  • Cloud Run и Cloud Run на GKE
  • Knative-среды

Создайте новое приложение node.js.

npm init

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

Теперь установите Functions Framework для Node.js.

npm install @google-cloud/functions-framework

Откройте свой package.json. Убедитесь, что вы видите структуру функций, указанную в качестве зависимости, как показано в примере ниже.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Теперь Functions Framework успешно установлен. Теперь вы готовы создать свою облачную функцию.

4. Создайте и протестируйте облачную функцию HTTP локально.

Создайте локальную облачную функцию

В этом разделе вы создадите и протестируете функцию HTTP, которая отвечает на запросы HTTP.

Создайте новый файл с именем index.js в том же каталоге, что и ваш файл package.json.

Добавьте следующее:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

Теперь вы готовы протестировать функцию.

Функция тестирования в коде Visual Studio

С этого момента эта лаборатория кода использует интегрированный терминал в Visual Studio Code.

В Visual Studio Code откройте окно терминала.

Выполните следующую команду:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Эта команда запускает локальный сервер, который готов вызвать функцию validateTemperature , когда сервер получает HTTP-запрос.

В окне терминала вы должны увидеть следующий вывод:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

Создайте второе окно терминала в VS Code, щелкнув значок New Terminal плюс» на панели окна терминала. Вы будете переключаться между этими двумя окнами терминала: первое для обслуживания функции и второе для вызова функции с помощью Curl.

bceb65f366d837ae.png

Вы можете переключаться между окнами терминала, используя раскрывающийся список. Если окно терминала в данный момент выполняет функцию, раскрывающийся список ссылается на нее как node . В противном случае это относится к zsh (или к используемой вами оболочке).

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

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

Вы должны получить следующий ответ от облачной функции:

Temperature OK

Во втором окне терминала снова протестируйте функцию, отправив полезную нагрузку «слишком высокая» температура, как показано ниже:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

Вы должны получить следующий ответ от облачной функции:

Too hot

Наконец, протестируйте функцию, вызвав ее с отсутствующими полезными данными.

curl -X POST http://localhost:8080

Вы должны получить следующий ответ от облачной функции:

Too hot

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

Обязательно остановите запуск вашей функции, нажав Ctrl + C в первом окне терминала, обслуживающем вашу функцию.

5. Отладка функции HTTP на локальном компьютере.

Откройте палитру команд в Visual Studio Code. Если вы используете Mac, используйте Cmd + Shift + P Если вы используете Windows, используйте Ctrl + Shift + P.

Введите auto attach в палитре команд и выберите верхний элемент в списке.

601e542b4ec9f6f9.png

Для этой кодовой лаборатории выберите Only With Flag , как показано на рисунке ниже:

b9e6b762d150e62b.png

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

Нажмите Relaunch Terminal .

37b61e3fb546fc76.png

В перезагруженном окне терминала перезапустите структуру функций для выполнения вашей функции, используя следующую команду:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

где флаг --inspect сообщает Node.js о необходимости прослушивания клиента отладки. Дополнительную информацию см. в документации Node по отладке .

Обратите внимание, что вы используете node_modules/ .bin /functions-framework вместо node_modules/ @google-cloud /functions-framework. Для использования режима проверки вам необходимо использовать исполняемый файл с автоматическими символическими ссылками в /node_modules/.bin.

На этот раз вы должны увидеть оранжевую строку состояния в VS Code, указывающую, что отладчик подключен.

Установите точку останова в строке 3, щелкнув внутри поля слева от номера строки.

2fbb4d5916e1dbfa.png

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

846e6c5993cc87f9.png

Во втором окне терминала нажмите точку останова, выполнив следующую команду Curl.

curl -X POST http://localhost:8080 

Над строкой 3 появится желтая подсветка. Эта подсветка указывает, что эта строка является текущим оператором, оцениваемым отладчиком.

206c7ed1eb189e90.png

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

97979025f4bf2842.png

Щелкните значок перехода, чтобы выполнить следующий оператор.

Вы увидите, что текущий оператор перейдет к другой части оператора if.

cf0e8ce7e0388f98.png

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

Нажмите кнопку «Отключить», чтобы отключить отладчик.

1070d059775ad769.png

В первом окне терминала прекратите выполнение функции, нажав Ctrl + C

Обновите свою функцию, добавив оператор if для выдачи исключения, если температура не определена, как показано ниже:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

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

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Убедитесь, что исключение создано, выполнив следующую команду во втором окне терминала:

curl -X POST http://localhost:8080 

Вы должны увидеть следующий результат вашего запроса:

Temperature is undefined

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

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

Теперь вы можете остановить выполнение функции, нажав Ctrl + C в первом окне терминала.

6. Разверните функцию HTTP со своего локального компьютера в Google Cloud.

Теперь, когда вы создали, протестировали и отладили облачную функцию на своем локальном компьютере, вы готовы развернуть ее в Google Cloud.

Убедитесь, что вы используете проект, созданный на шаге 2, локально, выполнив следующую команду:

gcloud config get-value project

Если проект, указанный на шаге 2, не является активной конфигурацией, выполните следующую команду:

gcloud config set project <project-name-created-step-2>

В любом окне терминала выполните следующую команду:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

где параметры объясняются следующим образом:

  • deploy validateTemperature — подкоманда gcloud для развертывания облачной функции с именем validateTemperature с точкой входа с именем validateTemperature
  • --trigger-http — тип триггерного события
  • --runtime nodejs12 — целевая среда выполнения этой функции
  • --allow-unauthenticated — разрешает публичный доступ для вызова функции

Вам будет предложено включить API облачных функций. Введите y , чтобы включить API.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

После завершения развертывания вы увидите следующее:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

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

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

и подтвердите, что ваша облачная функция была успешно развернута, проверив соответствующий ответ.

Temperature OK

7. Очистка

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

Чтобы удалить облачную функцию, перейдите в облачную консоль облачных функций по адресу https://console.cloud.google.com/functions/. Убедитесь, что проект, созданный вами на шаге 2, является текущим выбранным проектом.

Выберите функцию validateTemperature, которую вы развернули на шаге 6. Затем нажмите «Удалить».

4dada486485a935a.png

Если вы решите удалить весь проект, вы можете перейти на https://console.cloud.google.com/cloud-resource-manager , выбрать проект, созданный на шаге 2, и нажать «Удалить». Если вы удалите проект, вам придется изменить проекты в Cloud SDK. Вы можете просмотреть список всех доступных проектов, запустив список проектов gcloud.

8. Поздравляем!

Поздравляем с завершением работы над кодом. Вы можете узнать больше о том, как Cloud Functions поддерживает среду выполнения Node.js и как локальная отладка работает с Cloud Functions .

Что мы рассмотрели

  • Фреймворк функций для Node.js.
  • Создайте и протестируйте облачную функцию HTTP локально.
  • Отладка функции HTTP на локальном компьютере.
  • Разверните функцию HTTP на своем локальном компьютере.