英文:
Cannot find default credentials in Cloud Run
问题
我正在编写一个使用Postgres方言与Cloud Spanner通信的程序。我的应用程序是一个gin服务器,我正在使用pgadapter进行连接,如此文档中所述。
我的应用程序在本地运行正常。但是当我部署到Cloud Run时,我得到以下日志。
错误基本上来自于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中,这种方式不起作用。
如何使其在Cloud Run中运行?
附加信息:按照这里的示例进行操作。
英文:
I am writing a program that speaks with Cloud Spanner in Postgres Dialect. My application is a gin server and I am using pgadapter to connect as mentioned in this doc.
My application runs fine locally. But when I deploy it to cloud run, I get the following log.
The error basically comes from the StartPGAdapterWithCredentials
function.
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
}
On my local system, GOOGLE_APPLICATION_CREDENTIALS
is set and hence it is able to get the credentials. However, this is not working in cloud run.
How do I get it to run in cloud run?
Additional Info : followed the example present here.
答案1
得分: 2
看起来你正在尝试在Cloud Run上的嵌入式容器中启动PGAdapter,并将服务账号凭据从环境中复制到PGAdapter的嵌入式容器中。问题在于,Cloud Run不提供对底层服务账号文件的访问权限。相反,你应该让Google Cloud库获取环境的默认凭据。
你的示例中的困难部分在于你正在嵌入式容器中启动PGAdapter,这意味着该环境中没有默认凭据。在Cloud Run上运行PGAdapter的推荐方式是将其包含在主容器中。这样,PGAdapter就可以获取Cloud Run提供的默认凭据。这意味着在启动PGAdapter时,你不应该指定-c /path/to/credentials.json
参数。
你可以通过以下两种方式将PGAdapter包含在主容器中:
- 将Java的
.jar
文件构建添加到你的Docker镜像中,并在容器中启动PGAdapter。参考这个示例了解如何直接从.jar
文件启动PGAdapter。这还需要在Docker镜像中添加Java JRE。 - 让你的Docker构建扩展PGAdapter基础Docker镜像。这将自动包含PGAdapter所需的所有依赖项。你需要覆盖基础镜像的
ENTRYPOINT
。
参考PGAdapter Cloud Run Sample for Go了解更详细的示例(可运行的)以了解后一种选项。
英文:
It seems that you are trying to start PGAdapter in an embedded container on Cloud Run, and then copy the service account credentials from your environment to the PGAdapter embedded container. The problem is that Cloud Run does not provide access to the underlying service account file. Instead, you should just let the Google Cloud libraries get the default credentials of the environment.
The difficult part in your example is that you are starting PGAdapter in an embedded container, which means that there are no default credentials in that environment. The recommended way to run PGAdapter on Cloud Run is to include it in your main container. That will make it possible for PGAdapter to just fetch the default credentials that are provided by Cloud Run. That means that you should not specify the -c /path/to/credentials.json
argument when starting PGAdapter.
There are (at least) two ways that you can include PGAdapter in your main container:
- Add the Java
.jar
file build to your Docker image and start PGAdapter in your container. See [this example] for how to start PGAdapter directly from.jar
files. This also requires you to add a Java JRE to your Docker image. - Let your Docker build extend the PGAdapter base Docker image. This will automatically include all dependencies that are needed for PGAdapter. You will have to override the
ENTRYPOINT
of the base image.
See PGAdapter Cloud Run Sample for Go for an extensive (runnable) sample for the latter option.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论