私はGoogle Cloud SQLインスタンス(第2世代)を使用しており、自分のIPを承認した後、ローカルに正常に接続できます。テーブルから行を正常に取得するGoコードと、テーブルに行を正常に追加するコードがあります。ただし、アプリをデプロイすると、アプリがサーバーに接続できません。SQL関数が呼び出されるたびに、サーバーは500応答を返します。私のアプリは、このSQLインスタンスへの接続を承認されています。
次のGo接続コードを使用しています。
func dialSQL() (*sql.DB, error) {
if appengine.IsDevAppServer() {
return sql.Open("mysql", "root:password@tcp(xxx.xxx.xxx.xxx:3306)/Dbname")
} else {
return sql.Open("mysql", "root@cloudsql(projectid:regionname:instancename)/Dbname")
}
}
デプロイされたバージョンとローカルバージョンは同じコードベースを使用していますが、デプロイされたバージョンはdialSQL()
関数の2番目の接続文字列を使用しています。
私はこのGo MySQLドライバーを使用しています:https : //github.com/go-sql-driver/mysql
このドライバーのドキュメントには、Google App Engineを介してGoogle Cloud SQLサーバーに接続するための次の接続文字列が記載されています。 user@cloudsql(project-id:instance-name)/dbname
この投稿ではregionname
:google app engine golang、driver:bad connectionを含める必要があると述べているので、projectid:instancenameではなくprojectid:regionname:instancenameを使用しています。
紛らわしいことに、Googleのドキュメントでは次も省略していregionname
ます:https : //cloud.google.com/appengine/docs/go/cloud-sql/reference
接続文字列の両方のバリエーションを試しました。
この投稿によると、デプロイされたアプリはhost = localhostを使用してサーバーに接続しようとします。この投稿によると、「root」@「localhost」のパスワードはnullである必要があります。
mysqlコンソールで次のクエリを実行して、ユーザー「root」@「localhost」が実際にnullパスワードを持っていることを確認しましたselect User, Host, HEX(authentication_string) from mysql.user
。'root' @ '%'ユーザーは、Google Cloud SQLインスタンスコンソールで指定したパスワードをまだ持っています。
GAEアプリとCloud SQLサーバーのリージョンに関して考えられる問題を調査しましたが、それらは同じリージョンにあります。また、第2世代のGoogle Cloud SQLサーバーでは、アプリのリージョンとサーバーの違いが許可されていることも学びました。
また、新しいユーザーを作成し、接続文字列で新しいユーザーのユーザー名を使用してインスタンスに接続しようとしました。これはエラーを修正しませんでした。
ファイアウォールルールも追加してみましたが、これでも問題は解決しませんでした。
最後に、Google Cloud ConsoleのCompute Engineセクションに移動し、アプリの最新インスタンスを提供しているVMにSSH接続しました。Cloud SQLサーバーのIPへのpingは成功しましたが、telnet xxx.xxx.xxx.xxx 3306
タイムアウトしました。私も実行lsof -i TCP:3306
しましたlsof -i | grep 3306
が、プロセスは表示されませんでした。また、このボックスにmysqlをインストールし、そこからサーバーに接続しようとしましたが、接続に失敗しました。
誰かがこの問題を引き起こしている可能性があることを知っていますか?
デプロイされたGoogle App Engineアプリケーションが第2世代の Google Cloud SQL Server に接続しようとすると、Go MySQLドライバーに問題がある可能性があります。
第1世代の Cloud SQLインスタンスを作成し、次の接続文字列を使用して、デプロイされたGoogle App Engineアプリケーションを使用してサーバーに正常に接続できました。
user@cloudsql(project-id:instance-name)/dbname
リージョン名は必要ありませんでした。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加