App Engine не может подключиться к базе данных gcloud sql - PullRequest
0 голосов
/ 22 сентября 2019

Я использую Laravel с gcloud для создания веб-сайта (App Engine) и базы данных (SQL), но по какой-то причине я не могу заставить App Engine подключиться к базе данных.

ОшибкаЯ получаю "SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from пользователей )" из собственной отладки laravel и "Failed to load resource: the server responded with a status of 500 ()" из окна проверки браузера.

Это прекрасно работает, если я запускаю локальный экземпляр, так как я позволил своему IP получить доступбаза данных SQL.Я также могу просматривать данные с помощью MySQL Workbench.

Я использовал в следующем руководстве .Существует также один для стандартной среды, но я даже не дошел до этого.Использование 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 и admin IAM.
  6. Нажмите кнопку Добавить, введите адрес электронной почты в качестве участника и выберите Cloud SQL Client в качестве роли.Затем нажмите Add.

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

1 голос
/ 23 сентября 2019

Чтобы база данных 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.

0 голосов
/ 25 сентября 2019

У меня все получилось благодаря комментарию Сэмюэля Ромеро.Я следовал следующему «учебному пособию»: 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, который я должен был включить, но, возможно,был отключен по какой-то причине.А потом я также запустил «gcloud auth application-default login» в Cloud SDK.

Надеюсь, это кому-нибудь поможет, и если с этим возникнет проблема безопасности, сообщите мне.

...