我们在 mkdev 拥有的应用程序之一是 Claimora 我们用它来跟踪时间。当我们想要部署Claimora时,我们有两个环境,暂存和生产,在每个环境中,我们都有一个Postgres数据库启动并运行。当我们不在环境中工作时,我们希望省钱,为此,我们将在工作时间结束时停止数据库。让我们看看我们能做什么。
为了能够在Google Cloud中调度某些内容,我们首先需要一个调度程序。此调度程序作业将向发布/订阅主题发送一条消息,告知需要执行的操作。在我们的例子中,我们要做的是停止或启动一个特定的数据库。此发布/订阅主题将调用云函数,并且停止或启动数据库的将是此云函数。
让我们从最后开始,从我们要停止或启动的数据库开始。正如您在屏幕上看到的那样,我们在Claimora中有一个被调用的数据库。我们已经启动并运行了这个数据库超过30天,大多数时候这个Postgres甚至不是真正需要的。claimora-database-staging
因此,应用我们的练习并遵循我们刚刚展示的场景,我们需要一个云函数。我们需要创建一个将调用的云函数。下一步是选择 pub/sub 作为触发器,并创建一个我们将调用的主题。sql-up-down
Europe-west1
database-up-down
如果我们单击下一步并选择使用 1.13 作为运行时,我们可以粘贴代码:
package p
import (
"context"
"encoding/json"
"log"
"golang.org/x/oauth2/google"
sqladmin "google.golang.org/api/sqladmin/v1beta4"
)
type PubSubMessage struct {
Data []byte `json:"data"`
}
type MessagePayload struct {
Instance string
Project string
Action string
}
func ProcessPubSub(ctx context.Context, m PubSubMessage) error {
var psData MessagePayload
err := json.Unmarshal(m.Data, &psData)
if err != nil {
log.Println(err)
}
log.Printf("Request received for Cloud SQL instance %s action: %s, %s", psData.Action, psData.Instance, psData.Project)
hc, err := google.DefaultClient(ctx, sqladmin.CloudPlatformScope)
if err != nil {
return err
}
service, err := sqladmin.New(hc)
if err != nil {
return err
}
action := "UNDEFINED"
switch psData.Action {
case "start":
action = "ALWAYS"
case "stop":
action = "NEVER"
default:
log.Fatal("No valid action provided.")
}
// See more examples at:
// https://cloud.google.com/sql/docs/sql...
rb := &sqladmin.DatabaseInstance{
Settings: &sqladmin.Settings{
ActivationPolicy: action,
},
}
resp, err := service.Instances.Patch(psData.Project, psData.Instance, rb).Context(ctx).Do()
if err != nil {
log.Fatal(err)
}
log.Printf("%#v/n", resp)
return nil
}
下一步是授予云函数权限,以便能够停止和启动数据库。为此,我们转到IAM,选择服务帐户并授予作为云SQL管理员的权限。claimora-staging@appspot.gserviceaccount.com
现在我们只需要测试我们的主题是否调用 step 函数并停止或启动数据库。为此,我们需要转到我们的发布/订阅主题,单击消息,然后发布一条消息,例如您可以在屏幕上看到的消息。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/292953.html