无法在Cloud Run中找到默认凭据。

4

我正在编写一个使用Postgres方言与Cloud Spanner进行通信的程序。我的应用程序是一个gin服务器,如this doc中所述,我正在使用pgadapter进行连接。

我的应用程序在本地运行正常。但是当我将其部署到云运行时,会出现以下日志。 enter image description here

错误基本上来自StartPGAdapterWithCredentials函数。

func StartPGAdapter(ctx context.Context, project, instance string) (port int, cleanup func(), err error) {
    credentials, err := google.FindDefaultCredentials(ctx)
    fmt.Println("credentials " + (credentials.ProjectID) + "json " + utils.ToString(credentials.JSON) + "ts " + utils.ToString(credentials.TokenSource))
    if err != nil {
        return 0, func() {}, err
    }
    return StartPGAdapterWithCredentials(ctx, project, instance, credentials)
}
func StartPGAdapterWithCredentials(ctx context.Context, project, instance string, credentials *google.Credentials) (port int, cleanup func(), err error) {
    if credentials == nil {
        return 0, func() {}, fmt.Errorf("credentials cannot be nil")
    }
    if credentials.JSON == nil || len(credentials.JSON) == 0 {
        return 0, func() {}, fmt.Errorf("only JSON based credentials are supported")
    }
    credentialsFile, err := os.CreateTemp(os.TempDir(), "pgadapter-credentials")
    if err != nil {
        return 0, func() {}, err
    }

在我的本地系统上,GOOGLE_APPLICATION_CREDENTIALS已经设置,因此它能够获取凭据。然而,在云运行中这并不起作用。
我该如何让它在云运行中运行?
附加信息:遵循此处的示例here

请确保 GOOGLE_APPLICATION_CREDENTIALS 指向包含服务帐号凭据的有效 JSON 文件。另请参阅 https://github.com/GoogleCloudPlatform/golang-samples/blob/b4e5aa87903747985c8c096f29598d0de5b6cbbc/monitoring/README.md#using-a-service-account - Matteo
1
嗨@Matteo,感谢您的评论。但是如问题中所述,该代码在本地设置上运行良好,但在云端运行时失败。我在那里没有设置任何GOOGLE_APPLICATION_CREDENTIALS。我猜它应该从well-known文件或元数据服务器中获取... - positron
你如何启动PGAdapter?在你的容器中吗?你能展示一下这部分吗? - guillaume blaquiere
Cloud Run元数据服务器不返回JSON凭据,而是返回OAuth令牌。我不熟悉那个库,但代码需要JSON凭据(服务帐户JSON文件)。 - John Hanley
Cloud Run 不提供访问底层服务账户的 JSON 凭据。Cloud Run 提供 OAuth 和 OIDC 令牌。您正在使用的代码需要 JSON 凭据。 - John Hanley
显示剩余2条评论
1个回答

2

看起来您正在尝试在Cloud Run上的嵌入式容器中启动PGAdapter,然后从您的环境将服务帐户凭据复制到PGAdapter嵌入式容器中。问题是,Cloud Run不提供对底层服务帐户文件的访问权限。相反,您应该让Google Cloud库获取环境的默认凭据。

您的示例中困难的部分在于您正在嵌入式容器中启动PGAdapter,这意味着该环境中没有默认凭据。在Cloud Run上运行PGAdapter的推荐方法是将其包含在主容器中。这样可以使PGAdapter能够获取由Cloud Run提供的默认凭据。这意味着在启动PGAdapter时不应指定-c /path/to/credentials.json参数。

有(至少)两种方式可以将PGAdapter包含在主容器中:

  1. 将Java .jar文件构建添加到您的Docker镜像中,并在容器中启动PGAdapter。请参见[此示例],了解如何直接从.jar文件启动PGAdapter。这还需要您向Docker镜像添加Java JRE。
  2. 让您的Docker构建扩展PGAdapter基础Docker镜像。这将自动包含PGAdapter所需的所有依赖项。您将需要覆盖基本镜像的ENTRYPOINT

有关后一选项的广泛(可运行)示例,请参见PGAdapter Cloud Run Sample for Go


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接