Подключение к частному CloudSQL из Cloud Run

1. Обзор

В ходе этой лабораторной работы вы создадите службу меню Cymbal Eats, предоставляющую API-интерфейсы RESTful для добавления, обновления, удаления и составления списка пунктов меню. Вы создадите базу данных Cloud SQL в качестве серверной базы данных для службы меню, которая будет работать в Cloud Run. Поскольку Cloud Run не находится в том же VPC, что и база данных Cloud SQL, вам необходимо настроить коннектор бессерверного доступа к VPC, чтобы Cloud Run мог взаимодействовать с Cloud SQL через частный IP-адрес.

19c7b05f35789fda.png

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

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

  • Настройка частной сети VPC
  • Создать частную базу данных Postgres Cloud SQL
  • Подключите CloudRun к частному VPC
  • Разверните службу в Cloud Run, которая подключается к базе данных Cloud SQL.

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

Самостоятельная настройка среды

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

  1. Создание переменных среды, связанных с проектом и ресурсами.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
  1. Клонируйте репозиторий и перейдите в каталог.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. Включить службы
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. Настройте частный доступ

Доступ к частным сервисам предоставляется в виде пирингового канала VPC между вашей сетью VPC и базовой сетью Google Cloud VPC, в которой расположен ваш экземпляр Cloud SQL. Частное соединение позволяет экземплярам виртуальных машин в вашей сети VPC и службам, которые вы используете, взаимодействовать исключительно через внутренние IP-адреса. Для доступа к службам, доступным через доступ к частным службам, экземплярам виртуальных машин не требуется подключение к Интернету или внешние IP-адреса.

  1. Выделить диапазон IP-адресов
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

Пример вывода

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. Создайте частное соединение.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

Пример вывода

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

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

Cloud SQL — это полностью управляемая служба баз данных, которая упрощает настройку, обслуживание, управление и администрирование реляционных баз данных PostgreSQL и MySQL в облаке. Каждый экземпляр Cloud SQL работает на виртуальной машине (ВМ), работающей на хост-сервере Google Cloud. Вариант высокой доступности также включает резервную виртуальную машину в другой зоне с той же настройкой, что и основная виртуальная машина. База данных хранится на масштабируемом и долговечном сетевом устройстве хранения данных, известном как постоянный диск, который подключен к виртуальной машине. Статический IP-адрес назначается каждой виртуальной машине, чтобы гарантировать, что IP-адрес, к которому подключается приложение, останется постоянным в течение всего срока службы экземпляра Cloud SQL.

219cb722c2dd1b82.png

Вы создадите базу данных Postgres Cloud SQL с частным IP-адресом.

Создайте базу данных и пользователя

  1. Создайте экземпляр Postgres Cloud SQL для использования частного IP-адреса.
gcloud sql instances create $DB_INSTANCE_NAME \
    --project=$PROJECT_ID \
    --network=projects/$PROJECT_ID/global/networks/default \
    --no-assign-ip \
    --database-version=POSTGRES_12 \
    --cpu=2 \
    --memory=4GB \
    --region=$REGION \
    --root-password=${DB_INSTANCE_PASSWORD}

Пример вывода

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance].
NAME: menu-instance
DATABASE_VERSION: POSTGRES_12
LOCATION: us-east1-a
TIER: db-custom-2-4096
PRIMARY_ADDRESS: -
PRIVATE_ADDRESS: 10.8.80.5
STATUS: RUNNABLE
  1. Добавьте базу данных в экземпляр базы данных
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Пример вывода

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. Создайте пользователя SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Пример вывода

Created user [menu-user].
  1. Сохраните IP-адрес базы данных
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Добавьте роль клиента Cloud SQL в сервисный аккаунт Compute Engine.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

Пример вывода

Updated IAM policy for project [cymbal1].
[...]

5. Бессерверное VPC

Бессерверный доступ к VPC позволяет напрямую подключаться к сети виртуального частного облака из бессерверных сред, таких как Cloud Run, App Engine или Cloud Functions. Настройка бессерверного доступа к VPC позволяет вашей бессерверной среде отправлять запросы в сеть VPC, используя внутренний DNS и внутренние IP-адреса (как определено в RFC 1918 и RFC 6598). Ответы на эти запросы также используют вашу внутреннюю сеть.

Вы создадите соединитель бессерверного доступа к VPC для службы Cloud Run для подключения к Cloud SQL.

19c7b05f35789fda.png

  1. Создайте соединитель бессерверного доступа к VPC в той же сети VPC, что и ваш экземпляр Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

Пример вывода

Created connector [cymbalconnector].

6. Развертывание в Cloud Run

Вы создадите и развернете образ Docker в Cloud Run и подключите Cloud Run к бессерверному коннектору VPC для доступа к базе данных Cloud SQL.

  1. Скомпилируйте приложение с помощью maven
./mvnw package -DskipTests

Пример вывода

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. Создайте образ докера:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

Пример вывода

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. Отправьте образ Docker в реестр контейнеров:
docker push gcr.io/$PROJECT_NAME/menu-service

Пример вывода

Using default tag: latest
The push refers to repository [gcr.io/cymbalsql/menu-service]
17b374963800: Pushed
d9a51c06430d: Pushed
fff5d2a2cfc9: Pushed
f21fceb558c6: Pushed
5ffbbbf218dd: Pushed
60609ec85f86: Layer already exists
f2c4302f03b8: Layer already exists
latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
  1. Развернуть сервис меню:
gcloud run deploy $MENU_SERVICE_NAME \
    --image=gcr.io/$PROJECT_NAME/menu-service:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars DB_USER=$DB_USER \
    --set-env-vars DB_PASS=$DB_PASSWORD \
    --set-env-vars DB_DATABASE=$DB_DATABASE \
    --set-env-vars DB_HOST=$DB_INSTANCE_IP \
    --vpc-connector $SERVERLESS_VPC_CONNECTOR \
    --project=$PROJECT_ID \
    --quiet

Пример вывода

[...]
Done.
Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic.
Service URL: https://menu-service-g2mfphytdq-uk.a.run.app

Google рекомендует использовать Secret Manager для хранения конфиденциальной информации, такой как учетные данные SQL. Вы можете передавать секреты как переменные среды или монтировать как том с помощью Cloud Run.

  1. URL-адрес службы меню магазина:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Проверьте URL-адрес службы меню
echo $MENU_SERVICE_URL

Пример вывода

https://menu-service-g2mfphytdq-uk.a.run.app

7. Тестирование сервиса

  1. Создайте новый пункт меню, отправив POST-запрос:
curl -X POST "${MENU_SERVICE_URL}/menu" \
  -H 'Content-Type: application/json' \
  -d '{
       "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "itemName": "Curry Plate",
       "itemPrice": 12.5,
       "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "spiceLevel": 3,
       "status": "Ready",
       "tagLine": "Spicy touch for your taste buds!!"
   }'

Пример вывода

{
    "id": 16,
    "createDateTime": "2022-04-28T18:14:04.17225",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.5,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 3,
    "status": "Processing",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T18:14:04.172298"
}
  1. Измените статус пункта меню, отправив запрос PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

Пример вывода

{
    "id": 1,
    "createDateTime": "2022-04-28T17:21:02.369093",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.50,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 0,
    "status": "Ready",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T17:21:02.657636"
}

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

Поздравляем, вы завершили работу над кодом!

Что дальше:

Ознакомьтесь с другими лабораториями Cymbal Eats:

Очистить

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

Удаление проекта

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