GCP Cloud Функции подключения к облаку SQL с частным IP

Я следую этому примеру, чтобы установить соединение между облачной функцией и Postgres Cloud SQL: https://cloud.google.com/functions/docs/sql.

Когда я создаю тестовый экземпляр Cloud SQL с Public IP и запускаю функцию облака, он подключается к экземпляру Cloud SQL и что-то возвращает. По соображениям безопасности я не могу оставить Public IP включенным, поэтому, когда я выбираю Private IP в облачном экземпляре SQL, я получаю:

Error: function crashed. Details:
could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/cloudsql/cloud-sql-test-250613:us-central1:myinstance-2/.s.PGSQL.5432"?

Я не могу получить из документации, что такое контракт между облачной функцией и облачным SQL-экземпляром. Если мы используем доменные сокеты Unix, следует ли мне вообще беспокоиться об IP-адресах? Имеет ли значение, является ли это публичным или частным? Если это имеет значение, должен ли я пройти через весь процесс настройки инфраструктуры частного IP? Нужен ли бессерверный VPC?

1 ответ

Благодаря этому мне удалось установить связь между облачной функцией и частным экземпляром Cloud SQL.

Кажется, что имеет значение, если вы отключаете общедоступные IP-адреса, всякий раз, когда я отключал общедоступные IP-адреса, я продолжал получать ERR CONN REFUSED, что, как кажется, является вашим случаем, чтобы ваш экземпляр Cloud SQL был только с частным IP-адресом, я думаю, что вам действительно нужно использовать Serverless VPC.

Вот что я бы порекомендовал вам попробовать:

Убедитесь, что вся ваша инфраструктура находится в одном регионе (Cloud SQL, Cloud Function,VPC Connector)

Сделайте эти шаги, пожалуйста:

  1. Установите для экземпляра Cloud SQL только частное подключение. (Облачный экземпляр SQL> Соединения)

  2. Убедитесь, что ваш частный экземпляр CloudSQL находится в нужной "Связанной сети" (VPC).

  3. Создайте соединитель VPC в сети VPC, в которой находится ваш экземпляр Cloud SQL. (тот, который связан с экземпляром MySql)

    Чтобы создать соединитель, перейдите: VPC Network > VPC Serverless Access > Создать соединитель

    В VPC Network > [Your VPC] > VPC Network Peering вы можете проверить правильность соединения с вашим экземпляром Cloud SQL.

  4. Создайте облачную функцию, используя код на желаемом языке. (Вы можете проверить с примерами в документации.)

При создании облачной функции убедитесь, что она установлена ​​в том же регионе, а также добавьте созданный вами коннектор VPC в параметр "Выходные параметры" в облачной функции.

Если вы попытаетесь создать VPC Connector через консоль GCP, вы сможете выбрать только 1 зону. Но если вы используете облачную оболочку, вы можете определить другие области. Вы можете попробовать это с помощью этой команды и в этих областях.

Коннекторы vpc-доступа для сетей бета-вычислений gcloud создают [CONNECTOR_NAME] \ --network [VPC_NETWORK] \ --region [REGION] \ --range [IP_RANGE]

Области:

США-Центральный1, США-Восток1, Европа-Запад1

Пожалуйста, дайте мне знать, если это сработало для вас.

ОБНОВИТЬ:

Привет еще раз, alobodzk,

Попробуйте создать свою облачную функцию в Python (однажды убедившись, что все предыдущие шаги в порядке).

Попробуйте этот код:

Облачная функция index.js (замените все данные соединителя своими учетными данными)

import mysql.connector
from mysql.connector import Error


def mysql_demo(request):
    import mysql.connector
    from mysql.connector import Error
    try:
        connection = mysql.connector.connect(host='CloudSQL Instance Private IP', database='Database Name, user='UserName', password='Password')
        if connection.is_connected():
            db_Info = connection.get_server_info()
            print("Connected to MySQL database... MySQL Server version on ",db_Info)
            cursor = connection.cursor()
            cursor.execute("select database();")
            record = cursor.fetchone()
            print ("Your connected to - ", record)
    except Error as e :
        print ("Error while connecting to MySQL", e)
    finally:
        #closing database connection.
        if(connection.is_connected()):
            cursor.close()
            connection.close()
            print("MySQL connection is closed")
# [END functions_sql_mysql]

Функция облачных вычислений

psycopg2==2.7.7
PyMySQL==0.9.3
mysql-connector-python
Другие вопросы по тегам