缺少用于从Google App Engine标准环境连接到Cloud SQL的套接字

时间:2019-04-05 13:01:47

标签: google-app-engine google-cloud-platform google-cloud-sql

我正在尝试将标准环境中的Python 3.7 GAE应用程序连接到Cloud SQL Postgres 9.6数据库。 此doc中描述了该过程。

不幸的是,GAE实例上不存在通常用于连接数据库的UNIX套接字/cloudsql/<DB_CONNECTION_NAME>(文件夹/cloudsql为空)。

有关我尝试过的内容的更多信息:

  • GAE应用程序和云SQL实例位于同一项目和区域中(我在europe-west1europe-west3中尝试过)
  • 我已在beta_settings配置文件中添加和删除了cloud_sql_instances-> app.yaml键,但无济于事。据我了解,无论如何,这仅应在灵活的环境中需要
  • 我已经激活了Cloud SQL Admin UI

有人遇到并解决了这个问题吗?

关于此问题的SO问题要么很旧,没有答案,要么无法在我的环境中解决。

2 个答案:

答案 0 :(得分:1)

基于类似的问题,在这里详细说明了最可能的根本原因: https://issuetracker.google.com/117804657#comment16

根据讨论,其他可能的原因可能是:

  • SQL实例上缺少公共IP
  • 配置设置中的端口规范

以下是一些建议:

  • 在本地运行该应用程序以确保其可以运行,然后再部署到App Engine。
  • 再次检查app.yaml文件上的Cloud SQL配置(例如,用户名,密码,实例连接名称)。
  • 确保已启用Google Cloud SQL API。
  • 尝试重新创建Cloud SQL实例。

在其他情况下,只需重新创建Cloud SQL实例或数据库即可,因为对快速入门的默认设置的修改可能难以跟踪。

欢呼

答案 1 :(得分:0)

我能够使用以下配置进行连接:

PROJECT=[[YOUR-PROJECT-ID]]
REGION=europe-west3
INSTANCE=instance-01

和:

import os

from flask import Flask

import psycopg2

db_user = os.environ.get('CLOUD_SQL_USERNAME')
db_pass = os.environ.get('CLOUD_SQL_PASSWORD')
db_name = os.environ.get('CLOUD_SQL_DATABASE')
db_conn = os.environ.get('CLOUD_SQL_INSTANCE')

app = Flask(__name__)


@app.route('/')
def main():
    host = '/cloudsql/{}'.format(db_conn)

    cnx = psycopg2.connect(
        dbname=db_name,
        user=db_user,
        password=db_pass,
        host=host
    )
    with cnx.cursor() as cursor:
        cursor.execute('SELECT NOW() as now;')
        result = cursor.fetchall()
    current_time = result[0][0]
    cnx.commit()
    cnx.close()

    return str(current_time)

和:

flask==1.0.2
psycopg2==2.8

,并且将${VARIABLE}替换为值:

runtime: python37
env_variables:
  CLOUD_SQL_INSTANCE: "${PROJECT}:${REGION}:${INSTANCE}"
  CLOUD_SQL_USERNAME: ${USERNAME}
  CLOUD_SQL_PASSWORD: ${PASSWORD}
  CLOUD_SQL_DATABASE: ${DATABASE}