Skip to content

Commit 76c4438

Browse files
author
Marco Franceschi
committed
feat: Added rdsEventSubscription
1 parent 88d5c14 commit 76c4438

9 files changed

Lines changed: 190 additions & 0 deletions

File tree

src/enums/serviceMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import NetworkAcl from '../services/nacl'
5252
import NetworkInterface from '../services/networkInterface'
5353
import RDSCluster from '../services/rdsCluster'
5454
import RDSDbInstance from '../services/rdsDbInstance'
55+
import RDSEventSubscription from '../services/rdsEventSubscription'
5556
import RedshiftCluster from '../services/redshift'
5657
import Route53HostedZone from '../services/route53HostedZone'
5758
import Route53Record from '../services/route53Record'
@@ -185,6 +186,7 @@ export default {
185186
[services.rdsCluster]: RDSCluster,
186187
[services.rdsClusterSnapshot]: RdsClusterSnapshot,
187188
[services.rdsDbInstance]: RDSDbInstance,
189+
[services.rdsEventSubscription]: RDSEventSubscription,
188190
[services.redshiftCluster]: RedshiftCluster,
189191
[services.route53HostedZone]: Route53HostedZone,
190192
[services.route53Record]: Route53Record,

src/enums/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export default {
8080
rdsCluster: 'rdsCluster',
8181
rdsClusterSnapshot: 'rdsClusterSnapshot',
8282
rdsDbInstance: 'rdsDbInstance',
83+
rdsEventSubscription: 'rdsEventSubscription',
8384
redshiftCluster: 'redshiftCluster',
8485
route53HostedZone: 'route53HostedZone',
8586
route53Record: 'route53Record',

src/properties/logger.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export default {
264264
*/
265265
fetchingEbsSnapshotData:
266266
'Fetching EBS Snapshot data for this AWS account via the AWS SDK...',
267+
fetchingEbsSnapshotData: 'Fetching EBS Snapshot data for this AWS account via the AWS SDK...',
267268
doneFetchingEbsSnapshotData: '✅ Done fetching EBS Snapshot Data ✅',
268269
fetchedEbsSnapshots: (num: number): string => `Fetched ${num} EBS Snapshots`,
269270
lookingForEbsSnapshot: 'Looking for EBS Snapshots...',
@@ -293,6 +294,8 @@ export default {
293294
fetchedRdsClusters: (num: number): string => `Fetched ${num} RDS Clusters`,
294295
fetchedRdsInstances: (num: number): string =>
295296
`Fetched ${num} RDS DB Instances`,
297+
fetchedRdsEventSubscriptions: (num: number): string =>
298+
`Fetched ${num} RDS DB Event Subscriptions`,
296299
noClusterFound: '❎ DB Instance is not part of a cluster ❎ ',
297300
foundCluster: 'Found the cluster the instance belongs to',
298301
addingRdsInstances: (num: number): string =>
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import CloudGraph from '@cloudgraph/sdk'
2+
import RDS, {
3+
EventSubscription,
4+
EventSubscriptionsMessage,
5+
DescribeEventSubscriptionsMessage
6+
} from 'aws-sdk/clients/rds'
7+
import { AWSError } from 'aws-sdk/lib/error'
8+
import groupBy from 'lodash/groupBy'
9+
import isEmpty from 'lodash/isEmpty'
10+
import { Config } from 'aws-sdk/lib/config'
11+
import { initTestEndpoint } from '../../utils'
12+
import AwsErrorLog from '../../utils/errorLog'
13+
import awsLoggerText from '../../properties/logger'
14+
15+
16+
const { logger } = CloudGraph
17+
const lt = { ...awsLoggerText }
18+
const serviceName = 'RDS Event Subscriptions'
19+
const errorLog = new AwsErrorLog(serviceName)
20+
const endpoint = initTestEndpoint(serviceName)
21+
22+
const listDBEventSubscriptionsForRegion = async (rds: RDS): Promise<EventSubscription[]> =>
23+
new Promise<EventSubscription[]>(resolve => {
24+
const eventSubscriptions: EventSubscription[] = []
25+
const descDBInstancesOpts: DescribeEventSubscriptionsMessage = {}
26+
const listEventSubscriptions = (token?: string): void => {
27+
if (token) {
28+
descDBInstancesOpts.Marker = token
29+
}
30+
try {
31+
rds.describeEventSubscriptions(
32+
descDBInstancesOpts,
33+
(err: AWSError, data: EventSubscriptionsMessage) => {
34+
const { Marker, EventSubscriptionsList = [] } = data || {}
35+
if (err) {
36+
errorLog.generateAwsErrorLog({
37+
functionName: 'rds:describeEventSubscriptions',
38+
err,
39+
})
40+
}
41+
42+
eventSubscriptions.push(...EventSubscriptionsList)
43+
44+
if (Marker) {
45+
listEventSubscriptions(Marker)
46+
} else {
47+
resolve(eventSubscriptions)
48+
}
49+
}
50+
)
51+
} catch (error) {
52+
resolve([])
53+
}
54+
}
55+
listEventSubscriptions()
56+
})
57+
58+
export interface RawAwsRdsEventSubscription extends EventSubscription {
59+
region: string
60+
}
61+
62+
export default async ({
63+
regions,
64+
config,
65+
}: {
66+
regions: string
67+
config: Config
68+
}): Promise<{ [property: string]: RawAwsRdsEventSubscription[] }> =>
69+
new Promise(async resolve => {
70+
const rdsData: RawAwsRdsEventSubscription[] = []
71+
const regionPromises = []
72+
73+
// Get all the instances for the region
74+
regions.split(',').map(region => {
75+
const regionPromise = new Promise<void>(async resolveRegion => {
76+
const rds = new RDS({ ...config, region, endpoint })
77+
const subscriptions = await listDBEventSubscriptionsForRegion(rds)
78+
79+
if (!isEmpty(subscriptions)) {
80+
rdsData.push(
81+
...subscriptions.map(subscription => ({
82+
...subscription,
83+
region,
84+
}))
85+
)
86+
}
87+
resolveRegion()
88+
})
89+
regionPromises.push(regionPromise)
90+
})
91+
92+
await Promise.all(regionPromises)
93+
logger.debug(lt.fetchedRdsEventSubscriptions(rdsData.length))
94+
95+
errorLog.reset()
96+
resolve(groupBy(rdsData, 'region'))
97+
})
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { AwsRdsEventSubscription } from '../../types/generated'
2+
import { RawAwsRdsEventSubscription } from './data'
3+
4+
/**
5+
* RdsEventSubscription
6+
*/
7+
8+
export default ({
9+
account,
10+
service: rawData,
11+
region,
12+
}: {
13+
account,
14+
service: RawAwsRdsEventSubscription
15+
region,
16+
}): AwsRdsEventSubscription => {
17+
const {
18+
EventSubscriptionArn: arn,
19+
CustomerAwsId: customerAwsId,
20+
CustSubscriptionId: custSubscriptionId,
21+
SnsTopicArn: snsTopicArn,
22+
Status: status,
23+
SubscriptionCreationTime: subscriptionCreationTime,
24+
SourceType: sourceType,
25+
SourceIdsList: sourceIdsList = [],
26+
EventCategoriesList: eventCategoriesList = [],
27+
Enabled: enabled
28+
} = rawData
29+
30+
return {
31+
id: arn,
32+
accountId: account,
33+
arn,
34+
region,
35+
customerAwsId,
36+
custSubscriptionId,
37+
snsTopicArn,
38+
status,
39+
subscriptionCreationTime,
40+
sourceType,
41+
sourceIdsList,
42+
eventCategoriesList,
43+
enabled
44+
}
45+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Service } from '@cloudgraph/sdk'
2+
import BaseService from '../base'
3+
import format from './format'
4+
import getData from './data'
5+
import mutation from './mutation'
6+
7+
export default class RdsEventSubscription extends BaseService implements Service {
8+
format = format.bind(this)
9+
10+
getData = getData.bind(this)
11+
12+
mutation = mutation
13+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default `mutation($input: [AddawsRdsEventSubscriptionInput!]!) {
2+
addawsRdsEventSubscription(input: $input, upsert: true) {
3+
numUids
4+
}
5+
}`;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
type awsRdsEventSubscription implements awsBaseService @key(fields: "arn") {
2+
customerAwsId: String @search(by: [hash, regexp])
3+
custSubscriptionId: String @search(by: [hash, regexp])
4+
snsTopicArn: String @search(by: [hash, regexp])
5+
status: String @search(by: [hash, regexp])
6+
subscriptionCreationTime: String @search(by: [hash, regexp])
7+
sourceType: String @search(by: [hash, regexp])
8+
sourceIdsList: [String] @search(by: [hash])
9+
eventCategoriesList: [String] @search(by: [hash])
10+
enabled: Boolean @search
11+
}
12+

src/types/generated.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4067,6 +4067,18 @@ export type AwsRdsDbInstanceParameterGroup = {
40674067
status?: Maybe<Scalars['String']>;
40684068
};
40694069

4070+
export type AwsRdsEventSubscription = AwsBaseService & {
4071+
custSubscriptionId?: Maybe<Scalars['String']>;
4072+
customerAwsId?: Maybe<Scalars['String']>;
4073+
enabled?: Maybe<Scalars['Boolean']>;
4074+
eventCategoriesList?: Maybe<Array<Maybe<Scalars['String']>>>;
4075+
snsTopicArn?: Maybe<Scalars['String']>;
4076+
sourceIdsList?: Maybe<Array<Maybe<Scalars['String']>>>;
4077+
sourceType?: Maybe<Scalars['String']>;
4078+
status?: Maybe<Scalars['String']>;
4079+
subscriptionCreationTime?: Maybe<Scalars['String']>;
4080+
};
4081+
40704082
export type AwsRecorderStatus = {
40714083
lastStartTime?: Maybe<Scalars['String']>;
40724084
lastStatus?: Maybe<Scalars['String']>;

0 commit comments

Comments
 (0)