Как подключиться к Cloud-SQL из Cloud Function в Go? - PullRequest
0 голосов
/ 25 марта 2019

Для проекта я пытаюсь подключить облачную функцию к настройке базы данных 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.Но я не могу узнать, какой.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

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

0 голосов
/ 25 марта 2019

Unix-сокет на /cloudsql/{connectionName} предоставляется только во время выполнения GCF. При локальном запуске вам необходимо либо изменить строку подключения, либо использовать прокси-сервер Cloud * для имитации сокета unix по тому же пути.

...