Google Cloud SQLインスタンス(第2世代)を使用しています。私はテーブルから行を正常に取得するGoコードがあり、テーブルに行を追加するコードがあります。しかし、私は私のアプリを展開すると、アプリは、サーバーに接続することができません。 SQL関数が呼び出されると、サーバーは500応答を返します。私のアプリは、このSQLインスタンスに接続することが許可されていますデプロイされたアプリケーションからGoogle Cloud SQLサーバーに接続する際に問題が発生しました。
私は、次の囲碁接続コード使用しています:
func dialSQL() (*sql.DB, error) {
if appengine.IsDevAppServer() {
return sql.Open("mysql", "root:[email protected](xxx.xxx.xxx.xxx:3306)/Dbname")
} else {
return sql.Open("mysql", "[email protected](projectid:regionname:instancename)/Dbname")
}
}
にデプロイされたバージョンとローカルバージョンを同じコードベースを使用していますが、展開されたバージョンでは、dialSQL()
関数の2番目の接続文字列が使用されます。私はPROJECTIDを使用しています[email protected](project-id:instance-name)/dbname
:https://github.com/go-sql-driver/mysql
このドライバのドキュメントをGoogleのApp Engineを経由してGoogleクラウドSQLサーバーに接続するための次の接続文字列を言及:私は、このゴーMySQLドライバを使用しています
: regionname:むしろPROJECTIDよりINSTANCENAME:INSTANCENAMEこの記事はregionname
を含める必要性に言及しているため:紛らわしいgoogle app engine golang, driver: bad connection
、Googleのドキュメントもregionname
を省略:https://cloud.google.com/appengine/docs/go/cloud-sql/reference
私は両方の接続文字列を試しました。
this postによると、配備されたアプリケーションはhost = localhostを使用してサーバーに接続しようとし、this postに従って、 'root' @ 'localhost'のパスワードはnullにする必要があります。
mysqlコンソールで次のクエリを実行して、ユーザー 'root' @ 'localhost'が実際にヌルパスワードを持っていることを確認します:select User, Host, HEX(authentication_string) from mysql.user
。 'root' @ '%'ユーザーにはまだGoogle Cloud SQLインスタンスコンソールで指定したパスワードがあります。
私は、GAEアプリケーションとCloud SQLサーバーの領域に関してはpossible issueを調べましたが、それらは同じ地域にあります。私はまた、第2世代のGoogle Cloud SQLサーバーでは、アプリケーションとサーバーの領域が異なることを認識しました。
また、新しいユーザーを作成し、接続文字列に新しいユーザーのユーザー名でインスタンスに接続しようとしました。これでエラーは修正されませんでした。
私は、ファイアウォールルールを追加しようとしたが、これはどちらかの問題を解決しませんでした:
は最後に、私はGoogleクラウドコンソールのCompute Engineのセクションに行って、VMにSSHed私のアプリの最新のインスタンスを提供しています。私は正常にクラウドSQLサーバーのIPをpingしましたが、telnet xxx.xxx.xxx.xxx 3306
がタイムアウトしました。私もlsof -i TCP:3306
とlsof -i | grep 3306
を実行しましたが、プロセスはありませんでした。私もこのボックスにmysqlをインストールし、そこからサーバーに接続しようとしましたが、接続に失敗しました。
誰でもこの問題の原因が分かっていますか?
私はまったく同じ問題を抱えており、第一世代DBに切り替えることで問題が解決されます。第二世代DBの問題の原因を突き止めるための進歩はありましたか? –
標準環境で実行されているGoogleのGAEアプリから、Google Cloud SQL Serverの第2世代に接続できなかったため、引き続き第1世代のサーバーを使用しました。私はいくつかのテストを行い、柔軟なappengine環境で実行される単純なGAEアプリケーションを作成し、それから第2世代のSQLサーバーに接続することができました。問題はアプリエンジン環境に関連している必要があります。 – rudolph1024