1. Обзор
Cloud Run — это полностью управляемая бессерверная платформа, позволяющая запускать контейнеры без сохранения состояния, вызываемые через HTTP-запросы. В этом практическом занятии будет продемонстрировано, как безопасно подключить приложение Node.js на Cloud Run к AlloyDB с помощью сервисной учетной записи, используя аутентификацию IAM.
Что вы узнаете
В этой лабораторной работе вы научитесь:
- Создайте экземпляр AlloyDB (настроенный для использования Private Service Connect ).
- Разверните приложение в Cloud Run, которое будет подключаться к вашему экземпляру AlloyDB.
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 \
alloydb.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
cloudaicompanion.googleapis.com
Если появится запрос на авторизацию, нажмите «Авторизовать» , чтобы продолжить. 
Выполнение этой команды может занять несколько минут, но в итоге должно отобразиться сообщение об успешном завершении, похожее на это:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. Создайте учетную запись службы.
Создайте и настройте учетную запись службы Google Cloud для использования Cloud Run, чтобы она имела необходимые разрешения для подключения к AlloyDB.
- Для создания новой учетной записи службы выполните команду
gcloud iam service-accounts createследующим образом:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account" - Чтобы добавить роль пользователя базы данных AlloyDB к только что созданной учетной записи службы 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/alloydb.databaseUser" - Чтобы добавить роль « Пользователь использования сервиса» к только что созданной учетной записи сервиса 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/serviceusage.serviceUsageConsumer" - Чтобы добавить роль 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. Создайте базу данных AlloyDB.
- Выполните команду
gcloud alloydb clusters create, чтобы создать экземпляр Cloud SQL.gcloud alloydb clusters create quickstart-cluster \ --password=$(openssl rand -base64 20) \ --region=us-central1 \ --project=${GOOGLE_CLOUD_PROJECT} \ --enable-private-service-connect \ --database-version=POSTGRES_16
Выполнение этой команды может занять несколько минут.
- Выполните команду
gcloud alloydb instances create, чтобы создать экземпляр Cloud SQL.gcloud alloydb instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=us-central1 \ --cluster=quickstart-cluster \ --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \ --database-flags=alloydb.iam_authentication=on - Выполните команду
gcloud alloydb instances describe, чтобы получить ссылку на подключение к службе PSC и экспортировать её в переменную.export SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \ --cluster=quickstart-cluster --region=us-central1 \ --format="value(pscInstanceConfig.serviceAttachmentLink)") gcloud compute addresses create quickstart-address \ --region=us-central1 \ --subnet=defaultgcloud compute forwarding-rules create quickstart-endpoint \ --region=us-central1 \ --network=default \ --address=quickstart-address \ --target-service-attachment=${SERVICE_ATTACHMENT}
Создайте пользователя базы данных PostgreSQL для учетной записи службы, которую вы создали ранее, чтобы получить доступ к базе данных.
gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--cluster=quickstart-cluster \
--region=us-central1 \
--type=IAM_BASED \
--superuser=true
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" - Установите библиотеку Google Cloud Auth.
npm install google-auth-library - Установите
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; import {GoogleAuth} from 'google-auth-library'; const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/alloydb.login'], }); const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: async () => { return await auth.getAccessToken(); }, 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:
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.
Через несколько минут приложение должно предоставить вам URL-адрес для перехода по ссылке.
Перейдите по указанному URL-адресу, чтобы увидеть работу вашего приложения. При каждом посещении URL-адреса или обновлении страницы вы будете видеть данные о пяти последних посещениях в формате JSON.
10. Поздравляем!
В этой лабораторной работе вы научились:
- Создайте экземпляр AlloyDB (настроенный для использования Private Service Connect ).
- Разверните приложение в Cloud Run, которое будет подключаться к вашему экземпляру AlloyDB.
Уборка
В 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.