【问题标题】:Missing socket for connection to Cloud SQL from Google App Engine standard environment缺少用于从 Google App Engine 标准环境连接到 Cloud SQL 的套接字
【发布时间】:2019-04-05 13:01:47
【问题描述】:

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

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

关于我尝试的更多信息:

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

有没有人遇到并解决过这个问题?

关于这个问题的 SO 问题要么是老问题,要么没有答案,要么不能解决我的环境中的问题。

【问题讨论】:

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


    【解决方案1】:

    我能够使用以下配置获得连接:

    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}
    

    【讨论】:

    • 你能在云控制台终端看到/cloudsql/{instance_name}的unix socket文件吗?
    • 另外,在您在app.yaml 中添加实例之后,在部署应用程序之前您还需要做其他事情吗?
    【解决方案2】:

    基于类似的问题,最可能的根本原因在此处详述: https://issuetracker.google.com/117804657#comment16

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

    • SQL 实例缺少公共 IP
    • 在配置设置中指定端口

    以下是一些建议:

    • 在本地运行应用程序以确保它在部署到 App Engine 之前可以正常工作。
    • 仔细检查 app.yaml 文件中的 Cloud SQL 配置(例如用户名、密码、实例连接名称)。
    • 确保已启用 Google Cloud SQL API。
    • 尝试重新创建 Cloud SQL 实例。

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

    干杯

    【讨论】:

    • 为什么需要公网IP?如果我们使用文件套接字,我很难理解为什么我们需要 IP 设置?这是一些底层 GCP 基础设施设置要求吗?它不能与私有 IP 一起使用吗?
    【解决方案3】:

    我通过启用 Cloud SQL Admin API 解决了这个问题。

    https://cloud.google.com/sql/docs/postgres/debugging-connectivity

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 2023-03-11
      • 2018-08-09
      • 2020-06-07
      • 2017-06-17
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      相关资源
      最近更新 更多