forked from nevilm-lt/cloudsploit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdbMultiAz.js
More file actions
67 lines (54 loc) · 2.76 KB
/
Copy pathdbMultiAz.js
File metadata and controls
67 lines (54 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var async = require('async');
var helpers = require('../../../helpers/google');
module.exports = {
title: 'DB Multiple AZ',
category: 'SQL',
domain: 'Databases',
description: 'Ensures that SQL instances have a failover replica to be cross-AZ for high availability',
more_info: 'Creating SQL instances in with a single AZ creates a single point of failure for all systems relying on that database. All SQL instances should be created in multiple AZs to ensure proper failover.',
link: 'https://cloud.google.com/sql/docs/mysql/instance-settings',
recommended_action: 'Ensure that all database instances have a DB replica enabled in a secondary AZ.',
apis: ['instances:sql:list', 'projects:get'],
run: function(cache, settings, callback) {
var results = [];
var source = {};
var regions = helpers.regions();
let projects = helpers.addSource(cache, source,
['projects','get', 'global']);
if (!projects || projects.err || !projects.data) {
helpers.addResult(results, 3,
'Unable to query for projects: ' + helpers.addError(projects), 'global', null, null, projects.err);
return callback(null, results, source);
}
let project = projects.data[0].name;
async.each(regions.instances.sql, function(region, rcb){
let sqlInstances = helpers.addSource(
cache, source, ['instances', 'sql', 'list', region]);
if (!sqlInstances) return rcb();
if (sqlInstances.err || !sqlInstances.data) {
helpers.addResult(results, 3, 'Unable to query SQL instances: ' + helpers.addError(sqlInstances), region, null, null, sqlInstances.err);
return rcb();
}
if (!sqlInstances.data.length) {
helpers.addResult(results, 0, 'No SQL instances found', region);
return rcb();
}
sqlInstances.data.forEach(sqlInstance => {
if (sqlInstance.instanceType && sqlInstance.instanceType.toUpperCase() === 'READ_REPLICA_INSTANCE') return;
let resource = helpers.createResourceName('instances', sqlInstance.name, project);
if (sqlInstance.failoverReplica &&
sqlInstance.failoverReplica.available) {
helpers.addResult(results, 0,
'SQL instance has multi-AZ enabled', region, resource);
} else {
helpers.addResult(results, 2,
'SQL instance does not have multi-AZ enabled', region, resource);
}
});
rcb();
}, function(){
// Global checking goes here
callback(null, results, source);
});
}
};