Go语言 在Cloud Run中找不到默认凭据

gijlo24d  于 2023-04-09  发布在  Go
关注(0)|答案(1)|浏览(127)

我正在写一个程序,用Postgres方言与Cloud Spanner对话。我的应用程序是一个Gin服务器,我使用pgadapter连接,如this doc中所述。
我的应用程序在本地运行正常,但是当我将其部署到cloud run时,我会得到以下log.

错误主要来自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,因此它能够获取凭据。然而,这在云运行中不起作用。
如何让它在Cloud Run中运行?
附加信息:按照本例here

gjmwrych

gjmwrych1#

您似乎试图在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,请参阅[本示例]。这还需要您将Java JRE添加到Docker镜像中。
1.让你的Docker构建扩展PGAdapter基础Docker镜像。这将自动包含PGAdapter所需的所有依赖项。你将不得不覆盖基础镜像的ENTRYPOINT
请参阅PGAdapter Cloud Run Sample for Go以获取后一个选项的扩展(可运行)示例。

相关问题