Skip to content

Commit 1377e9a

Browse files
author
Marco Franceschi
committed
feat: Added snapshots for dbinstances
1 parent 7c3e5c0 commit 1377e9a

4 files changed

Lines changed: 186 additions & 4 deletions

File tree

src/services/rdsDbInstance/data.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import RDS, {
44
DBInstance,
55
DescribeDBInstancesMessage,
66
DBInstanceMessage,
7+
DBSnapshotMessage,
8+
DBSnapshot,
79
} from 'aws-sdk/clients/rds'
810
import { AWSError } from 'aws-sdk/lib/error'
911
import groupBy from 'lodash/groupBy'
@@ -57,6 +59,28 @@ const listDBInstancesForRegion = async (rds: RDS): Promise<DBInstance[]> =>
5759
listAllDBInstances()
5860
})
5961

62+
const getInstanceSnapshots = async (rds: RDS, arn: string): Promise<DBSnapshot[]> =>
63+
new Promise(resolve => {
64+
try {
65+
rds.describeDBSnapshots(
66+
{ DBInstanceIdentifier: arn },
67+
(err: AWSError, data: DBSnapshotMessage) => {
68+
if (err) {
69+
errorLog.generateAwsErrorLog({
70+
functionName: 'rds:describeDBSnapshots',
71+
err,
72+
})
73+
return resolve([])
74+
}
75+
const { DBSnapshots: snapshots = [] } = data || {}
76+
resolve(snapshots)
77+
}
78+
)
79+
} catch (error) {
80+
resolve([])
81+
}
82+
})
83+
6084
const getResourceTags = async (rds: RDS, arn: string): Promise<TagMap> =>
6185
new Promise(resolve => {
6286
try {
@@ -81,6 +105,7 @@ const getResourceTags = async (rds: RDS, arn: string): Promise<TagMap> =>
81105

82106
export interface RawAwsRdsDbInstance extends DBInstance {
83107
Tags?: TagMap
108+
Snapshots?: DBSnapshot[]
84109
region: string
85110
}
86111

@@ -123,6 +148,7 @@ export default async ({
123148
const rds = new RDS({ ...config, region, endpoint })
124149
const tagsPromise = new Promise<void>(async resolveTags => {
125150
rdsData[idx].Tags = await getResourceTags(rds, DBInstanceArn)
151+
rdsData[idx].Snapshots = await getInstanceSnapshots(rds, DBInstanceArn)
126152
resolveTags()
127153
})
128154
tagsPromises.push(tagsPromise)

src/services/rdsDbInstance/format.ts

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import { generateUniqueId } from '@cloudgraph/sdk'
33
import upperFirst from 'lodash/upperFirst'
44
import { RawAwsRdsDbInstance } from './data'
55
import {
6-
AwsRdsDbInstance,
6+
AwsRdsDbInstance, AwsRdsDbInstanceGroupOption, AwsRdsDbInstanceParameterGroup, AwsRdsDbInstanceSnapshot,
77
} from '../../types/generated'
8-
import { formatTagsFromMap } from '../../utils/format'
8+
import { convertAwsTagsToTagMap, formatTagsFromMap } from '../../utils/format'
9+
import { AwsTag } from '../../types'
910

1011
export default ({
1112
service,
@@ -44,11 +45,12 @@ export default ({
4445
Endpoint: endpoint,
4546
LicenseModel: licenseModel,
4647
Tags = {},
48+
Snapshots = []
4749
} = service
4850

4951
const subnetGroup = service.DBSubnetGroup?.DBSubnetGroupName || ''
5052

51-
const parameterGroups = service.DBParameterGroups.map(
53+
const parameterGroups: AwsRdsDbInstanceParameterGroup[] = service.DBParameterGroups.map(
5254
(parameter) => {
5355
const { DBParameterGroupName, ParameterApplyStatus } = parameter
5456
return ({
@@ -63,7 +65,7 @@ export default ({
6365
}
6466
)
6567

66-
const optionsGroups = service.OptionGroupMemberships.map(
68+
const optionsGroups: AwsRdsDbInstanceGroupOption[] = service.OptionGroupMemberships.map(
6769
(option) => {
6870
const { OptionGroupName, Status } = option
6971
return ({
@@ -79,6 +81,61 @@ export default ({
7981

8082
)
8183

84+
const snapshots: AwsRdsDbInstanceSnapshot[] = Snapshots.map(
85+
(snapshot) => {
86+
const tags = convertAwsTagsToTagMap(snapshot.TagList as AwsTag[])
87+
return ({
88+
id: generateUniqueId({
89+
arn,
90+
...snapshot
91+
}),
92+
dBSnapshotIdentifier: snapshot.DBSnapshotIdentifier,
93+
dBInstanceIdentifier: snapshot.DBInstanceIdentifier,
94+
snapshotCreateTime: snapshot.SnapshotCreateTime?.toISOString(),
95+
engine: snapshot.Engine,
96+
allocatedStorage: snapshot.AllocatedStorage,
97+
status: snapshot.Status,
98+
port: snapshot.Port,
99+
availabilityZone: snapshot.AvailabilityZone,
100+
vpcId: snapshot.VpcId,
101+
instanceCreateTime: snapshot.InstanceCreateTime?.toISOString(),
102+
masterUsername: snapshot.MasterUsername,
103+
engineVersion: snapshot.EngineVersion,
104+
licenseModel: snapshot.LicenseModel,
105+
snapshotType: snapshot.SnapshotType,
106+
iops: snapshot.Iops,
107+
optionGroupName: snapshot.OptionGroupName,
108+
percentProgress: snapshot.PercentProgress,
109+
sourceRegion: snapshot.SourceRegion,
110+
sourceDBSnapshotIdentifier: snapshot.SourceDBSnapshotIdentifier,
111+
storageType: snapshot.StorageType,
112+
tdeCredentialArn: snapshot.TdeCredentialArn,
113+
encrypted: snapshot.Encrypted,
114+
kmsKeyId: snapshot.KmsKeyId,
115+
dBSnapshotArn: snapshot.DBSnapshotArn,
116+
timezone: snapshot.Timezone,
117+
iAMDatabaseAuthenticationEnabled: snapshot.IAMDatabaseAuthenticationEnabled,
118+
processorFeatures: snapshot.ProcessorFeatures?.map(p => ({
119+
id: generateUniqueId({
120+
arn,
121+
...p
122+
}),
123+
name: p.Name,
124+
value: p.Value
125+
})),
126+
dbiResourceId: snapshot.DbiResourceId,
127+
tagList: snapshot.TagList,
128+
originalSnapshotCreateTime: snapshot.OriginalSnapshotCreateTime?.toISOString(),
129+
snapshotDatabaseTime: snapshot.SnapshotDatabaseTime?.toISOString(),
130+
snapshotTarget: snapshot.SnapshotTarget,
131+
storageThroughput: snapshot.StorageThroughput,
132+
tags: formatTagsFromMap(tags)
133+
})
134+
}
135+
)
136+
137+
138+
82139
return {
83140
id: arn,
84141
accountId: account,
@@ -114,6 +171,7 @@ export default ({
114171
kmsKey,
115172
encrypted,
116173
licenseModel,
174+
snapshots,
117175
tags: formatTagsFromMap(Tags),
118176
}
119177
}

src/services/rdsDbInstance/schema.graphql

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,57 @@ type awsRdsDbInstanceGroupOption {
1212
description: String @search(by: [hash, regexp])
1313
}
1414

15+
type awsRdsDbInstanceSnapshot {
16+
id: String! @id
17+
groupName: String @search(by: [hash, regexp])
18+
status: String @search(by: [hash, regexp])
19+
description: String @search(by: [hash, regexp])
20+
}
21+
22+
23+
type awsRdsDbInstanceProcessorFeature {
24+
id: String! @id
25+
name: String @search(by: [hash, regexp])
26+
value: String @search(by: [hash, regexp])
27+
}
28+
29+
type awsRdsDbInstanceSnapshot {
30+
id: String! @id
31+
dBSnapshotIdentifier: String @search(by: [hash, regexp])
32+
dBInstanceIdentifier: String @search(by: [hash, regexp])
33+
snapshotCreateTime: DateTime @search(by: [day])
34+
engine: String @search(by: [hash, regexp])
35+
allocatedStorage: Int @search
36+
status: String @search(by: [hash, regexp])
37+
port: Int @search
38+
availabilityZone: String @search(by: [hash, regexp])
39+
vpcId: String @search(by: [hash, regexp])
40+
instanceCreateTime: DateTime @search(by: [day])
41+
masterUsername: String @search(by: [hash, regexp])
42+
engineVersion: String @search(by: [hash, regexp])
43+
licenseModel: String @search(by: [hash, regexp])
44+
snapshotType: String @search(by: [hash, regexp])
45+
iops: Int @search
46+
optionGroupName: String @search(by: [hash, regexp])
47+
percentProgress: Int @search
48+
sourceRegion: String @search(by: [hash, regexp])
49+
sourceDBSnapshotIdentifier: String @search(by: [hash, regexp])
50+
storageType: String @search(by: [hash, regexp])
51+
tdeCredentialArn: String @search(by: [hash, regexp])
52+
encrypted: Boolean @search
53+
kmsKeyId: String @search(by: [hash, regexp])
54+
dBSnapshotArn: String @search(by: [hash, regexp])
55+
timezone: String @search(by: [hash, regexp])
56+
iAMDatabaseAuthenticationEnabled: Boolean @search
57+
processorFeatures: [awsRdsDbInstanceProcessorFeature]
58+
dbiResourceId: String @search(by: [hash, regexp])
59+
tags: [awsRawTag]
60+
originalSnapshotCreateTime: DateTime @search(by: [day])
61+
snapshotDatabaseTime: DateTime @search(by: [day])
62+
snapshotTarget: String @search(by: [hash, regexp])
63+
storageThroughput: Int @search
64+
}
65+
1566

1667
type awsRdsDbInstance implements awsBaseService @key(fields: "arn") {
1768
name: String @search(by: [hash, regexp])
@@ -45,6 +96,7 @@ type awsRdsDbInstance implements awsBaseService @key(fields: "arn") {
4596
encrypted: Boolean @search
4697
licenseModel: String @search(by: [hash, regexp])
4798
tags: [awsRawTag]
99+
snapshots: [awsRdsDbInstanceSnapshot]
48100
cluster: [awsRdsCluster] @hasInverse(field: instances)
49101
kms: [awsKms] @hasInverse(field: rdsDbInstance)
50102
securityGroups: [awsSecurityGroup] @hasInverse(field: rdsDbInstance)

src/types/generated.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4044,6 +4044,7 @@ export type AwsRdsDbInstance = AwsBaseService & {
40444044
resourceId?: Maybe<Scalars['String']>;
40454045
route53HostedZone?: Maybe<Array<Maybe<AwsRoute53HostedZone>>>;
40464046
securityGroups?: Maybe<Array<Maybe<AwsSecurityGroup>>>;
4047+
snapshots?: Maybe<Array<Maybe<AwsRdsDbInstanceSnapshot>>>;
40474048
status?: Maybe<Scalars['String']>;
40484049
storageType?: Maybe<Scalars['String']>;
40494050
subnet?: Maybe<Array<Maybe<AwsSubnet>>>;
@@ -4067,6 +4068,51 @@ export type AwsRdsDbInstanceParameterGroup = {
40674068
status?: Maybe<Scalars['String']>;
40684069
};
40694070

4071+
export type AwsRdsDbInstanceProcessorFeature = {
4072+
id: Scalars['String'];
4073+
name?: Maybe<Scalars['String']>;
4074+
value?: Maybe<Scalars['String']>;
4075+
};
4076+
4077+
export type AwsRdsDbInstanceSnapshot = {
4078+
allocatedStorage?: Maybe<Scalars['Int']>;
4079+
availabilityZone?: Maybe<Scalars['String']>;
4080+
dBInstanceIdentifier?: Maybe<Scalars['String']>;
4081+
dBSnapshotArn?: Maybe<Scalars['String']>;
4082+
dBSnapshotIdentifier?: Maybe<Scalars['String']>;
4083+
dbiResourceId?: Maybe<Scalars['String']>;
4084+
description?: Maybe<Scalars['String']>;
4085+
encrypted?: Maybe<Scalars['Boolean']>;
4086+
engine?: Maybe<Scalars['String']>;
4087+
engineVersion?: Maybe<Scalars['String']>;
4088+
groupName?: Maybe<Scalars['String']>;
4089+
iAMDatabaseAuthenticationEnabled?: Maybe<Scalars['Boolean']>;
4090+
id: Scalars['String'];
4091+
instanceCreateTime?: Maybe<Scalars['DateTime']>;
4092+
iops?: Maybe<Scalars['Int']>;
4093+
kmsKeyId?: Maybe<Scalars['String']>;
4094+
licenseModel?: Maybe<Scalars['String']>;
4095+
masterUsername?: Maybe<Scalars['String']>;
4096+
optionGroupName?: Maybe<Scalars['String']>;
4097+
originalSnapshotCreateTime?: Maybe<Scalars['DateTime']>;
4098+
percentProgress?: Maybe<Scalars['Int']>;
4099+
port?: Maybe<Scalars['Int']>;
4100+
processorFeatures?: Maybe<Array<Maybe<AwsRdsDbInstanceProcessorFeature>>>;
4101+
snapshotCreateTime?: Maybe<Scalars['DateTime']>;
4102+
snapshotDatabaseTime?: Maybe<Scalars['DateTime']>;
4103+
snapshotTarget?: Maybe<Scalars['String']>;
4104+
snapshotType?: Maybe<Scalars['String']>;
4105+
sourceDBSnapshotIdentifier?: Maybe<Scalars['String']>;
4106+
sourceRegion?: Maybe<Scalars['String']>;
4107+
status?: Maybe<Scalars['String']>;
4108+
storageThroughput?: Maybe<Scalars['Int']>;
4109+
storageType?: Maybe<Scalars['String']>;
4110+
tags?: Maybe<Array<Maybe<AwsRawTag>>>;
4111+
tdeCredentialArn?: Maybe<Scalars['String']>;
4112+
timezone?: Maybe<Scalars['String']>;
4113+
vpcId?: Maybe<Scalars['String']>;
4114+
};
4115+
40704116
export type AwsRdsDbProxies = AwsBaseService & {
40714117
auth?: Maybe<Array<Maybe<AwsRdsDbProxiesUserAuthConfigInfo>>>;
40724118
createdDate?: Maybe<Scalars['DateTime']>;

0 commit comments

Comments
 (0)