Как подключить приложение Node.js в Cloud Run к базе данных Cloud SQL для PostgreSQL

1. Обзор

Коннектор Cloud SQL Node.js — это самый простой способ безопасно подключить приложение Node.js к базе данных Cloud SQL. Cloud Run — это полностью управляемая бессерверная платформа, которая позволяет запускать контейнеры без отслеживания состояния, которые можно вызвать с помощью HTTP-запросов. В этой лаборатории кода будет продемонстрировано, как безопасно подключить приложение Node.js в Cloud Run к базе данных Cloud SQL для PostgreSQL с помощью учетной записи службы с использованием аутентификации IAM.

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

В этой лабораторной работе вы научитесь делать следующее:

  • Создайте экземпляр Cloud SQL для базы данных PostgreSQL.
  • Развертывание приложения Node.js в Cloud Run
  • Подключите свое приложение к базе данных с помощью библиотеки Cloud SQL Node.js Connector.

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

  • Эта лабораторная работа предполагает знакомство со средами Cloud Console и Cloud Shell.

2. Прежде чем начать

Настройка облачного проекта

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Google, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не взимать плату за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Настройка среды

Активируйте Cloud Shell, щелкнув значок справа от панели поиска.

ecdc43ada29e91b.png

В Cloud Shell включите API:

gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
  run.googleapis.com artifactregistry.googleapis.com \
  cloudbuild.googleapis.com servicenetworking.googleapis.com

Если будет предложено авторизоваться, нажмите «Авторизовать», чтобы продолжить.

6356559df3eccdda.png

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

Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.

3. Настройте учетную запись службы.

Создайте и настройте учетную запись службы Google Cloud, которая будет использоваться Cloud Run, чтобы у нее были правильные разрешения для подключения к Cloud SQL.

  1. Запустите команду gcloud iam service-accounts create следующим образом, чтобы создать новую учетную запись службы:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. Запустите команду gcloud project add-iam-policy-binding следующим образом, чтобы добавить роль Cloud SQL Client в только что созданную учетную запись службы Google Cloud. В Cloud Shell выражение ${GOOGLE_CLOUD_PROJECT} будет заменено названием вашего проекта. Вы также можете выполнить эту замену вручную, если вам так удобнее.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.client"
    
  3. Запустите команду gcloud project add-iam-policy-binding следующим образом, чтобы добавить роль пользователя экземпляра Cloud SQL к только что созданной учетной записи службы Google Cloud.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.instanceUser"
    
  4. Запустите команду gcloud project add-iam-policy-binding следующим образом, чтобы добавить роль записи журнала в только что созданную учетную запись службы Google Cloud.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

4. Настройте Cloud SQL

Запустите команду gcloud sql instances create , чтобы создать экземпляр Cloud SQL.

  • --database-version : тип и версия ядра базы данных. Если не указать, используется API по умолчанию. См. документацию по версиям базы данных gcloud, чтобы узнать текущие доступные версии.
  • –cpu : количество ядер, желаемое в машине.
  • --memory : Целое число, указывающее, сколько памяти требуется в машине. Необходимо указать единицу размера (например, 3072 МБ или 9 ГБ). Если единицы измерения не указаны, предполагается ГБ.
  • –region : региональное расположение экземпляра (например: us-central1, asia-east1, us-east1).
  • --database-flags : позволяет устанавливать флаги. В этом случае мы включаем cloudsql.iam_authentication , чтобы Cloud Run мог подключаться к Cloud SQL с помощью созданной ранее учетной записи службы.
    gcloud sql instances create quickstart-instance \
      --database-version=POSTGRES_14 \
      --cpu=1 \
      --memory=4GB \
      --region=us-central1 \
      --database-flags=cloudsql.iam_authentication=on
    

Выполнение этой команды может занять несколько минут.

Запустите команду gcloud sql databases create , чтобы создать базу данных Cloud SQL в quickstart-instance .

gcloud sql databases create quickstart_db \
  --instance=quickstart-instance

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

gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
  --instance=quickstart-instance \
  --type=cloud_iam_service_account

5. Подготовьте заявку

Подготовьте приложение Node.js, отвечающее на HTTP-запросы.

  1. В Cloud Shell создайте новый каталог с именем helloworld и перейдите в него:
    mkdir helloworld
    cd helloworld
    
  2. Инициализируйте файл package.json как модуль.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. Установите зависимость соединителя Cloud SQL Node.js.
    npm install @google-cloud/cloud-sql-connector
    
  4. Установите pg для взаимодействия с базой данных PostgreSQL.
    npm install pg
    
  5. Установите экспресс для приема входящих HTTP-запросов.
    npm install express
    
  6. Создайте файл index.mjs с кодом приложения. Этот код способен:
    • Принимать HTTP-запросы
    • Подключиться к базе данных
    • Сохраните время HTTP-запроса в базе данных.
    • Возвращает время последних пяти запросов
    Выполните следующую команду в Cloud Shell:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    import {Connector} from '@google-cloud/cloud-sql-connector';
    
    const {Pool} = pg;
    
    const connector = new Connector();
    const clientOpts = await connector.getOptions({
        instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME,
        authType: 'IAM'
    });
    
    const pool = new Pool({
        ...clientOpts,
        user: process.env.DB_USER,
        database: process.env.DB_NAME
    });
    
    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. Теперь приложение готово к развертыванию.

6. Развертывание приложения Cloud Run

Запустите команду ниже, чтобы развернуть приложение в Cloud Run:

  • –region : региональное расположение экземпляра (например: us-central1, asia-east1, us-east1).
  • --source : исходный код, который будет развернут. В этом случае, . ссылается на исходный код в текущей папке helloworld .
  • --set-env-vars : устанавливает переменные среды, используемые приложением для направления приложения к базе данных Cloud SQL.
  • --service-account : связывает развертывание Cloud Run с учетной записью службы с разрешениями на подключение к базе данных Cloud SQL, созданной в начале этой лаборатории кода.
  • –allow-unauthenticated : разрешает неаутентифицированные запросы, чтобы приложение было доступно из Интернета.
gcloud run deploy helloworld \
  --region=us-central1 \
  --source=. \
  --set-env-vars INSTANCE_CONNECTION_NAME="${GOOGLE_CLOUD_PROJECT}:us-central1:quickstart-instance" \
  --set-env-vars DB_NAME="quickstart_db" \
  --set-env-vars DB_USER="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam" \
  --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
  --allow-unauthenticated

При появлении запроса нажмите y и Enter , чтобы подтвердить, что вы хотите продолжить:

Do you want to continue (Y/n)? y

Через несколько минут приложение должно предоставить вам URL-адрес для посещения.

Перейдите по URL-адресу, чтобы увидеть свое приложение в действии. Каждый раз, когда вы посещаете URL-адрес или обновляете страницу, вы увидите пять последних посещений, возвращаемых в формате JSON.

7. Поздравления

Вы развернули приложение Node.js в Cloud Run, которое может подключаться к базе данных PostgreSQL, работающей в Cloud SQL.

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

  • Создание базы данных Cloud SQL для PostgreSQL
  • Развертывание приложения Node.js в Cloud Run
  • Подключение вашего приложения к Cloud SQL с помощью коннектора Cloud SQL Node.js.

Очистить

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы. Если вы хотите удалить весь проект, вы можете запустить:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}