1. Обзор
Cloud Run — это полностью управляемая бессерверная платформа, позволяющая запускать контейнеры без сохранения состояния, вызываемые через HTTP-запросы. В этом практическом занятии будет продемонстрировано, как подключить приложение Node.js на Cloud Run к базе данных Cloud SQL для PostgreSQL.
Что вы узнаете
В этой лабораторной работе вы научитесь:
- Создайте экземпляр Cloud SQL для PostgreSQL.
- Разверните приложение в Cloud Run, которое подключается к вашей базе данных Cloud SQL.
Что вы узнаете
- Создайте экземпляр Cloud SQL для PostgreSQL.
- Разверните приложение в Cloud Run, которое подключается к вашей базе данных Cloud SQL.
2. Предварительные требования
- Если у вас еще нет учетной записи Google, вам необходимо ее создать .
- Используйте личный аккаунт вместо рабочего или учебного. Рабочие и учебные аккаунты могут иметь ограничения, которые не позволят вам включить API, необходимые для этой лабораторной работы.
3. Настройка проекта
- Войдите в консоль Google Cloud .
- Включите выставление счетов в облачной консоли.
- Выполнение этой лабораторной работы должно обойтись менее чем в 1 доллар США в виде облачных ресурсов.
- В конце этой лабораторной работы вы можете выполнить действия по удалению ресурсов, чтобы избежать дальнейших списаний средств.
- Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
- Создайте новый проект или выберите вариант повторного использования существующего проекта.
4. Откройте редактор Cloud Shell.
- Перейдите в редактор Cloud Shell.
- Если терминал не отображается в нижней части экрана, откройте его:
- Нажмите на значок гамбургера.

- Нажмите «Терминал»
- Нажмите «Новый терминал»

- Нажмите на значок гамбургера.
- В терминале настройте свой проект с помощью этой команды:
- Формат:
gcloud config set project [PROJECT_ID] - Пример:
gcloud config set project lab-project-id-example - Если вы не помните идентификатор своего проекта:
- Вы можете вывести список всех идентификаторов ваших проектов с помощью:
gcloud projects list | awk '/PROJECT_ID/{print $2}'

- Вы можете вывести список всех идентификаторов ваших проектов с помощью:
- Формат:
- Если появится запрос на авторизацию, нажмите «Авторизовать» , чтобы продолжить.

- Вы должны увидеть следующее сообщение:
Если вы видитеUpdated property [core/project].
WARNINGи вас спрашиваютDo you want to continue (Y/N)?, то, скорее всего, вы неправильно ввели идентификатор проекта. НажмитеN, затемEnterи попробуйте снова выполнить командуgcloud config set project.
5. Включите API.
В терминале включите API:
gcloud services enable \
compute.googleapis.com \
sqladmin.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
networkconnectivity.googleapis.com \
servicenetworking.googleapis.com \
cloudaicompanion.googleapis.com
Если появится запрос на авторизацию, нажмите «Авторизовать» , чтобы продолжить. 
Выполнение этой команды может занять несколько минут, но в итоге должно отобразиться сообщение об успешном завершении, похожее на это:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. Создайте учетную запись службы.
Создайте и настройте учетную запись службы Google Cloud для использования Cloud Run, чтобы она имела необходимые разрешения для подключения к Cloud SQL.
- Для создания новой учетной записи службы выполните команду
gcloud iam service-accounts createследующим образом:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account" - Чтобы добавить роль Log Writer к только что созданной учетной записи службы Google Cloud, выполните команду gcloud projects add-iam-policy-binding следующим образом.
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
7. Создайте базу данных Cloud SQL.
- Создайте политику подключения к службе, разрешающую сетевое подключение из Cloud Run к Cloud SQL с помощью Private Service Connect.
gcloud network-connectivity service-connection-policies create quickstart-policy \ --network=default \ --project=${GOOGLE_CLOUD_PROJECT} \ --region=us-central1 \ --service-class=google-cloud-sql \ --subnets=https://www.googleapis.com/compute/v1/projects/${GOOGLE_CLOUD_PROJECT}/regions/us-central1/subnetworks/default - Сгенерируйте уникальный пароль для вашей базы данных.
export DB_PASSWORD=$(openssl rand -base64 20) - Выполните команду
gcloud sql instances create, чтобы создать экземпляр Cloud SQL.gcloud sql instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --root-password=${DB_PASSWORD} \ --database-version=POSTGRES_17 \ --tier=db-perf-optimized-N-2 \ --region=us-central1 \ --ssl-mode=ENCRYPTED_ONLY \ --no-assign-ip \ --enable-private-service-connect \ --psc-auto-connections=network=projects/${GOOGLE_CLOUD_PROJECT}/global/networks/default
Выполнение этой команды может занять несколько минут.
- Выполните команду
gcloud sql databases create, чтобы создать базу данных Cloud SQL вquickstart-instance.gcloud sql databases create quickstart_db \ --instance=quickstart-instance
8. Подготовьте заявление.
Подготовьте Node.js-приложение, которое обрабатывает HTTP-запросы.
- В Cloud Shell создайте новую директорию с именем
helloworld, затем перейдите в эту директорию:mkdir helloworld cd helloworld - Инициализируйте файл
package.jsonкак модуль.npm init -y npm pkg set type="module" npm pkg set main="index.mjs" npm pkg set scripts.start="node index.mjs" - Установите
pgдля взаимодействия с базой данных PostgreSQL.npm install pg - Установите Express для приема входящих HTTP-запросов.
npm install express - Создайте файл
index.mjsс кодом приложения. Этот код способен:- Принимать HTTP-запросы
- Подключитесь к базе данных
- Сохраните время HTTP-запроса в базе данных.
- Возвращает время выполнения последних пяти запросов.
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; const { Pool } = pg; const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, ssl: { require: true, rejectUnauthorized: false, // required for self-signed certs // https://node-postgres.com/features/ssl#self-signed-cert } }); const app = express(); app.get('/', async (req, res) => { await pool.query('INSERT INTO visits(created_at) VALUES(NOW())'); const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5'); console.table(rows); // prints the last 5 visits res.send(rows); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, async () => { console.log('process.env: ', process.env); await pool.query(`CREATE TABLE IF NOT EXISTS visits ( id SERIAL NOT NULL, created_at timestamp NOT NULL, PRIMARY KEY (id) );`); console.log(`helloworld: listening on port ${port}`); }); EOF
Этот код создает базовый веб-сервер, который прослушивает порт, определенный переменной среды PORT. Теперь приложение готово к развертыванию.
9. Разверните приложение в Cloud Run.
- Выполните указанную ниже команду, чтобы развернуть приложение в Cloud Run:
gcloud run deploy helloworld \ --region=us-central1 \ --source=. \ --set-env-vars DB_NAME="quickstart_db" \ --set-env-vars DB_USER="postgres" \ --set-env-vars DB_PASSWORD=${DB_PASSWORD} \ --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \ --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --network=default \ --subnet=default \ --allow-unauthenticated - Если появится запрос, нажмите
YиEnter, чтобы подтвердить продолжение:Do you want to continue (Y/n)? Y
Через несколько минут приложение должно предоставить вам URL-адрес для перехода по ссылке.
Перейдите по указанному URL-адресу, чтобы увидеть работу вашего приложения. При каждом посещении URL-адреса или обновлении страницы вы будете видеть данные о пяти последних посещениях в формате JSON.
10. Поздравляем!
В этой лабораторной работе вы научились выполнять следующие действия:
- Создайте экземпляр Cloud SQL для PostgreSQL.
- Разверните приложение в Cloud Run, которое подключается к вашей базе данных Cloud SQL.
Уборка
В Cloud SQL нет бесплатного тарифа, и за дальнейшее использование взимается плата. Вы можете удалить свой проект в Cloud, чтобы избежать дополнительных расходов.
Хотя Cloud Run не взимает плату, когда услуга не используется, с вас все равно может взиматься плата за хранение образа контейнера в реестре артефактов. Удаление вашего проекта Cloud прекращает выставление счетов за все ресурсы, используемые в этом проекте.
При желании вы можете удалить проект:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
Вы также можете удалить ненужные ресурсы с диска Cloudshell. Для этого выполните следующие действия:
- Удалите каталог проекта codelab:
rm -rf ~/task-app - Внимание! Следующее действие необратимо! Если вы хотите удалить все данные в Cloud Shell, чтобы освободить место, вы можете удалить всю свою домашнюю директорию . Будьте внимательны и убедитесь, что все, что вы хотите сохранить, сохранено в другом месте.
sudo rm -rf $HOME
Продолжайте учиться
- Разверните полнофункциональное приложение Next.js в Cloud Run с помощью Cloud SQL для PostgreSQL, используя коннектор Cloud SQL Node.js.
- Разверните полнофункциональное Angular-приложение в Cloud Run с помощью Cloud SQL для PostgreSQL, используя коннектор Cloud SQL Node.js.
- Разверните полнофункциональное Angular-приложение в Cloud Run с помощью Firestore, используя Node.js Admin SDK.
- Разверните полнофункциональное приложение Next.js в Cloud Run с Firestore, используя Node.js Admin SDK.