使用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 的保存地址。
您可以根据需要自行修改。
不用担心认证问题,可以非常简单地编写!