1. Обзор
Google Cloud Functions — это бессерверная вычислительная платформа, управляемая событиями. Cloud Functions позволяет писать код, не беспокоясь о выделении ресурсов или масштабировании для обработки меняющихся требований.
Облачные функции, написанные на JavaScript, выполняются в среде Node.js на платформе Google Cloud Platform. Вы можете запускать свои облачные функции в любой стандартной среде выполнения Node.js, что обеспечивает переносимость и локальное тестирование.
Пошаговое руководство
В этом практическом задании вы создадите облачную функцию для Node.js, которая будет сообщать, является ли заданная температура приемлемой или слишком высокой. Вы создадите, протестируете и отладите свою облачную функцию с помощью Visual Studio Code на своем локальном компьютере. Наконец, вы развернете свою функцию на платформе Google Cloud Platform.
Что вы узнаете
- Функциональный фреймворк для Node.js.
- Создайте и протестируйте локально HTTP-функцию Cloud Function.
- Отладка HTTP-функции с локального компьютера.
- Разверните HTTP-функцию на локальном компьютере.
2. Настройка и требования
Предварительные требования
- Облачный SDK
- Visual Studio Code
- Node.js 8.6.0 или выше (для установки Node.js используйте nvm , чтобы проверить версию, выполните команду node –version).
- Завершение руководства «Моя первая функция: Node.js»
Затраты
Хотя для выполнения этого практического задания требуется всего один вызов развернутой облачной функции, вам все равно следует ознакомиться с информацией о ценах на API облачных функций, чтобы понять, как работает выставление счетов.
Хотя многие API Google можно использовать бесплатно, использование Google Cloud Platform (то есть её продуктов и API) не является бесплатным. Для использования Cloud Functions вам потребуется активный платёжный аккаунт. Имейте в виду, что некоторые продукты Google Cloud Platform (GCP) имеют тарифный план «Всегда бесплатно», превышение которого приведёт к начислению платы. В рамках данного практического занятия каждый вызов Cloud Functions учитывается в рамках этого бесплатного тарифа. Пока вы остаётесь в пределах его лимитов в совокупности (в течение каждого месяца), с вас не должно взиматься никакая плата.
3. Установите Functions Framework для Node.js.
Functions Framework for Node.js — это фреймворк с открытым исходным кодом, предоставляющий возможности FaaS (функции как услуга) для написания переносимых функций Node.js, разработанный командой Google Cloud Functions.
Фреймворк Functions позволяет писать легковесные функции, работающие в самых разных средах, включая:
- Google Cloud Functions
- Ваша локальная машина разработки
- Cloud Run и Cloud Run на GKE
- Среды, основанные на Knative
Создайте новое приложение Node.js.
npm init
Принимая значения по умолчанию, обязательно используйте index.js в качестве точки входа для вашего приложения.
Теперь установите Functions Framework для Node.js.
npm install @google-cloud/functions-framework
Откройте файл package.json. Убедитесь, что в списке зависимостей указан фреймворк functions, как показано в примере ниже.
"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 Code
Начиная с этого момента, в данном практическом занятии используется встроенный терминал 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.

Переключаться между окнами терминала можно с помощью выпадающего списка. Если окно терминала в данный момент выполняет какую-либо функцию, в выпадающем списке оно обозначается как 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 в палитре команд и выберите первый пункт в списке.

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

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

В обновлённом окне терминала повторно запустите фреймворк функций, чтобы запустить вашу функцию, используя следующую команду:
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, щелкнув внутри поля слева от номера строки.

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

Во втором окне терминала установите точку останова, выполнив следующую команду curl.
curl -X POST http://localhost:8080
Над строкой 3 появится желтая подсветка. Эта подсветка указывает на то, что данная строка является текущим оператором, который обрабатывается отладчиком.

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

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

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

В первом окне терминала остановите выполнение вашей функции, нажав Ctrl + C
Обновите свою функцию, добавив оператор if для генерации исключения, если значение параметра temperature не определено, как показано ниже:
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. Затем нажмите «Удалить».

Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив команду gcloud projects list.
8. Поздравляем!
Поздравляем с завершением практического занятия! Вы можете узнать больше о том, как Cloud Functions поддерживает среду выполнения Node.js и как работает локальная отладка в Cloud Functions .
Что мы рассмотрели
- Функциональный фреймворк для Node.js.
- Создайте и протестируйте локально HTTP-облачную функцию.
- Отладка HTTP-функции с локального компьютера.
- Разверните HTTP-функцию на локальном компьютере.