Skip to content

Commit 0b28e22

Browse files
authored
Merge pull request #143 from cloudgraphdev/feature/EP-3188-support-ssm-parameter-service
feat(aws): Add ssm parameter service and update redshift
2 parents 3a3fb86 + 6c39235 commit 0b28e22

16 files changed

Lines changed: 749 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ CloudGraph AWS Provider will ask you what regions you would like to crawl and wi
165165
| subnet | alb, asg, codebuild, dmsReplicationInstance, ec2, ecsService, efsMountTarget, elastiCacheCluster, elasticSearchDomain, elb, lambda, managedAirflow, natGateway, networkInterface, rdsCluster, sageMakerNotebookInstance, routeTable, vpc, vpcEndpoint, eksCluster, emrCluster, flowLog, mskCluster |
166166
| systemsManagerInstance | ec2, iamRole |
167167
| systemsManagerDocument | |
168+
| systemsManagerParameter | |
168169
| transitGateway | transitGatewayAttachment, transitGatewayRouteTable, vpnConnection |
169170
| transitGatewayAttachment | transitGateway, transitGatewayRouteTable, vpc, vpnConnection |
170171
| transitGatewayRouteTable | transitGateway, transitGatewayAttachment |

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
},
3333
"dependencies": {
3434
"@aws-sdk/client-elastic-beanstalk": "^3.338.0",
35+
"@aws-sdk/client-ssm": "^3.341.0",
3536
"@aws-sdk/credential-providers": "^3.256.0",
3637
"@aws-sdk/shared-ini-file-loader": "^3.254.0",
3738
"@cloudgraph/sdk": "^0.22.1",

src/enums/schemasMap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ export default {
104104
[services.sns]: 'awsSns',
105105
[services.systemsManagerInstance]: 'awsSystemsManagerInstance',
106106
[services.systemsManagerDocument]: 'awsSystemsManagerDocument',
107+
[services.systemsManagerParameter]: 'awsSystemsManagerParameter',
107108
[services.transitGateway]: 'awsTransitGateway',
108109
[services.transitGatewayAttachment]: 'awsTransitGatewayAttachment',
109110
[services.transitGatewayRouteTable]: 'awsTransitGatewayRouteTable',

src/enums/serviceAliases.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export default {
7676
[services.subnet]: 'subnets',
7777
[services.systemsManagerDocument]: 'systemsManagerDocuments',
7878
[services.systemsManagerInstance]: 'systemsManagerInstances',
79+
[services.systemsManagerParameter]: 'systemsManagerParameters',
7980
[services.transitGateway]: 'transitGateways',
8081
[services.transitGatewayAttachment]: 'transitGatewayAttachments',
8182
[services.transitGatewayRouteTable]: 'transitGatewayRouteTables',

src/enums/serviceMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ import DmsReplicationInstance from '../services/dmsReplicationInstance'
100100
import SageMakerNotebookInstance from '../services/sageMakerNotebookInstance'
101101
import SystemsManagerInstance from '../services/systemsManagerInstance'
102102
import SystemsManagerDocument from '../services/systemsManagerDocument'
103+
import SystemsManagerParameter from '../services/systemsManagerParameter'
103104
import RdsClusterSnapshot from '../services/rdsClusterSnapshot'
104105
import VpcEndpoint from '../services/vpcEndpoint'
105106
import APIGatewayDomainName from '../services/apiGatewayDomainName'
@@ -222,5 +223,6 @@ export default {
222223
[services.wafV2WebAcl]: WafV2WebAcl,
223224
[services.systemsManagerInstance]: SystemsManagerInstance,
224225
[services.systemsManagerDocument]: SystemsManagerDocument,
226+
[services.systemsManagerParameter]: SystemsManagerParameter,
225227
tag: AwsTag,
226228
}

src/enums/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export default {
9797
subnet: 'subnet',
9898
systemsManagerInstance: 'systemsManagerInstance',
9999
systemsManagerDocument: 'systemsManagerDocument',
100+
systemsManagerParameter: 'systemsManagerParameter',
100101
transitGateway: 'transitGateway',
101102
transitGatewayAttachment: 'transitGatewayAttachment',
102103
transitGatewayRouteTable: 'transitGatewayRouteTable',

src/services/redshift/format.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export default ({
4545
id: arn,
4646
accountId: account,
4747
arn,
48+
name: id,
4849
region,
4950
allowVersionUpgrade,
5051
automatedSnapshotRetentionPeriod,

src/services/redshift/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
type awsRedshiftCluster implements awsBaseService @key(fields: "arn") {
2+
name: String @search(by: [hash, regexp])
23
allowVersionUpgrade: Boolean @search
34
automatedSnapshotRetentionPeriod: Int @search
45
availabilityZone: String @search(by: [hash, regexp])
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import {
2+
DescribeParametersCommand,
3+
DescribeParametersCommandInput,
4+
ParameterMetadata,
5+
SSMClient,
6+
} from '@aws-sdk/client-ssm'
7+
import CloudGraph from '@cloudgraph/sdk'
8+
import { Config } from 'aws-sdk'
9+
import isEmpty from 'lodash/isEmpty'
10+
import awsLoggerText from '../../properties/logger'
11+
import AwsErrorLog from '../../utils/errorLog'
12+
13+
const lt = { ...awsLoggerText }
14+
const { logger } = CloudGraph
15+
const serviceName = 'SystemsManagerParameter'
16+
const errorLog = new AwsErrorLog(serviceName)
17+
const MAX_ITEMS = 50
18+
19+
const listParameters = async (ssm: SSMClient): Promise<ParameterMetadata[]> =>
20+
new Promise(async resolve => {
21+
const parameters: ParameterMetadata[] = []
22+
23+
const input: DescribeParametersCommandInput = {
24+
MaxResults: MAX_ITEMS,
25+
}
26+
27+
const listAllParameters = (token?: string): void => {
28+
if (token) {
29+
input.NextToken = token
30+
}
31+
const command = new DescribeParametersCommand(input)
32+
ssm
33+
.send(command)
34+
.then(data => {
35+
if (isEmpty(data)) {
36+
return resolve([])
37+
}
38+
39+
const { Parameters = [], NextToken: nextToken } = data || {}
40+
41+
parameters.push(...Parameters)
42+
43+
if (nextToken) {
44+
logger.debug(lt.foundAnotherThousand)
45+
listAllParameters(nextToken)
46+
} else {
47+
resolve(parameters)
48+
}
49+
})
50+
.catch(err => {
51+
errorLog.generateAwsErrorLog({
52+
functionName: 'ssm:describeParameters',
53+
err,
54+
})
55+
resolve([])
56+
})
57+
}
58+
listAllParameters()
59+
})
60+
61+
export default async ({
62+
regions,
63+
config,
64+
}: {
65+
regions: string
66+
config: Config
67+
}): Promise<{ [property: string]: ParameterMetadata[] }> =>
68+
new Promise(async resolve => {
69+
const { credentials } = config
70+
const output: { [property: string]: ParameterMetadata[] } = {}
71+
72+
await Promise.all(
73+
regions.split(',').map(region => {
74+
const ssm = new SSMClient({
75+
credentials,
76+
region,
77+
})
78+
output[region] = []
79+
return new Promise<void>(async resolveRegion => {
80+
const params = (await listParameters(ssm)) || []
81+
output[region] = params
82+
resolveRegion()
83+
})
84+
})
85+
)
86+
errorLog.reset()
87+
88+
resolve(output)
89+
})
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { ParameterMetadata } from '@aws-sdk/client-ssm'
2+
import { AwsSystemsManagerParameter } from '../../types/generated'
3+
import { ssmParameterArn } from '../../utils/generateArns'
4+
5+
/**
6+
* Systems Manager Parameter
7+
*/
8+
export default ({
9+
account,
10+
region,
11+
service: parameter,
12+
}: {
13+
account: string
14+
region: string
15+
service: ParameterMetadata
16+
}): AwsSystemsManagerParameter => {
17+
const { Name: name } = parameter
18+
19+
const arn = ssmParameterArn({ region, account, name })
20+
21+
return {
22+
accountId: account,
23+
arn,
24+
id: arn,
25+
name,
26+
region,
27+
}
28+
}

0 commit comments

Comments
 (0)