如何修复:Google Cloud SQL导出的403错误



我正在尝试将我们的一个云SQL SQL Postgres实例的完整SQL转储到Google Cloud Storage中,以便我们可以使用google-api-go-client(https://github.com(更频繁地备份/googleapis/google-api-go-lient(

不管我配置什么,我一直在遇到此错误:panic: googleapi: Error 403: The client is not authorized to make this request., notAuthorized来自sqladminService.Instances.Export

我的服务帐户配置了以下权限:

  • 云SQL Admin
  • 存储管理
  • 计算存储管理员(其他东西(

我正在从存储管理角色的继承权限导出的存储桶。

代码: ./k8s/sql.go

package gcp
import (
    "fmt"
    "time"
    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    sqladmin "google.golang.org/api/sqladmin/v1beta4"
)
type SQLService interface {
    Test(project string) error
}
type sqlService struct {
    context         context.Context
    sqladminService *sqladmin.Service
}
func NewSQLService(serviceAccountJSON []byte) (SQLService, error) {
    context := context.Background()
    jwtCfg, err := google.JWTConfigFromJSON(serviceAccountJSON, sqladmin.SqlserviceAdminScope, sqladmin.CloudPlatformScope)
    if err != nil {
        return sqlService{}, err
    }
    httpClient := jwtCfg.Client(context)
    sqladminService, err := sqladmin.New(httpClient)
    if err != nil {
        return sqlService{}, err
    }
    return sqlService{
        context:         context,
        sqladminService: sqladminService,
    }, nil
}
func (s sqlService) Test(project string) error {
    instance := "REGION:INSTANCE_NAME
    storageURI := fmt.Sprintf("gs://BUCKET/FILE-%s.sql.gz", time.Now().Format(time.RFC3339))
    databases := []string{"DATABASE"}
    req := &sqladmin.InstancesExportRequest{
        ExportContext: &sqladmin.ExportContext{
            Uri:       storageURI,
            Databases: databases,
        },
    }
    _resp, err := s.sqladminService.Instances.Export(project, instance, req).Context(s.context).Do()
    if err != nil {
        return err
    }
    return nil
}

测试代码:

func Test(cfg config.Config) {
    sql, err := gcp.NewSQLService(cfg.GCPServiceAccountEncodedCreds)
    if err != nil {
        panic(err)
    }
    err = sql.Test(cfg.Project)
    if err != nil {
        panic(err)
    }
}

任何帮助都将不胜感激

instancesexport的文档表明所需的参数是" projectID"one_answers" instanceID"。您已将instance声明为"REGION:INSTANCE_NAME"-但您真正想要的是"INSTANCE_NAME"

您无权查看该实例(因为在这种情况下,它不存在(。

相关内容

  • 没有找到相关文章

最新更新