Mysql: Google Cloud SQL di App Engine - String Koneksi Kedaluwarsa?

Dibuat pada 25 Sep 2016  ·  35Komentar  ·  Sumber: go-sql-driver/mysql

Deskripsi masalah

Dalam readme untuk driver ini, string koneksi untuk menghubungkan ke Google Cloud SQL di App Engine diberikan sebagai:

user@cloudsql(project-id:instance-name)/dbname

Sementara dokumentasi paket cloudsql Google juga menegaskan ini untuk driver Anda, ada posting di Stack Overflow seperti ini yang mengklaim bahwa seseorang perlu menggunakan projectid:regionname:instancename daripada projectid:instancename .

Apa string koneksi yang benar? Tak satu pun dari ini saat ini berfungsi.

Contoh kode

Posting yang lebih rinci dapat ditemukan di sini: http://stackoverflow.com/questions/39668672/trouble-connecting-to-google-cloud-sql-server-from-deployed-app

Catatan eror

Server saya mengembalikan respons 500 setiap kali saya melakukan panggilan ke titik akhir yang menggunakan database Cloud SQL. Koneksi database berfungsi dengan baik ketika saya terhubung ke server dari versi aplikasi saya yang disajikan secara lokal.

Saya telah mencoba berbagai string koneksi, dan berikut adalah beberapa kesalahan yang dicatat di Google Cloud Console:

5447 [Warning] 'user' entry 'root<strong i="21">@localhost</strong>' ignored in --skip-name-resolve mode.

5447 [Warning] entry 'root'@'localhost' in mysql.user is ignored because it duplicates entry in mysql.system_user

14409 [Note] Aborted connection 14409 to db: 'User' user: 'root' host: 'xxx.xxx.xxx.xxx' (Got an error reading communication packets)

(Tidak ada kata sandi yang ditentukan dalam string koneksi karena dokumentasi tidak menentukan perlunya kata sandi. Postingan ini menyebutkan bahwa kata sandi koneksi harus nol ketika aplikasi mencoba terhubung ke server menggunakan root@localhost .)

6170 [Note] Access denied for user 'root'@'cloudsqlproxy~xx.xxx.xxx.xx' (using password: NO) 

Saya juga mencoba menghubungkan dengan pengguna selain pengguna root (nama pengguna: pengguna baru):

5447 [Warning] 'user' entry 'newuser<strong i="30">@localhost</strong>' ignored in --skip-name-resolve mode.

Konfigurasi

_Versi driver (atau git SHA):_ https://github.com/go-sql-driver/mysql/tree/3654d25ec346ee8ce71a68431025458d52a38ac0

_Go version:_ go version go1.6.2 linux/amd64

_Versi server:_ Instance Google Cloud SQL menjalankan MySQL 5.7

_Server OS:_ Dari tab Compute Engine, sepertinya server yang menghosting versi terbaru aplikasi saya menjalankan Debian 7.11 (Wheezy)

documentation

Komentar yang paling membantu

@bagatelli Untuk memperjelas, pastikan Anda menggunakan format string koneksi yang disebutkan dalam komentar ini: http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error- dengan-google-cloud-sql-2nd#comment65140499_38890022

Maaf atas kependekan sebelumnya. Kami menggunakan generasi ke-2 dalam produksi dari Go di App Engine tanpa masalah. Abaikan saja parameter "tlsConfigName" karena proxy SQL akan menambahkannya, tetapi bagaimanapun mereka melaporkan bahwa TLS sekarang tetap didukung.

Semua 35 komentar

user@cloudsql (project-id:instance-name)/dbname
Apakah yang lama. Masih berfungsi karena saya masih menggunakannya.

Baru-baru ini gae mulai mengkategorikan database ke dalam wilayah juga maka format baru. Jika cloudsql Anda dikategorikan ke dalam suatu wilayah, Anda harus menggunakan format baru

Mungkin driver ini tidak mengurai format baru dengan benar. Itu mungkin masalahnya

Dalam kasus Anda, apakah Anda menjalankan server Cloud SQL generasi kedua?

Tidak ada gen pertama

Saya menduga driver tidak mengurai format baru. Kode mungkin perlu diubah sehingga mengambil konten sebelum titik dua pertama dan konten setelah titik dua pertama terlepas dari keberadaan titik dua baru

Ada permintaan tarik saat ini memperbarui baca saya

Terimakasih atas peringatannya. Saya baru saja meninggalkan komentar pada PR itu.
Sebagai solusi sementara, saya akan menyiapkan server generasi pertama hingga masalah driver diperbaiki.

Pembaruan: Sepertinya ada masalah dengan driver saat aplikasi Google App Engine yang diterapkan mencoba terhubung ke Google Cloud SQL Server generasi kedua.

Saya membuat Cloud SQL Server generasi pertama dan berhasil terhubung ke server menggunakan aplikasi Google App Engine yang diterapkan dengan string koneksi ini:

user@cloudsql(project-id:instance-name)/dbname

Tidak ada nama wilayah yang diperlukan.

Parsing seharusnya tidak menjadi masalah, driver mengambil semuanya di antara parens: https://github.com/go-sql-driver/mysql/blob/master/dsn.go#L282
Ini hanya digunakan di https://github.com/go-sql-driver/mysql/blob/master/driver.go#L65

Dapatkah seseorang dengan akun cloudsql mengunduh driver, edit https://github.com/go-sql-driver/mysql/blob/master/appengine.go#L14 dan ganti "appengine/cloudsql" dengan "google.golang.org/appengine/cloudsql" , coba dengan versi lama dan baru dengan dan tanpa wilayah dan laporkan apa yang berhasil? Terima kasih!

_Teman-teman, untuk referensi: _
Solusi yang disediakan Google untuk menghubungkan ke generasi ke-2 ada di sini:
http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-with-google-cloud-sql-2nd

Dokumentasi yang diposting Google (dan mungkin masih) salah , tetapi solusi yang benar diposting di sana. Kami menggunakan Cloud SQL generasi ke-2 dalam produksi tanpa masalah.

Apakah ada solusi untuk ini? Jelas tidak bekerja dengan CloudSQL Generasi Kedua.

@bagatelli lihat komentar saya di atas komentar Anda

@benguild Saya telah melihat komentar Anda di banyak tempat. Namun Anda berasumsi bahwa setiap orang menggunakan SSL dalam koneksi mereka yang tidak berlaku untuk semua orang. Tentu itu bukan milikku. Pesan kesalahan yang saya dapatkan adalah "Driver: Koneksi Buruk". Basis data bahkan tidak tercapai karena driver tidak dapat mengidentifikasi parameter koneksi dengan benar. Saya pikir masalahnya terletak di suatu tempat di kekacauan yang ada dengan paket "appengine baru" dan "appengine lama" yang menyebabkan banyak hal rusak dan Google tidak repot-repot mendokumentasikan perubahan ini dengan benar.

@bagatelli Untuk memperjelas, pastikan Anda menggunakan format string koneksi yang disebutkan dalam komentar ini: http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error- dengan-google-cloud-sql-2nd#comment65140499_38890022

Maaf atas kependekan sebelumnya. Kami menggunakan generasi ke-2 dalam produksi dari Go di App Engine tanpa masalah. Abaikan saja parameter "tlsConfigName" karena proxy SQL akan menambahkannya, tetapi bagaimanapun mereka melaporkan bahwa TLS sekarang tetap didukung.

@benguild . Terima kasih atas semua upaya Anda dalam membantu saya dalam semua masalah ini.
Apakah Anda menggunakan "mesin aplikasi baru" atau "mesin aplikasi lama"? Saya baru saja menghabiskan hari mengubah semua kode saya menjadi mimpi buruk baru ini yang merupakan paket appengine baru dan seperti yang mungkin Anda ketahui dari posting saya yang lain, saya tidak dapat lagi menggunakan kode saya dan oleh karena itu saya tidak dapat menguji dengan benar apa yang Anda sarankan di atas . Saya akan mencoba lagi segera setelah saya menemukan solusi untuk menerapkan aplikasi saya.
Terima kasih!

@bagatelli Jika Anda mengalami masalah dalam menerapkan, coba tarik kode Anda ke VM atau gunakan Google Cloud Console.

@bagatelli Apa yang saya katakan adalah... untuk mencobanya di mesin baru, atau menggunakan konsol cloud mereka (yang sudah memiliki alat dev) sebelum Anda menghapus fakta bahwa itu pasti tidak terkait dengan lingkungan.

Saat ini saya tidak dapat menerapkan menggunakan macOS Sierra karena bug yang berumur 4 bulan, tetapi kami dapat menggunakan dengan baik dari VM.

Saya yakin lebih banyak pekerjaan bagi Anda untuk meninggalkan lingkungan sepenuhnya jadi saya setidaknya memastikan untuk mengesampingkannya sebelum berhenti sepenuhnya.

@pjebs . Tidak yakin dari mana Anda mendapatkan asumsi ini, tetapi saya tidak menggunakan lingkungan yang fleksibel.

@pjebs Itu salah. Begitulah cara Anda menerapkan ke standar.

@pjebs appcfg.py update juga berfungsi.

@bagatelli Saya mendengar Anda— Saya biasanya cenderung meminimalkan ketergantungan pihak ketiga saya dan juga ketergantungan API karena apa yang Anda katakan itu benar... Google tidak berkewajiban untuk memberikan dukungan, meskipun mereka akan mempertaruhkan reputasi mereka jika tidak.

Saya tidak yakin apa sebenarnya masalah Anda saat ini (selain menggunakan API lama, menurut saya?), tetapi setiap perangkat lunak yang saya kembangkan untuk App Engine, saya juga kembangkan dengan tujuan untuk keluar dari App Engine jika dan saat dibutuhkan. Misalnya, untuk setiap antarmuka Google API yang saya gunakan, saya menulis "pembantu" untuk itu benar-benar memanggil metode dan menyediakannya sendiri ke seluruh aplikasi sehingga dan hanya itu yang perlu disesuaikan dengan lingkungan baru bila perlu dan [ semoga] tanpa merusak sisa aplikasi.

Bagi saya, App Engine lebih nyaman karena merupakan lingkungan yang memerlukan sedikit konfigurasi selain untuk penskalaan dan preferensi, dan menyediakan beberapa API yang hebat. Ini menjengkelkan ketika terjadi kesalahan, tetapi mereka menawarkan dukungan premium jika Anda memiliki masalah seperti yang Anda bicarakan?

@pjebs. Sejauh yang saya mengerti goapp hanyalah pembungkus untuk appcfg.py. Itu akan berakhir memanggil appcfg.py di beberapa titik.

@bagatelli Tentu, kirimi saya email. Tidak masalah

@benguild . Saya akhirnya berhasil menerapkan aplikasi saya, namun tetap tidak berhasil terhubung ke CloudSQL.
Saya telah memperbarui seluruh aplikasi saya untuk menggunakan paket "new appengine" serta mengatur impor clousql ke google.golang.org/appengine/clousql di "appengine.go" pada paket mysql-driver.
Saya kemudian membuat sertifikat klien dari Panel Kontrol CloudSQL dan memperbarui kode saya menggunakan RegisterTLSConfig seperti yang dijelaskan dalam dokumentasi driver yang menyediakan konfigurasi tls sebagai parameter seperti yang dinyatakan dalam posting Anda di stackoverflow. Koneksi url saya terlihat seperti ini:

root:password@cloudsql (instance-connection-name-copied-from-cloud-console)/myDatabase?tls=customTls

Masih belum beruntung. Kesalahan:

Pengemudi: Koneksi Buruk

@arnehormann . Ini menjawab pertanyaan Anda dari posting Anda di atas.

@bagatelli Cobalah tanpa TLS.

@benguild . Mencoba tanpa tls. Tidak beruntung.

Pengemudi: Koneksi Buruk

@pjebs . Tidak yakin apakah Anda sepenuhnya memahami masalah di sini. Pengemudi bahkan tidak mencapai database. Saya mengerti apa yang Anda sebutkan di atas mungkin benar pada lingkungan produksi tetapi saya bahkan tidak dapat membuat satu koneksi pun ke database sehingga dalam kasus saya hal di atas tidak berlaku sama sekali.

@bagatelli Apa yang akan saya lakukan adalah memposting di Stack Overflow seperti yang saya lakukan dan menandainya dengan: google-cloud-sql ... Seseorang dari Google harus merespons, saya harap.

Jika Anda mengalami masalah ini maka mereka ingin mengindeksnya untuk orang lain yang memiliki masalah yang sama. Tanggapi kembali di sini dengan tautan ke pertanyaan setelah diselesaikan.

Kemungkinan besar itu masih ada hubungannya dengan implementasi Anda karena seperti yang saya katakan orang menggunakan generasi ke-2 dalam produksi dan itu keluar dari beta.

@bagatelli Apakah Anda ingat untuk menonaktifkan setelan "Diperlukan TLS" untuk instans di Cloud Console?

Terima kasih @benguild dan @pjebs . Akan memposting di SO dan memberikan pembaruan di sini jika saya menemukan penyebabnya.

@benguild . Saya tidak dapat melihat penyebutan TLS di Cloud Console

Saya pikir maksud Anda "Hanya izinkan Koneksi SSL". Jika ini yang Anda bicarakan maka ya, itu tidak aktif.

Ok teman-teman, saya telah menemukan masalahnya. Dan itu bukan driver, aplikasi saya, atau CloudSQL. Proyek tempat saya menerapkan aplikasi dibuat bertahun-tahun yang lalu melalui konsol pengembang lama.
Di tab Kontrol Akses di Cloud Console, ada label yang mengatakan " Aplikasi dalam proyek ini: Semua diotorisasi." dan ketika sebuah proyek dibuat, itu juga membuat akun appengine dan mesin komputasi default. Masalahnya adalah bahwa proyek khusus ini tidak memiliki kedua akun default dan cukup yakin itulah masalahnya. Apa yang mungkin terjadi adalah bahwa Google tidak membuat akun tersebut ketika mereka memigrasikan mesin aplikasi ke konsol cloud yang menggunakan IAM & Admin untuk mengelola akun akses.
Saya berasumsi bahwa karena ketika saya melihat akun default yang hilang, saya membuat proyek baru dan database cloud sql baru dan menerapkan kode yang sama persis ke proyek baru ini dan _voila_...Semua berfungsi dengan baik.
@benguild @pjebs Sangat menghargai semua upaya Anda membantu saya mengatasi masalah ini.
@benguild Saya telah menghapus semua komentar yang tidak terkait dari percakapan kami sebelumnya karena saya pikir kami berada di halaman yang sama terkait dengan AppEngine/Google. Akan mengirimkan email tentang itu nanti.
Saya telah memposting pertanyaan ini di StackOverflow dan akan menjawabnya dengan penemuan ini sehingga orang lain dengan masalah yang sama dapat mengambil manfaat darinya.
http://stackoverflow.com/questions/40020782/connect-to-google-sql-cloud-2nd-generation-with-go-on-appengine

Terima kasih lagi!

Ya, jika App Engine tidak memiliki akses ke instance SQL maka Anda akan mendapat masalah. 👍🏻

Diperbaiki oleh #485

Yang bisa saya katakan adalah terima kasih @benguild ! Anda membantu saya berhenti membenturkan kepala ke keyboard setelah 500 tab chrome terbuka dan 5 jam googling! Haleluya!!!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat