О практической работе
1. Обзор
Коннектор Cloud SQL Go — это самый простой способ безопасно подключить приложение Go к базе данных Cloud SQL. Cloud Run — это полностью управляемая бессерверная платформа, которая позволяет запускать контейнеры без отслеживания состояния, которые можно вызвать с помощью HTTP-запросов. В этой лаборатории кода будет продемонстрировано, как безопасно подключить приложение Go в Cloud Run к базе данных Cloud SQL для PostgreSQL с помощью учетной записи службы с использованием аутентификации IAM.
Что вы узнаете
В этой лабораторной работе вы научитесь делать следующее:
- Создайте базу данных Cloud SQL для PostgreSQL.
- Развертывание приложения Go в Cloud Run
- Подключите свое приложение к Cloud SQL с помощью Go Connector.
Предварительные условия
- Эта лабораторная работа предполагает знакомство со средами Cloud Console и Cloud Shell.
2. Прежде чем начать
Настройка облачного проекта
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Google, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта. - К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Настройка среды
Активируйте Cloud Shell, щелкнув значок справа от панели поиска.
В Cloud Shell включите API:
gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
run.googleapis.com artifactregistry.googleapis.com \
cloudbuild.googleapis.com servicenetworking.googleapis.com
Если будет предложено авторизоваться, нажмите «Авторизовать», чтобы продолжить.
Выполнение этой команды может занять несколько минут, но в конечном итоге она должна выдать успешное сообщение, подобное этому:
Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.
3. Настройка учетной записи службы
Создайте и настройте учетную запись службы Google Cloud, которая будет использоваться Cloud Run, чтобы у нее были правильные разрешения для подключения к Cloud SQL.
- Запустите команду
gcloud iam service-accounts create
следующим образом, чтобы создать новую учетную запись службы:gcloud iam service-accounts create quickstart-service-account \
--display-name="Quickstart Service Account" - Запустите команду 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" - Запустите команду 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" - Запустите команду 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. Подготовить заявку
Подготовьте приложение Go, которое отвечает на HTTP-запросы.
- В Cloud Shell создайте новый каталог с именем
helloworld
и перейдите в него:mkdir helloworld
cd helloworld - Запустите
go mod init
, чтобы инициализировать новое приложение Go.go mod init github.com/GoogleCloudPlatform/golang-samples/run/helloworld
- Установите зависимость Cloud SQL Go Connector.
go get cloud.google.com/go/cloudsqlconn
go get cloud.google.com/go/cloudsqlconn/postgres/pgxv4 - Создайте файл
main.go
с кодом приложения. Этот код способен:- Принимать HTTP-запросы
- Подключиться к базе данных
- Сохраните время HTTP-запроса в базе данных.
- Возвращает время последних пяти запросов
cat > main.go << "EOF"
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"time"
"cloud.google.com/go/cloudsqlconn"
"cloud.google.com/go/cloudsqlconn/postgres/pgxv4"
)
// visitData is used to pass data to the HTML template.
type visitData struct {
RecentVisits []visit
}
// visit contains a single row from the visits table in the database.
// Each visit includes a timestamp.
type visit struct {
VisitTime time.Time
}
// getDB creates a connection to the database
// based on environment variables.
func getDB() (*sql.DB, func() error) {
cleanup, err := pgxv4.RegisterDriver("cloudsql-postgres", cloudsqlconn.WithIAMAuthN())
if err != nil {
log.Fatalf("Error on pgxv4.RegisterDriver: %v", err)
}
dsn := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable", os.Getenv("INSTANCE_CONNECTION_NAME"), os.Getenv("DB_USER"), os.Getenv("DB_NAME"))
db, err := sql.Open("cloudsql-postgres", dsn)
if err != nil {
log.Fatalf("Error on sql.Open: %v", err)
}
createVisits := `CREATE TABLE IF NOT EXISTS visits (
id SERIAL NOT NULL,
created_at timestamp NOT NULL,
PRIMARY KEY (id)
);`
_, err = db.Exec(createVisits)
if err != nil {
log.Fatalf("unable to create table: %s", err)
}
return db, cleanup
}
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Printf("Listening on port %s", port)
db, cleanup := getDB()
defer cleanup()
http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
// Insert current visit
_, err := db.Exec("INSERT INTO visits(created_at) VALUES(NOW())")
if err != nil {
log.Fatalf("unable to save visit: %v", err)
}
// Get the last 5 visits
rows, err := db.Query("SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5")
if err != nil {
log.Fatalf("DB.Query: %v", err)
}
defer rows.Close()
var visits []visit
for rows.Next() {
var visitTime time.Time
err := rows.Scan(&visitTime)
if err != nil {
log.Fatalf("Rows.Scan: %v", err)
}
visits = append(visits, visit{VisitTime: visitTime})
}
response, err := json.Marshal(visitData{RecentVisits: visits})
if err != nil {
log.Fatalf("renderIndex: failed to parse totals with json.Marshal: %v", err)
}
w.Write(response)
})
if err := http.ListenAndServe(":"+port, nil); err != nil {
log.Fatal(err)
}
}
EOF
Этот код создает базовый веб-сервер, который прослушивает порт, определенный переменной среды PORT. Теперь приложение готово к развертыванию.
6. Развертывание приложения 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. Поздравления
Вы развернули приложение Go в Cloud Run, которое может подключаться к базе данных PostgreSQL, работающей в Cloud SQL.
Что мы рассмотрели:
- Создание базы данных Cloud SQL для PostgreSQL
- Развертывание приложения Go в Cloud Run
- Подключение вашего приложения к Cloud SQL с помощью Go Connector
Очистить
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы. Если вы хотите удалить весь проект, вы можете запустить:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}