【问题标题】:App Engine can't connect to gcloud sql databaseApp Engine 无法连接到 gcloud sql 数据库
【发布时间】:2019-09-22 10:17:06
【问题描述】:

我一直在使用 Laravel 和 gcloud 创建网站 (App Engine) 和数据库 (SQL),但由于某种原因,我无法让 App Engine 连接到数据库。

我得到的错误是来自 laravel 自己的调试的 "SQLSTATE[HY000] [2002] No such file or directory (SQL: select * fromusers)" 和来自浏览器检查窗口的 "Failed to load resource: the server responded with a status of 500 ()"

如果我运行本地实例,它工作正常,因为我允许我的 IP 访问 SQL 数据库。我还可以使用 MySQL 工作台查看数据。

我用过the following tutorial。 标准环境也存在一个,但我什至没有做到这一点。 使用 Laravel 5.5 效果更好。

我尝试过的其他事情包括连接 App Engine,就像它是一个与数据库不在同一个项目中的外部应用程序一样。 https://cloud.google.com/sql/docs/mysql/connect-app-engine 其中还包括向服务帐户授予角色:https://cloud.google.com/iam/docs/granting-roles-to-service-accounts

我还做了以下步骤:

  1. 转到 IAM 和管理服务帐户页面。
  2. 选择包含您的 App Engine 应用程序的项目。
  3. 找到 App Engine 默认服务帐户并复制其下的电子邮件地址 (xxxx@appspot.gserviceaccount.com)。
  4. 使用左上角的项目菜单,返回到包含此 SQL 实例(项目名称)的项目。
  5. 转到 IAM 和管理 IAM 页面。
  6. 单击添加,输入电子邮件地址作为成员,然后选择 Cloud SQL 客户端作为角色。然后点击添加。

    • App.yaml 如下所示
env: flex

runtime_config:
  document_root: public

# Ensure we skip ".env", which is only for local development
skip_files:
  - .env

env_variables:
  # Put production environment variables here.
  APP_LOG: errorlog
  APP_KEY: app-key
   ## Set these environment variables according to your CloudSQL configuration.

  DB_CONNECTION: mysql
  DB_HOST: sql-ip
  DB_PORT: 3306
  DB_DATABASE: database-name
  DB_USERNAME: db-username
  DB_PASSWORD: pass
  DB_SOCKET: /cloudsql/instance-connection:name
  beta_settings: 
  cloud_sql_instances: instance-connection:name```
  • 我还在 composer.json 中使用以下内容来允许访问文件和缓存配置。 755 的作品类似,应该是最终的。
    "chmod -R 777 bootstrap\/cache",
    "chmod -R 777 storage",
    "php artisan config:cache"
]

还值得注意的是,引导配置文件有错误,使其指向我的本地文件 计算机而不是上传的文件。

如果您需要更多信息,请询问。

谢谢。

【问题讨论】:

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


【解决方案1】:

为了让 gcloud sql 数据库与 App Engine 实例连接,您的数据库环境变量应如下所示:

  DB_CONNECTION: mysql
  DB_HOST: localhost;unix_socket=/cloudsql/instance-connection:name
  DB_DATABASE: database-name
  DB_USERNAME: db-username
  DB_PASSWORD: pass

请注意,不要使用 DB_PORT 并使用带有 DB_HOST 的套接字。

【讨论】:

  • 不幸的是它并没有解决我的问题,仍然得到同样的错误。虽然它仍然像以前一样工作,所以我会保持这样,谢谢
【解决方案2】:

感谢 Samuel Romero 的评论,我得到了它的工作。 我遵循以下“教程”:https://cloud.google.com/appengine/docs/flexible/python/using-cloud-sql 使我的 app.yaml 文件如下所示

runtime: php
env: flex

runtime_config:
  document_root: public

# Ensure we skip ".env", which is only for local development
skip_files:
  - .env

env_variables:
  SQLALCHEMY_DATABASE_URI: >-
    mysql+pymysql://USERNAME:PASSWORD@/DATABASE?unix_socket=/INSTANCE_CONNECTION_NAME
  # Put production environment variables here.
  APP_LOG: errorlog
  APP_KEY: APPKEY
  ## Set these environment variables according to your CloudSQL configuration.

  DB_CONNECTION: mysql
  DB_HOST: localhost;unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME
  DB_DATABASE: DATABASE
  DB_USERNAME: USERNAME
  DB_PASSWORD: PASSWORD
beta_settings:
  cloud_sql_instances: INSTANCE_CONNECTION_NAME

除了启用 Cloud SQL API 之外,我应该启用但可能由于某种原因被禁用。 然后我还在 Cloud SDK 中运行了“gcloud auth application-default login”。

希望这会对某人有所帮助,如果存在安全问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2021-01-28
    相关资源
    最近更新 更多