Skip to content

Commit 7c3e5c0

Browse files
author
Marco Franceschi
committed
feat: Added rdsDBProxies
1 parent 76c4438 commit 7c3e5c0

10 files changed

Lines changed: 261 additions & 1 deletion

File tree

src/enums/serviceMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import NetworkInterface from '../services/networkInterface'
5353
import RDSCluster from '../services/rdsCluster'
5454
import RDSDbInstance from '../services/rdsDbInstance'
5555
import RDSEventSubscription from '../services/rdsEventSubscription'
56+
import RdsDbProxies from '../services/rdsDbProxies'
5657
import RedshiftCluster from '../services/redshift'
5758
import Route53HostedZone from '../services/route53HostedZone'
5859
import Route53Record from '../services/route53Record'
@@ -187,6 +188,7 @@ export default {
187188
[services.rdsClusterSnapshot]: RdsClusterSnapshot,
188189
[services.rdsDbInstance]: RDSDbInstance,
189190
[services.rdsEventSubscription]: RDSEventSubscription,
191+
[services.rdsDbProxies]: RdsDbProxies,
190192
[services.redshiftCluster]: RedshiftCluster,
191193
[services.route53HostedZone]: Route53HostedZone,
192194
[services.route53Record]: Route53Record,

src/enums/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export default {
8181
rdsClusterSnapshot: 'rdsClusterSnapshot',
8282
rdsDbInstance: 'rdsDbInstance',
8383
rdsEventSubscription: 'rdsEventSubscription',
84+
rdsDbProxies: 'rdsDbProxies',
8485
redshiftCluster: 'redshiftCluster',
8586
route53HostedZone: 'route53HostedZone',
8687
route53Record: 'route53Record',

src/properties/logger.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ export default {
296296
`Fetched ${num} RDS DB Instances`,
297297
fetchedRdsEventSubscriptions: (num: number): string =>
298298
`Fetched ${num} RDS DB Event Subscriptions`,
299+
fetchedRdsDbProxies: (num: number): string =>
300+
`Fetched ${num} RDS DB Proxies`,
299301
noClusterFound: '❎ DB Instance is not part of a cluster ❎ ',
300302
foundCluster: 'Found the cluster the instance belongs to',
301303
addingRdsInstances: (num: number): string =>

src/services/rdsDbProxies/data.ts

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+
DescribeDBProxiesResponse,
4+
DBProxy,
5+
DescribeDBProxiesRequest
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 DB Proxies'
19+
const errorLog = new AwsErrorLog(serviceName)
20+
const endpoint = initTestEndpoint(serviceName)
21+
22+
const listDBProxiesForRegion = async (rds: RDS): Promise<DBProxy[]> =>
23+
new Promise<DBProxy[]>(resolve => {
24+
const proxies: DBProxy[] = []
25+
const descDBProxiesOpts: DescribeDBProxiesRequest = {}
26+
const listProxies = (token?: string): void => {
27+
if (token) {
28+
descDBProxiesOpts.Marker = token
29+
}
30+
try {
31+
rds.describeDBProxies(
32+
descDBProxiesOpts,
33+
(err: AWSError, data: DescribeDBProxiesResponse) => {
34+
const { Marker, DBProxies = [] } = data || {}
35+
if (err) {
36+
errorLog.generateAwsErrorLog({
37+
functionName: 'rds:describeDBProxies',
38+
err,
39+
})
40+
}
41+
42+
proxies.push(...DBProxies)
43+
44+
if (Marker) {
45+
listProxies(Marker)
46+
} else {
47+
resolve(proxies)
48+
}
49+
}
50+
)
51+
} catch (error) {
52+
resolve([])
53+
}
54+
}
55+
listProxies()
56+
})
57+
58+
export interface RawAwsRdsDbProxies extends DBProxy {
59+
region: string
60+
}
61+
62+
export default async ({
63+
regions,
64+
config,
65+
}: {
66+
regions: string
67+
config: Config
68+
}): Promise<{ [property: string]: RawAwsRdsDbProxies[] }> =>
69+
new Promise(async resolve => {
70+
const rdsData: RawAwsRdsDbProxies[] = []
71+
const regionPromises = []
72+
73+
// Get all the proxies 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 listDBProxiesForRegion(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.fetchedRdsDbProxies(rdsData.length))
94+
95+
errorLog.reset()
96+
resolve(groupBy(rdsData, 'region'))
97+
})
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { UserAuthConfigInfo } from 'aws-sdk/clients/rds'
2+
import { AwsRdsDbProxies, AwsRdsDbProxiesUserAuthConfigInfo } from '../../types/generated'
3+
import { RawAwsRdsDbProxies } from './data'
4+
import { generateUniqueId } from '@cloudgraph/sdk'
5+
6+
/**
7+
* RdsDbProxies
8+
*/
9+
10+
export default ({
11+
account,
12+
service: rawData,
13+
region,
14+
}: {
15+
account,
16+
service: RawAwsRdsDbProxies
17+
region,
18+
}): AwsRdsDbProxies => {
19+
const {
20+
DBProxyName: dBProxyName,
21+
DBProxyArn: arn,
22+
Status: status,
23+
EngineFamily: engineFamily,
24+
VpcId: vpcId,
25+
VpcSecurityGroupIds: vpcSecurityGroupIds = [],
26+
VpcSubnetIds: vpcSubnetIds = [],
27+
Auth: auth,
28+
RoleArn: roleArn,
29+
Endpoint: endpoint,
30+
RequireTLS: requireTLS,
31+
IdleClientTimeout: idleClientTimeout,
32+
DebugLogging: debugLogging,
33+
CreatedDate: createdDate,
34+
UpdatedDate: updatedDate,
35+
} = rawData
36+
37+
38+
39+
const formatUserAuthConfigInfo = (
40+
configList?: UserAuthConfigInfo[]
41+
): AwsRdsDbProxiesUserAuthConfigInfo[] => {
42+
return (
43+
configList?.map(c => ({
44+
id: generateUniqueId({
45+
arn,
46+
...c,
47+
}),
48+
description: c.Description,
49+
userName: c.UserName,
50+
authScheme: c.AuthScheme,
51+
secretArn: c.SecretArn,
52+
iAMAuth: c.IAMAuth,
53+
clientPasswordAuthType: c.ClientPasswordAuthType
54+
})) || []
55+
)
56+
}
57+
58+
59+
60+
61+
return {
62+
id: arn,
63+
accountId: account,
64+
region,
65+
dBProxyName,
66+
arn,
67+
status,
68+
engineFamily,
69+
vpcId,
70+
vpcSecurityGroupIds,
71+
vpcSubnetIds,
72+
auth: formatUserAuthConfigInfo(auth),
73+
roleArn,
74+
endpoint,
75+
requireTLS,
76+
idleClientTimeout,
77+
debugLogging,
78+
createdDate: createdDate.toISOString(),
79+
updatedDate: updatedDate.toISOString(),
80+
}
81+
}

src/services/rdsDbProxies/index.ts

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 RdsDbProxies 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: [AddawsRdsDbProxiesInput!]!) {
2+
addawsRdsDbProxies(input: $input, upsert: true) {
3+
numUids
4+
}
5+
}`;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
2+
type awsRdsDbProxiesUserAuthConfigInfo
3+
@generate(
4+
query: { get: false, query: true, aggregate: false }
5+
mutation: { add: false, delete: false }
6+
subscription: false
7+
) {
8+
id: String! @id
9+
Description: String @search(by: [hash, regexp])
10+
UserName: String @search(by: [hash, regexp])
11+
AuthScheme: String @search(by: [hash, regexp])
12+
SecretArn: String @search(by: [hash, regexp])
13+
IAMAuth: String @search(by: [hash, regexp])
14+
ClientPasswordAuthType: String @search(by: [hash, regexp])
15+
}
16+
17+
type awsRdsDbProxies implements awsBaseService @key(fields: "arn") {
18+
dBProxyName: String @search(by: [hash, regexp])
19+
status: String @search(by: [hash, regexp])
20+
engineFamily: String @search(by: [hash, regexp])
21+
vpcId: String @search(by: [hash, regexp])
22+
vpcSecurityGroupIds: [String] @search(by: [hash])
23+
vpcSubnetIds: [String] @search(by: [hash])
24+
auth: [awsRdsDbProxiesUserAuthConfigInfo]
25+
roleArn: String @search(by: [hash, regexp])
26+
endpoint: String @search(by: [hash, regexp])
27+
requireTLS: Boolean @search
28+
idleClientTimeout: Int @search
29+
debugLogging: Boolean @search
30+
createdDate: DateTime @search(by: [day])
31+
updatedDate: DateTime @search(by: [day])
32+
}

src/services/rdsEventSubscription/data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export default async ({
7070
const rdsData: RawAwsRdsEventSubscription[] = []
7171
const regionPromises = []
7272

73-
// Get all the instances for the region
73+
// Get all the events subscriptions for the region
7474
regions.split(',').map(region => {
7575
const regionPromise = new Promise<void>(async resolveRegion => {
7676
const rds = new RDS({ ...config, region, endpoint })

src/types/generated.ts

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

4070+
export type AwsRdsDbProxies = AwsBaseService & {
4071+
auth?: Maybe<Array<Maybe<AwsRdsDbProxiesUserAuthConfigInfo>>>;
4072+
createdDate?: Maybe<Scalars['DateTime']>;
4073+
dBProxyName?: Maybe<Scalars['String']>;
4074+
debugLogging?: Maybe<Scalars['Boolean']>;
4075+
endpoint?: Maybe<Scalars['String']>;
4076+
engineFamily?: Maybe<Scalars['String']>;
4077+
idleClientTimeout?: Maybe<Scalars['Int']>;
4078+
requireTLS?: Maybe<Scalars['Boolean']>;
4079+
roleArn?: Maybe<Scalars['String']>;
4080+
status?: Maybe<Scalars['String']>;
4081+
updatedDate?: Maybe<Scalars['DateTime']>;
4082+
vpcId?: Maybe<Scalars['String']>;
4083+
vpcSecurityGroupIds?: Maybe<Array<Maybe<Scalars['String']>>>;
4084+
vpcSubnetIds?: Maybe<Array<Maybe<Scalars['String']>>>;
4085+
};
4086+
4087+
export type AwsRdsDbProxiesUserAuthConfigInfo = {
4088+
AuthScheme?: Maybe<Scalars['String']>;
4089+
ClientPasswordAuthType?: Maybe<Scalars['String']>;
4090+
Description?: Maybe<Scalars['String']>;
4091+
IAMAuth?: Maybe<Scalars['String']>;
4092+
SecretArn?: Maybe<Scalars['String']>;
4093+
UserName?: Maybe<Scalars['String']>;
4094+
id: Scalars['String'];
4095+
};
4096+
40704097
export type AwsRdsEventSubscription = AwsBaseService & {
40714098
custSubscriptionId?: Maybe<Scalars['String']>;
40724099
customerAwsId?: Maybe<Scalars['String']>;

0 commit comments

Comments
 (0)