无法通过自定义运行时在Docker中运行.NET Core应用的App Engine连接到Google Cloud SQL中的Postgres

迈克尔·哈里斯

我尝试了很多事情,但似乎无法通过Exception while connectingGoogle Cloud App Engine连接到Google Cloud PostgreSQL实例。

作为开发人员,这可能是我经历过的最令人沮丧的事情。连接数据库并不难。

我究竟做错了什么?

无效的事情:

app.yaml:

runtime: custom
env: flex
beta_settings:
  cloud_sql_instances: "<project-id>:<region>:<sql-instance>=tcp:5432"

最终使用的连接字符串:

Uid=<db_user>;Pwd=<db_password>;Host=cloudsql;Database=<db_name>

// other attempts:
Uid=<db_user>;Pwd=<db_password>;Host=cloudsql;Database=<db_name>;Port=5432
Uid=<db_user>;Pwd=<db_password>;Host=/cloudsql/<project-id>:<region>:<sql-instance>;Database=<db_name>
Uid=<db_user>;Pwd=<db_password>;Host='/cloudsql/<project-id>:<region>:<sql-instance>';Database=<db_name>
Uid=<db_user>;Pwd=<db_password>;Server='/cloudsql/<project-id>:<region>:<sql-instance>';Database=<db_name>

用法:

var connectionString = new NpgsqlConnectionStringBuilder(<connection string>)
{
    SslMode = SslMode.Disable
};

NpgsqlConnection connection =
    new NpgsqlConnection(connectionString.ConnectionString);

connection.Open();

相关堆栈跟踪:

Exception while connecting
   at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   at Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.ConnectorPool.AllocateLong(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<g__OpenLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Npgsql.NpgsqlConnection.Open()

Dockerfile(也许它很重要,因为我用custom我的app.yaml runtime?):

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 8080
EXPOSE 443
ENV ASPNETCORE_URLS=http://*:8080

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
COPY . /src
WORKDIR /src
RUN dotnet restore --packages /packages
RUN dotnet publish -c Release -o /published

FROM base AS final
COPY --from=build /published /app/
WORKDIR /app
ENTRYPOINT [ "dotnet", "myapp.dll" ]

部署脚本:

gcloud beta app deploy --project <project-id>

编辑:

从云控制台检查sql实例的PostgreSQL错误,我在最终Exception while connecting错误之前看到以下错误:

System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (99): Cannot assign requested address /cloudsql/<my connection instance id>/.s.PGSQL.5432
库尔提夫

您是否在此处查看了Cloud SQL的示例应用程序

更新:

由于您提供了两个不同的选项,因此很难确定到底出了什么问题,也不清楚哪种组合会提供哪些错误。但是,实际上有2种不同的连接方式,并且您的代码必须与您的配置相匹配,这一点很重要app.yaml

通过TCP端口连接

要通过TCP端口进行连接,请在您的计算机中使用以下命令app.yaml

beta_settings:
  cloud_sql_instances: "<PROJECT_ID>:<REGION_ID>:<INSTANCE_ID>=tcp:5432"

然后对您的连接字符串使用以下格式:

"Host=172.17.0.1;Uid=<DB_USER>;Pwd=<DB_PASS>;Database=<DB_NAME>"

请注意,这Host=172.17.0.1;是部署到Flex时的IP,但是127.0.0.1如果在本地使用Cloud SQL代理则将是IP

通过Unix域套接字连接

要通过Unix套接字进行连接,请在您的中使用以下命令app.yaml

beta_settings:
  cloud_sql_instances: "<PROJECT_ID>:<REGION_ID>:<INSTANCE_ID>"

然后对您的连接字符串使用以下格式:

"Server=/cloudsql/<PROJECT_ID>:<REGION_ID>:<INSTANCE_ID>/.s.PGSQL.5432;Uid=<DB_USER>;Pwd=<DB_PASS>;Database=<DB_NAME>"

注意:您的驱动程序可能会自动添加/.s.PGSQL.5432-有些添加,有些没有。

故障排除

如果您确定您的app.yaml代码正确匹配,但仍收到超时消息,那么下一步将是检查您的应用程序日志。您可以使用Stackdriver和filter byappengine.googleapis.com/cloud_sql_proxy来仅查看实例的日志。

一些常见的错误是:

  1. 实例没有公共IP(私有IP连接步骤不同)
  2. App Engine所在的项目未启用Cloud SQL Admin API
  3. 对于数据库所在的项目,service-PROJECT_NUMBER@gae-api-prod.google.com.iam.gserviceaccount.com使用的服务帐户(默认为)不具有Cloud SQL ClientIAM角色或更高版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章