Для проекта я пытаюсь подключить облачную функцию к настройке базы данных sql cloud, как описано в этом кратком руководстве .
Функция настроена в том же регионе,Сервисный аккаунт имеет роль Cloud SQL-Client
.Я вызывал функцию через мой компьютер так:
gcloud functions call <function-name> --region=<region> --data '{"recipient":"hello","requester":"hello","message":"test"}'
Соединение с функцией работает, похоже, не работает только аутентификация с базой данных, но я не могу получить то, что мне не удалось.
Я несколько раз проверил пароль, имя пользователя и имя соединения, сбросил пароль, и он все еще не работает.Я обнаружил проблему здесь , связанную с подключением облачных функций к облаку. Sql.
Я попытался заключить пароль в строку dsn
в одинарные кавычки, чтобы быть уверенным в том, что экранирование символов впароль не является проблемой.
Я также проверил входящие переменные среды, и они являются теми, которые я ввел в конфигурацию.
Функция просто проверяет связь с базой данных в целях тестирования:
package receiver
import (
"database/sql"
"fmt"
"net/http"
"os"
// Import Postgres SQL driver
_ "github.com/lib/pq"
)
// Receives a message and stores it
func Receive(w http.ResponseWriter, r *http.Request) {
connectionName := os.Getenv("POSTGRES_INSTANCE_CONNECTION_NAME")
dbUser := os.Getenv("POSTGRES_USER")
dbPassword := os.Getenv("POSTGRES_PASSWORD")
dsn := fmt.Sprintf("user=%s password='%s' host=/cloudsql/%s dbname=messages", dbUser, dbPassword, connectionName)
var err error
db, err := sql.Open("postgres", dsn)
if err != nil {
fmt.Fprintf(w, "Could not open db: %v \n", err)
}
// Only allow 1 connection to the database to avoid overloading
db.SetMaxIdleConns(1)
db.SetMaxOpenConns(1)
defer db.Close()
if pingerror := db.Ping(); pingerror != nil {
fmt.Fprintf(w, "Failed to ping database: %s \n", pingerror)
return
}
}
Переменная POSTGRES_INSTANCE_CONNECTION_NAME
отформатирована как описано здесь как ProjectID:Region:InstanceID
.
Ожидается сообщение об успешном завершении или нет ошибки, и я действительно получаю этосообщение:
pq: password authentication failed for user "postgres"
Примечание: я также создал функцию, содержащую демонстрационный код из здесь с настройками базы данных sql, и ошибка та же.Кажется, что я пропустил какой-то шаг при настройке экземпляра пользователя или sql.Но я не могу узнать, какой.