Skip to content

Commit 832fc7b

Browse files
committed
feat: Handle TODOs for EC2
1 parent d79a230 commit 832fc7b

9 files changed

Lines changed: 118 additions & 23 deletions

File tree

src/services/ec2/connections.ts

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import { RawAwsSubnet } from '../subnet/data'
1616
import { RawAwsEcsContainer } from '../ecsContainer/data'
1717
import { RawAwsSystemsManagerInstance } from '../systemsManagerInstance/data'
1818
import { ssmManagedInstanceArn } from '../../utils/generateArns'
19+
import { RawAwsElasticBeanstalkEnv } from '../elasticBeanstalkEnvironment/data'
20+
import { RawAwsEksCluster } from '../eksCluster/data'
21+
import { getEksClusterName, getElasticBeanstalkEnvId } from './utils'
1922

2023
/**
2124
* EC2
@@ -44,6 +47,7 @@ export default ({
4447
SecurityGroups: instanceSecurityGroups = [],
4548
NetworkInterfaces: instanceNetworkInterfaces = [],
4649
SubnetId: subnetId,
50+
Tags: tags,
4751
} = instance
4852

4953
/**
@@ -189,17 +193,37 @@ export default ({
189193
id: subnet.SubnetId,
190194
resourceType: services.subnet,
191195
relation: 'child',
192-
field: 'subnet',
196+
field: 'subnets',
193197
})
194198
}
195199
}
196200
}
197201

198202
/**
199-
* Find EKS
203+
* Find EKS cluster
200204
* related to this EC2
201205
*/
202-
// TODO: Implement when eks service is ready
206+
const eksClusterName = getEksClusterName(tags)
207+
const eksClusters: {
208+
name: string
209+
data: { [property: string]: any[] }
210+
} = data.find(({ name }) => name === services.eksCluster)
211+
if (eksClusters?.data?.[region]) {
212+
const eksClustersInRegion: RawAwsEksCluster[] = eksClusters.data[
213+
region
214+
].filter(({ name }: RawAwsEksCluster) => name === eksClusterName)
215+
216+
if (!isEmpty(eksClustersInRegion)) {
217+
for (const eksCluster of eksClustersInRegion) {
218+
connections.push({
219+
id: eksCluster.arn,
220+
resourceType: services.eksCluster,
221+
relation: 'child',
222+
field: 'eksCluster',
223+
})
224+
}
225+
}
226+
}
203227

204228
/**
205229
* Find ECS Container
@@ -210,9 +234,9 @@ export default ({
210234
data: { [property: string]: any[] }
211235
} = data.find(({ name }) => name === services.ecsContainer)
212236
if (ecsContainers?.data?.[region]) {
213-
const containersInRegion: RawAwsEcsContainer[] = ecsContainers.data[region].filter(
214-
({ ec2InstanceId }) => ec2InstanceId === id
215-
)
237+
const containersInRegion: RawAwsEcsContainer[] = ecsContainers.data[
238+
region
239+
].filter(({ ec2InstanceId }) => ec2InstanceId === id)
216240

217241
if (!isEmpty(containersInRegion)) {
218242
for (const container of containersInRegion) {
@@ -230,18 +254,24 @@ export default ({
230254
* Find SSM managed instances
231255
* related to this EC2 instance
232256
*/
233-
const instances: {
257+
const instances: {
234258
name: string
235259
data: { [property: string]: any[] }
236260
} = data.find(({ name }) => name === services.systemsManagerInstance)
237261
if (instances?.data?.[region]) {
238-
const dataInRegion: RawAwsSystemsManagerInstance[] = instances.data[region].filter(
262+
const dataInRegion: RawAwsSystemsManagerInstance[] = instances.data[
263+
region
264+
].filter(
239265
({ InstanceId }: RawAwsSystemsManagerInstance) => InstanceId === id
240266
)
241267

242268
if (!isEmpty(dataInRegion)) {
243269
for (const ssmInstance of dataInRegion) {
244-
const arn = ssmManagedInstanceArn({ region, account, name: ssmInstance.InstanceId })
270+
const arn = ssmManagedInstanceArn({
271+
region,
272+
account,
273+
name: ssmInstance.InstanceId,
274+
})
245275
connections.push({
246276
id: arn,
247277
resourceType: services.systemsManagerInstance,
@@ -254,9 +284,31 @@ export default ({
254284

255285
/**
256286
* Find Elastic Beanstalk
257-
* related to this EC2 loadbalancer
287+
* related to this EC2 instance
258288
*/
259-
// TODO: Implement when eb service is ready
289+
const elasticBeanstalkEnvId = getElasticBeanstalkEnvId(tags)
290+
const elasticBeanstalkEnvs: {
291+
name: string
292+
data: { [property: string]: any[] }
293+
} = data.find(({ name }) => name === services.elasticBeanstalkEnv)
294+
if (elasticBeanstalkEnvs?.data?.[region]) {
295+
const elasticBeanstalkEnvsInRegion: RawAwsElasticBeanstalkEnv[] =
296+
elasticBeanstalkEnvs.data[region].filter(
297+
({ EnvironmentId }: RawAwsElasticBeanstalkEnv) =>
298+
elasticBeanstalkEnvId === EnvironmentId
299+
)
300+
301+
if (!isEmpty(elasticBeanstalkEnvsInRegion)) {
302+
for (const elasticBeanstalkEnv of elasticBeanstalkEnvsInRegion) {
303+
connections.push({
304+
id: elasticBeanstalkEnv.EnvironmentId,
305+
resourceType: services.elasticBeanstalkEnv,
306+
relation: 'child',
307+
field: 'elasticBeanstalkEnv',
308+
})
309+
}
310+
}
311+
}
260312

261313
const ec2Result = {
262314
[id]: connections,

src/services/ec2/schema.graphql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@ type awsEc2 @key(fields: "arn") {
116116
eip: [awsEip] @hasInverse(field: ec2Instance)
117117
networkInterfaces: [awsNetworkInterface] @hasInverse(field: ec2Instance)
118118
securityGroups: [awsSecurityGroup] @hasInverse(field: ec2Instance)
119-
subnet: [awsSubnet] @hasInverse(field: ec2Instance) #change to plural
120-
ecsContainer: [awsEcsContainer] @hasInverse(field: ec2Instance) #change to plural
119+
subnets: [awsSubnet] @hasInverse(field: ec2Instances)
120+
ecsContainer: [awsEcsContainer] @hasInverse(field: ec2Instances)
121121
emrInstance: [awsEmrInstance] @hasInverse(field: ec2Instance)
122122
systemsManagerInstance: [awsSystemsManagerInstance] @hasInverse(field: ec2Instance)
123+
eksCluster: [awsEksCluster] @hasInverse(field: ec2Instances)
124+
elasticBeanstalkEnv: [awsElasticBeanstalkEnv] @hasInverse(field: ec2Instances)
123125
}

src/services/ec2/utils.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Tag } from 'aws-sdk/clients/ec2'
2+
import { isEmpty, last } from 'lodash'
3+
4+
const clusterTag = 'kubernetes.io/cluster/'
5+
const environmentIdTag = 'elasticbeanstalk:environment-id'
6+
7+
export const getEksClusterName = (tags?: Tag[]): string => {
8+
if (isEmpty(tags)) {
9+
return ''
10+
}
11+
let eksClusterName = ''
12+
Object.keys(tags)?.some(key => {
13+
const isMatch = key.includes(clusterTag)
14+
if (isMatch) {
15+
eksClusterName = last(key.split('/'))
16+
}
17+
return isMatch
18+
})
19+
return eksClusterName
20+
}
21+
22+
export const getElasticBeanstalkEnvId = (tags?: Tag[]): string => {
23+
if (isEmpty(tags)) {
24+
return ''
25+
}
26+
let elasticBeanstalkId = ''
27+
Object.keys(tags)?.some(key => {
28+
const isMatch = key.includes(environmentIdTag)
29+
if (isMatch) {
30+
elasticBeanstalkId = tags[key]
31+
}
32+
return isMatch
33+
})
34+
return elasticBeanstalkId
35+
}

src/services/ecsContainer/schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type awsEcsContainer @key(fields: "arn") {
1818
registeredAt: String @search(by: [hash, regexp])
1919
attachments: [awsEcsAttachment]
2020
tags: [awsRawTag]
21-
ec2Instance: [awsEc2] @hasInverse(field: ecsContainer)
21+
ec2Instances: [awsEc2] @hasInverse(field: ecsContainer)
2222
ecsTask: [awsEcsTask] @hasInverse(field: ecsContainer)
2323
}
2424

src/services/eksCluster/connections.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export default ({
120120
id: subnet.SubnetId,
121121
resourceType: services.subnet,
122122
relation: 'child',
123-
field: 'subnet',
123+
field: 'subnets',
124124
})
125125
}
126126
}

src/services/eksCluster/schema.graphql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ type awsEksCluster @key(fields: "arn") {
2020
iamRoles: [awsIamRole] @hasInverse(field: eksCluster)
2121
kms: [awsKms] @hasInverse(field: eksCluster)
2222
securityGroups: [awsSecurityGroup] @hasInverse(field: eksCluster)
23-
subnet: [awsSubnet] @hasInverse(field: eksCluster) #change to plural
23+
subnets: [awsSubnet] @hasInverse(field: eksCluster)
2424
vpc: [awsVpc] @hasInverse(field: eksCluster)
25+
ec2Instances: [awsEc2] @hasInverse(field: eksCluster)
2526
}
2627

2728
type awsEksVpcConfigResponse {

src/services/elasticBeanstalkEnvironment/schema.graphql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ type awsElasticBeanstalkEnv @key(fields: "arn") {
1414
solutionStackName: String @search(by: [hash, regexp])
1515
tier: String @search(by: [hash])
1616
versionLabel: String @search(by: [hash, regexp])
17-
elasticBeanstalkApp: [awsElasticBeanstalkApp] @hasInverse(field: elasticBeanstalkEnv)
1817
tags: [awsRawTag]
18+
elasticBeanstalkApp: [awsElasticBeanstalkApp] @hasInverse(field: elasticBeanstalkEnv)
19+
ec2Instances: [awsEc2] @hasInverse(field: elasticBeanstalkEnv)
1920
}
2021

2122
type awsElasticBeanstalkEnvSetting {

src/services/subnet/schema.graphql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ type awsSubnet @key(fields: "id") {
1414
tags: [awsRawTag]
1515
alb: [awsAlb] @hasInverse(field: subnet) #change to plural
1616
asg: [awsAsg] @hasInverse(field: subnet) #change to plural
17-
ec2Instance: [awsEc2] @hasInverse(field: subnet) #change to plural
17+
ec2Instances: [awsEc2] @hasInverse(field: subnets) #change to plural
1818
elb: [awsElb] @hasInverse(field: subnet) #change to plural
1919
lambda: [awsLambda] @hasInverse(field: subnet) #change to plural
2020
natGateway: [awsNatGateway] @hasInverse(field: subnet) #change to plural
2121
networkInterface: [awsNetworkInterface] @hasInverse(field: subnet) #change to plural
2222
routeTable: [awsRouteTable] @hasInverse(field: subnet)
2323
vpc: [awsVpc] @hasInverse(field: subnet)
2424
rdsDbInstance: [awsRdsDbInstance] @hasInverse(field: subnet) #change to plural
25-
eksCluster: [awsEksCluster] @hasInverse(field: subnet) #change to plural
25+
eksCluster: [awsEksCluster] @hasInverse(field: subnets)
2626
ecsService: [awsEcsService] @hasInverse(field: subnet) #change to plural
2727
efsMountTarget: [awsEfsMountTarget] @hasInverse(field: subnet) #change to plural
2828
flowLogs: [awsFlowLog] @hasInverse(field: subnet) #change to singular

src/types/generated.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,6 +1512,8 @@ export type AwsEc2 = {
15121512
ebsOptimized?: Maybe<Scalars['String']>;
15131513
ecsContainer?: Maybe<Array<Maybe<AwsEcsContainer>>>;
15141514
eip?: Maybe<Array<Maybe<AwsEip>>>;
1515+
eksCluster?: Maybe<Array<Maybe<AwsEksCluster>>>;
1516+
elasticBeanstalkEnv?: Maybe<Array<Maybe<AwsElasticBeanstalkEnv>>>;
15151517
elasticIps?: Maybe<Scalars['String']>;
15161518
emrInstance?: Maybe<Array<Maybe<AwsEmrInstance>>>;
15171519
ephemeralBlockDevices?: Maybe<Array<Maybe<AwsEc2Blockdevice>>>;
@@ -1540,7 +1542,7 @@ export type AwsEc2 = {
15401542
securityGroupIds?: Maybe<Array<Maybe<Scalars['String']>>>;
15411543
securityGroups?: Maybe<Array<Maybe<AwsSecurityGroup>>>;
15421544
sourceDestCheck?: Maybe<Scalars['String']>;
1543-
subnet?: Maybe<Array<Maybe<AwsSubnet>>>;
1545+
subnets?: Maybe<Array<Maybe<AwsSubnet>>>;
15441546
systemsManagerInstance?: Maybe<Array<Maybe<AwsSystemsManagerInstance>>>;
15451547
tags?: Maybe<Array<Maybe<AwsRawTag>>>;
15461548
tenancy?: Maybe<Scalars['String']>;
@@ -1685,8 +1687,8 @@ export type AwsEcsContainer = {
16851687
attachments?: Maybe<Array<Maybe<AwsEcsAttachment>>>;
16861688
attributes?: Maybe<Array<Maybe<AwsEcsAttribute>>>;
16871689
capacityProviderName?: Maybe<Scalars['String']>;
1688-
ec2Instance?: Maybe<Array<Maybe<AwsEc2>>>;
16891690
ec2InstanceId?: Maybe<Scalars['String']>;
1691+
ec2Instances?: Maybe<Array<Maybe<AwsEc2>>>;
16901692
ecsTask?: Maybe<Array<Maybe<AwsEcsTask>>>;
16911693
id: Scalars['String'];
16921694
pendingTasksCount?: Maybe<Scalars['Int']>;
@@ -2321,6 +2323,7 @@ export type AwsEksCluster = {
23212323
certificateAuthority?: Maybe<AwsEksCertificate>;
23222324
clientRequestToken?: Maybe<Scalars['String']>;
23232325
createdAt?: Maybe<Scalars['String']>;
2326+
ec2Instances?: Maybe<Array<Maybe<AwsEc2>>>;
23242327
encryptionConfig?: Maybe<Array<Maybe<AwsEksEncryptionConfig>>>;
23252328
endpoint?: Maybe<Scalars['String']>;
23262329
iamRoles?: Maybe<Array<Maybe<AwsIamRole>>>;
@@ -2335,7 +2338,7 @@ export type AwsEksCluster = {
23352338
resourcesVpcConfig?: Maybe<AwsEksVpcConfigResponse>;
23362339
securityGroups?: Maybe<Array<Maybe<AwsSecurityGroup>>>;
23372340
status?: Maybe<Scalars['String']>;
2338-
subnet?: Maybe<Array<Maybe<AwsSubnet>>>;
2341+
subnets?: Maybe<Array<Maybe<AwsSubnet>>>;
23392342
tags?: Maybe<Array<Maybe<AwsRawTag>>>;
23402343
version?: Maybe<Scalars['String']>;
23412344
vpc?: Maybe<Array<Maybe<AwsVpc>>>;
@@ -2594,6 +2597,7 @@ export type AwsElasticBeanstalkEnv = {
25942597
arn: Scalars['String'];
25952598
cname?: Maybe<Scalars['String']>;
25962599
description?: Maybe<Scalars['String']>;
2600+
ec2Instances?: Maybe<Array<Maybe<AwsEc2>>>;
25972601
elasticBeanstalkApp?: Maybe<Array<Maybe<AwsElasticBeanstalkApp>>>;
25982602
endpointUrl?: Maybe<Scalars['String']>;
25992603
id: Scalars['String'];
@@ -4141,7 +4145,7 @@ export type AwsSubnet = {
41414145
codebuilds?: Maybe<Array<Maybe<AwsCodebuild>>>;
41424146
defaultForAz?: Maybe<Scalars['Boolean']>;
41434147
dmsReplicationInstances?: Maybe<Array<Maybe<AwsDmsReplicationInstance>>>;
4144-
ec2Instance?: Maybe<Array<Maybe<AwsEc2>>>;
4148+
ec2Instances?: Maybe<Array<Maybe<AwsEc2>>>;
41454149
ecsService?: Maybe<Array<Maybe<AwsEcsService>>>;
41464150
efsMountTarget?: Maybe<Array<Maybe<AwsEfsMountTarget>>>;
41474151
eksCluster?: Maybe<Array<Maybe<AwsEksCluster>>>;

0 commit comments

Comments
 (0)