Skip to content

Commit 1e97e7d

Browse files
author
cezarrom
committed
init commit
0 parents  commit 1e97e7d

File tree

4 files changed

+214
-0
lines changed

4 files changed

+214
-0
lines changed

backup-trigger/index.js

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
'use strict';
2+
3+
const {google} = require('googleapis');
4+
let sqlAdmin = google.sqladmin('v1beta4');
5+
const {auth} = require("google-auth-library");
6+
7+
8+
exports.backup = (data, context) => {
9+
10+
async function deleteOldBackupsAndCreateNewOne() {
11+
12+
const authRes = await auth.getApplicationDefault();
13+
let authClient = authRes.credential;
14+
15+
const pubSubMessage = data;
16+
const messageContent = Buffer.from(pubSubMessage.data, 'base64').toString()
17+
const thirtyFiveDaysOfBackup = 35;
18+
19+
console.log("Message content:" + messageContent);
20+
21+
let project = process.env.PROJECT_ID
22+
let instance = process.env.INSTANCE_NAME
23+
24+
console.log("Running for project:" + project + " and instance: " + instance);
25+
26+
let request = {
27+
project: project,
28+
instance: instance,
29+
auth: authClient
30+
};
31+
32+
sqlAdmin.backupRuns.list(request, function(err, response) {
33+
34+
if (err) {
35+
console.error("Error at list:" + err);
36+
return;
37+
}
38+
39+
let referenceDate = new Date();
40+
referenceDate.setDate(referenceDate.getDate() - thirtyFiveDaysOfBackup);
41+
42+
let toBeDeleted = response.data.items.filter(function (el) {
43+
44+
return el.type === "ON_DEMAND" && new Date(el.endTime) < new Date(referenceDate)
45+
});
46+
47+
toBeDeleted.forEach(element => {
48+
49+
console.log("To be deleted: " + element);
50+
51+
request.id = element.id
52+
53+
sqlAdmin.backupRuns.delete(request, function(err, response) {
54+
if (err) {
55+
console.error("Error at delete:" + err);
56+
return;
57+
}
58+
console.log("Delete response: " + JSON.stringify(response, null, 2));
59+
});
60+
});
61+
});
62+
63+
64+
sqlAdmin.backupRuns.insert(request, function(err, response) {
65+
if (err) {
66+
console.error("Error at insert: " + err);
67+
return;
68+
}
69+
70+
console.log("Trigger manual backup response: " + JSON.stringify(response.data, null, 2));
71+
72+
});
73+
}
74+
deleteOldBackupsAndCreateNewOne();
75+
};
76+
77+
78+
79+

backup-trigger/package.json

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"name": "backup",
3+
"version": "0.0.1",
4+
"private": true,
5+
"engines": {
6+
"node": ">=8.0.0"
7+
},
8+
"dependencies": {
9+
"@google-cloud/debug-agent": "^4.0.0",
10+
"googleapis": "^39.2.0",
11+
"pug": "^2.0.3"
12+
},
13+
"devDependencies": {
14+
"@google-cloud/functions-framework": "^1.1.1",
15+
"@google-cloud/nodejs-repo-tools": "^3.3.0",
16+
"child-process-promise": "^2.2.1",
17+
"express": "^4.16.3",
18+
"mocha": "^7.0.0",
19+
"moment": "^2.24.0",
20+
"promise-retry": "^1.1.1",
21+
"proxyquire": "^2.1.0",
22+
"request": "^2.88.0",
23+
"requestretry": "^4.0.0",
24+
"sinon": "^9.0.0",
25+
"uuid": "^7.0.0",
26+
"yargs": "^15.0.0"
27+
},
28+
"cloud-repo-tools": {
29+
"requiresKeyFile": true,
30+
"requiresProjectId": true,
31+
"requiredEnvVars": [
32+
"BASE_URL",
33+
"GCLOUD_PROJECT",
34+
"GCF_REGION",
35+
"FUNCTIONS_TOPIC",
36+
"FUNCTIONS_BUCKET",
37+
"FUNCTIONS_CMD"
38+
]
39+
}
40+
}

main.tf

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
data "archive_file" "backup_trigger_zip" {
2+
type = "zip"
3+
source_dir = "${path.module}/backup-trigger"
4+
output_path = "${path.module}/backup_trigger.zip"
5+
}
6+
7+
resource "google_storage_bucket" "cloud_function_bucket" {
8+
name = "cloud-function-bucket"
9+
project = var.project_id
10+
location = var.gcp_region
11+
}
12+
13+
resource "google_storage_bucket_object" "backup_trigger_zip" {
14+
name = "backup_trigger.zip"
15+
bucket = google_storage_bucket.cloud_function_bucket.name
16+
source = "${path.module}/backup_trigger.zip"
17+
}
18+
19+
resource "google_pubsub_topic" "function_pub_sub" {
20+
project = var.project_id
21+
name = "my-database-backup-topic"
22+
}
23+
24+
resource "google_project_iam_custom_role" "custom_role" {
25+
project = var.project_id
26+
role_id = "sqlBackupCreator"
27+
title = "Cloud SQL Backup Creator"
28+
description = "Roles for cloud functions to trigger manual backups"
29+
permissions = ["cloudsql.backupRuns.create", "cloudsql.backupRuns.get", "cloudsql.backupRuns.list", "cloudsql.backupRuns.delete"]
30+
}
31+
32+
resource "google_service_account" "backup_trigger" {
33+
project = var.project_id
34+
account_id = "backup-trigger-cloud-function-sa"
35+
display_name = "Backup Trigger cloud function service account"
36+
}
37+
38+
resource "google_project_iam_member" "backup_trigger" {
39+
provider = google-beta
40+
project = var.project_id
41+
member = "serviceAccount:${google_service_account.backup_trigger.email}"
42+
role = "sqlBackupCreator"
43+
}
44+
45+
resource "google_cloudfunctions_function" "backup_trigger_function" {
46+
name = "backup-trigger-function"
47+
region = var.gcp_region
48+
available_memory_mb = 256
49+
source_archive_bucket = google_storage_bucket.cloud_function_bucket.name
50+
source_archive_object = "backup_trigger.zip"
51+
entry_point = "backup"
52+
runtime = "nodejs8"
53+
project = var.project_id
54+
service_account_email = google_service_account.backup_trigger.email
55+
56+
environment_variables = {
57+
PROJECT_ID = var.project_id
58+
INSTANCE_NAME = var.instance_name
59+
}
60+
61+
event_trigger {
62+
event_type = "google.pubsub.topic.publish"
63+
resource = "projects/${var.project_id}/topics/${google_pubsub_topic.function_pub_sub.name}"
64+
failure_policy {
65+
retry = false
66+
}
67+
}
68+
}
69+
70+
resource "google_cloud_scheduler_job" "cloud_function_trigger" {
71+
name = "my-cloud-function-trigger"
72+
schedule = "0 15 * * *"
73+
project = var.project_id
74+
region = var.gcp_region
75+
76+
pubsub_target {
77+
topic_name = "projects/${var.project_id}/topics/${google_pubsub_topic.function_pub_sub.name}"
78+
data = base64encode("{}")
79+
}
80+
81+
}
82+
83+

variables.tf

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
variable "project_id" {
2+
type = string
3+
description = "Project ID"
4+
}
5+
6+
variable "gcp_region" {
7+
type = string
8+
}
9+
10+
variable "instance_name" {
11+
type = string
12+
}

0 commit comments

Comments
 (0)