App Engine无法连接到gcloud sql数据库

时间:2019-09-22 10:17:06

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

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

我遇到的错误是来自laravel自己的调试的"SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from个用户)"和来自浏览器检查窗口的"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 Client作为角色。然后点击添加。

    • 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"
]

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

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

谢谢。

2 个答案:

答案 0 :(得分: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一起使用。

答案 1 :(得分:0)

多亏塞缪尔·罗梅罗(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应用程序默认登录名”。

希望这会对某人有所帮助,如果与此相关的安全性问题,请告诉我。