Не удается подключиться к облачному SQL с помощью node-postgres - PullRequest
0 голосов
/ 27 сентября 2019

Я пытался подключиться к своему экземпляру Cloud SQL с помощью модуля pg, но пока не увенчался успехом.

Я много смотрел в Интернетено не мог понять многое по теме.Я также хотел бы в какой-то момент развернуть приложение Express в Cloud Run и подключить его к моему экземпляру Cloud SQL, но я не знаю, как это сделать.

Вот список вещей, которые я надеваюне понимаю и хотел бы получить краткое объяснение:

  1. Что такое сокет-соединения Unix и почему я должен использовать их поверх обычных соединений?
  2. Что такое Cloud SQL Proxy?Нужно ли использовать это?Если да, то почему?
  3. Нужно ли мне выполнять какую-либо дополнительную работу для подключения к моему экземпляру Cloud SQL из Cloud Run?

Здесь перечислены все объекты подключения и подключения.строки, которые я пробовал с объектом pg.Client:

  1. Первая строка подключения: postgresql+psycopg2://postgres:password@/cloudsql/myapp:us-central1:mydb?host=/var/lib/postgresql
  2. Вторая строка подключения: postgresql://postgres:password@hostip:5432/myapp:us-central1:mydb
  3. Третья строка подключения:postgresql://postgres:password@hostip:5432/sarcdb
  4. Объект подключения: { host: "/cloudsql/myapp:us-central1:mydb", username: "postgres", password: "password", database: "mydb" }

Все это приводит к ошибке Connection terminated unexpectedly.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Документация Cloud Functions для Node.js и Cloud SQL (прокрутите вниз до PostgreSQL) содержит применимую информацию о структурировании строки подключения и дополнительной конфигурации, необходимой для учетных данных.

Как только это произойдетна месте для вашего приложения, вам нужно добавить экземпляр Cloud SQL в службу Cloud Run , прежде чем он сможет использовать эту строку подключения для доступа к базе данных.

Вот прямокопирование примера кода из документов при использовании Cloud Run конфигурация max со значением 1 может не поспевать за другими параметрами параллелизма.

const pg = require('pg');

/**
 * TODO(developer): specify SQL connection details
 */
const connectionName =
  process.env.INSTANCE_CONNECTION_NAME || '<YOUR INSTANCE CONNECTION NAME>';
const dbUser = process.env.SQL_USER || '<YOUR DB USER>';
const dbPassword = process.env.SQL_PASSWORD || '<YOUR DB PASSWORD>';
const dbName = process.env.SQL_NAME || '<YOUR DB NAME>';

const pgConfig = {
  max: 1,
  user: dbUser,
  password: dbPassword,
  database: dbName,
};

if (process.env.NODE_ENV === 'production') {
  pgConfig.host = `/cloudsql/${connectionName}`;
}

// Connection pools reuse connections between invocations,
// and handle dropped or expired connections automatically.
let pgPool;

exports.postgresDemo = (req, res) => {
  // Initialize the pool lazily, in case SQL access isn't needed for this
  // GCF instance. Doing so minimizes the number of active SQL connections,
  // which helps keep your GCF instances under SQL connection limits.
  if (!pgPool) {
    pgPool = new pg.Pool(pgConfig);
  }

  pgPool.query('SELECT NOW() as now', (err, results) => {
    if (err) {
      console.error(err);
      res.status(500).send(err);
    } else {
      res.send(JSON.stringify(results));
    }
  });

  // Close any SQL resources that were declared inside this function.
  // Keep any declared in global scope (e.g. mysqlPool) for later reuse.
};
0 голосов
/ 28 сентября 2019

Что такое сокетные соединения Unix и почему я должен использовать их поверх обычных соединений?

A Сокет домена Unix - это сокет для межпроцессного взаимодействия.Если у вас есть выбор между обменом данными между TCP-соединением и доменным сокетом Unix, доменный сокет Unix, вероятно, быстрее.

Что такое облачный SQL-прокси?Нужно ли использовать это?Если так, то почему?

Прокси Cloud SQL позволяет аутентифицировать соединение для подключения к базе данных, используя разрешения IAM для учетной записи службы.

Поскольку Cloud SQL является облачной базой данных, для обеспечения его безопасности требуется (по умолчанию) некоторая форма аутентификации.Прокси-сервер является более безопасным способом подключения по сравнению с самоуправляемым сертификатом SSL или IP-адресом из белого списка.

Нужно ли мне выполнять какую-либо дополнительную работу для подключения к моему экземпляру Cloud SQL из Cloud Run?

Cloud Run позаботится о том, чтобы прокси-сервер был для вас, но вынеобходимо сделать следующее:

  1. Включить API-интерфейс Cloud SQL
  2. Добавить экземпляр Cloud SQL в ваше развертывание Run (, выполните следующие действия ).
  3. Убедитесь, что учетная запись службы, выполняющая ваш код, имеет разрешения Cloud SQL Client IAM (это делается для учетной записи службы по умолчанию в шаге 2)
  4. Настройте приложение для подключения с /cloudsql/INSTANCE_CONNECTION_NAME
...