2016-04-18 7 views
0

Ich habe dieses Problem für ein paar Tage festgefahren.Wie berechtige ich den Zugriff auf einen Datenbankbenutzer in Google Cloud SQL ordnungsgemäß?

Ich habe eine Anwendung für Appengine mit Django entwickelt und möchte Google Cloud SQL für meine Datenbank verwenden. Alles funktioniert gut, bis ich auf dem Entwicklungsserver anwenden Migrationen wollen, wenn es mit dem folgenden Fehler fehl:

django.db.utils.OperationalError: (1045, "Access denied for user 'MY_DB_USER'@'MY_IP' (using password: YES)") 

Was ich getan habe, ist wie folgt:

  1. Ich folgte den Anweisungen in der Django Support Seite zu entwickeln meine Anwendung.

  2. Um eine Cloud SQL-Instanz der ersten Generation zu erstellen, folgte ich die Schritte beschrieben here, mit dem Cloud SDK.

  3. Ich habe dann einen neuen Benutzer nach den Anweisungen here erstellt und ihm ein Passwort zugewiesen.
  4. entfaltet ich die Anwendung die folgende Befehlszeile verwenden:

    gcloud Vorschau App MY-APP-DIR/deploy app.yaml --Version 0-1-0

  5. ich meine IP autorisiert und meine AppEngine-Anwendungs-ID Sie sind beide im Abschnitt "Authorization" unter "Access Control" in meiner SQL-Instanz aufgeführt.

  6. Schließlich habe ich versucht, Migrationen mit der folgenden Befehlszeile anwenden:

    SETTINGS_MODE = 'prod' MY-APP-DIR/manage.py

settings.py

wandert

der relevante Teil meiner settings.py sieht wie folgt aus:

if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'): 
    DEBUG = False 
    # Running on production App Engine, so use a Google Cloud SQL database. 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.mysql', 
      'HOST' : '/cloudsql/[MY-PROYECT-ID]:[MY-CLOUD-SQL-INSTANCE]', 
      'NAME': '[MY-DB-NAME]', 
      'USER': 'root', 
     } 
    } 
elif os.getenv('SETTINGS_MODE') == 'prod': 
    DEBUG = False 
    # Running in development, but want to access the Google Cloud SQL instance 
    # in production. 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.mysql', 
      'NAME': '[MY-DB-NAME]', # db name. 
      'USER': '[MY-DB-USER]', 
      'PASSWORD' : '[MY-DB-USER-PASSWORD]', 
      'HOST' : '[IPV4 ASSIGNED IN GOOGLE CONSOLE]', 
      'PORT': '3306', 
     } 
    } 
else: 
    # Running in development, so use a local MySQL database. 
    DEBUG = True 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.mysql', 
      'NAME': '[MY-LOCAL-DB]', 
      'USER': 'root', 
      'PASSWORD': 'root', 
     } 
    } 

Irgendeine Idee, was könnte das Problem verursachen?

Vielen Dank!

Antwort

0

Ich endlich herausgefunden, was das Problem war.

Der richtige Weg, eine Benutzerdatenbank Zugriff zu gewähren, um Migrationen anzuwenden, ist die folgende:

  1. Weiße Liste Ihrer IP. Es sollte
  2. Erstellen einer neuen Datenbank-Benutzerkonto unter "Autorisierte Networks gezeigt werden, aber do nicht wählen, die‚jedem Host ermöglichen (%)‘Wildcard, statt wählen Sie die„Beschränken Host nach Name, Anschrift oder Adressbereich "und weisen Sie Ihre IP-Adresse zu (die, die Sie gerade auf die weiße Liste gesetzt haben).
  3. Sie sollten nun in der Lage sein, Migrationen mit dem Befehl auszuführen: SETTINGS_MODE='prod' PROJECT_DIR/manage.py migrate

Als Randbemerkung, stellen Sie sicher, dass der root Benutzer, dessen Wirt localhostnicht ein Passwort haben, sonst Ihre Anwendung App Engine kann keine Verbindung zur Datenbank herstellen.

Hoffe das hilft jemand anderem!