使用Cloud Functions的Go语言实现Firestore的定期备份

这是关于使用Cloud Functions Go的第二个版本。(上一版本请见此处)

总结:

    • GoでFirestoreをバックアップするにはgoogle.golang.org/api/firestore/v1を使う必要がある

 

    Cloud FunctionsでもApplication Default Credentialsが使えるので簡単にAPIを呼ぶことができる

前言

在去年(2018年)8月的一篇公告中,Firestore实现了导入/导出功能。
Firebase博客:Cloud Firestore的更多改进!

您可以使用gcloud命令或以下的REST API来进行导出操作:
Method: projects.databases.exportDocuments | Cloud Firestore | Google Cloud。

通过Cloud Scheduler定期备份Firestore.

请参阅Ginco的博客以了解更详细的介绍。
Ginco技术博客介绍了如何使用Cloud Scheduler定期备份Firestore。

通过Cloud Scheduler发布Pub/Sub主题,并在订阅的Cloud Functions内调用上述的REST API。
导出的Cloud Functions示例大多是Node.js,所以我尝试创建了一个Go的示例。
代码已经上传到GitHub上的go-cloud-functions-examples/backup-firestore分支中。

云函数

因为这是一个REST API,所以可以简单地使用http.Client等来实现,但是这次我选择使用Google的Go库。
支持Export API的库是google.golang.org/api/firestore/v1。

这个软件包已不建议使用。请使用package cloud.google.com/go/firestore代替。

目前在cloud.google.com/go/firestore中并没有可用于导出的方法,因此我们将使用google.golang.org/api/firestore/v1。

package function

import (
    "context"
    "fmt"
    "os"

    "github.com/pkg/errors"
    "google.golang.org/api/firestore/v1"
    "google.golang.org/api/option"
)

var projectID string

// PubSubMessage is a body data from Pub/Sub payload
type PubSubMessage struct {
    Data string `json:"data"`
}

func init() {
    projectID = os.Getenv("GCP_PROJECT")
}

// BackupFirestore is triggered by Cloud Functions
func BackupFirestore(ctx context.Context, m PubSubMessage) error {
    svc, err := firestore.NewService(ctx, option.WithScopes(firestore.DatastoreScope, firestore.CloudPlatformScope))
    if err != nil {
        return errors.Wrap(err, "Failed to create Firestore service")
    }

    req := &firestore.GoogleFirestoreAdminV1ExportDocumentsRequest{
        OutputUriPrefix: fmt.Sprintf("gs://%s-backup-firestore", projectID),
    }
    _, err = firestore.NewProjectsDatabasesService(svc).ExportDocuments(
        fmt.Sprintf("projects/%s/databases/(default)", projectID), req,
    ).Context(ctx).Do()
    if err != nil {
        return errors.Wrap(err, "Failed to export Firestore")
    }

    fmt.Println("Backup Successfully")

    return nil
}

使用OAuth客户端时,可以使用google.DefaultClient。通过使用它,您可以通过Cloud Functions上运行的Service Account的应用程序默认凭据进行身份验证,并且可以省略获取访问令牌的步骤。(方便!)
从google.golang.org/api v0.3.0版本开始,不再需要google.DefaultClient。(更方便!)
请参阅以下文档以获取更详细信息。
https://godoc.org/google.golang.org/api/firestore/v1#hdr-Creating_a_client

如果未特别指定,Cloud Functions 将使用 GAE 的默认 Service Account。因此,如果没有进行特别设置,将授予此服务账户以下角色权限。

    • Cloud Datastore Import Export Admin

 

    Storage Admin

请将 OutputUriPrefix 更改为所需的 Cloud Storage 的保存地址。
您可以根据需要自行修改。

不用担心认证问题,可以非常简单地编写!

广告
将在 10 秒后关闭
bannerAds