Skip to content

Commit 9afbfb0

Browse files
author
Marco Franceschi
committed
feat: Included event source mappings for lambda service
1 parent 8e512d1 commit 9afbfb0

4 files changed

Lines changed: 204 additions & 5 deletions

File tree

src/services/lambda/data.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import Lambda, {
99
GetFunctionConcurrencyRequest,
1010
GetFunctionConcurrencyResponse,
1111
ReservedConcurrentExecutions,
12-
GetPolicyResponse
12+
GetPolicyResponse,
13+
ListEventSourceMappingsResponse,
14+
EventSourceMappingConfiguration
1315
} from 'aws-sdk/clients/lambda'
1416
import { AWSError } from 'aws-sdk/lib/error'
1517
import { Config } from 'aws-sdk/lib/config'
@@ -35,6 +37,7 @@ export interface RawAwsLambdaFunction extends FunctionConfiguration {
3537
Policy?: string
3638
RevisionId?: string
3739
}
40+
EventSourceMappings?: EventSourceMappingConfiguration[]
3841
}
3942

4043
const listFunctionsForRegion = async ({
@@ -137,7 +140,7 @@ const getResourceTags = async (lambda: Lambda, arn: string): Promise<TagMap> =>
137140
}
138141
})
139142

140-
const getLambdaPolicy = async (lambda: Lambda, arn: string): Promise<{ Policy?: string; RevisionId?: string }> =>
143+
const getLambdaPolicy = async (lambda: Lambda, arn: string): Promise<{ Policy?: string; RevisionId?: string }> =>
141144
new Promise(resolve => {
142145
try {
143146
lambda.getPolicy(
@@ -159,6 +162,29 @@ const getResourceTags = async (lambda: Lambda, arn: string): Promise<TagMap> =>
159162
}
160163
})
161164

165+
const getEventSourceMappings = async (lambda: Lambda, arn: string): Promise<EventSourceMappingConfiguration[]> =>
166+
new Promise(resolve => {
167+
try {
168+
lambda.listEventSourceMappings(
169+
{ FunctionName: arn },
170+
(err: AWSError, data: ListEventSourceMappingsResponse) => {
171+
if (err) {
172+
errorLog.generateAwsErrorLog({
173+
functionName: 'lambda:listEventSourceMappings',
174+
err,
175+
})
176+
resolve([])
177+
}
178+
const { EventSourceMappings = [] } = data || {}
179+
180+
resolve(EventSourceMappings)
181+
}
182+
)
183+
} catch (error) {
184+
resolve([])
185+
}
186+
})
187+
162188
export default async ({
163189
regions,
164190
config,
@@ -201,14 +227,16 @@ export default async ({
201227
// get all tags and policy for each Lambda
202228
lambdaData.map(({ FunctionArn: arn, region }, idx) => {
203229
const lambda = new Lambda({ ...config, region, endpoint })
204-
const tagsAndPolicyPromise = new Promise<void>(async resolveData => {
230+
const additionalMetadataPromise = new Promise<void>(async resolveData => {
205231
const envTags: TagMap = await getResourceTags(lambda, arn)
206232
lambdaData[idx].Tags = envTags
207233
const policy = await getLambdaPolicy(lambda, arn)
208234
lambdaData[idx].PolicyData = policy
235+
const eventSourceMappings = await getEventSourceMappings(lambda, arn)
236+
lambdaData[idx].EventSourceMappings = eventSourceMappings
209237
resolveData()
210238
})
211-
tagsPromises.push(tagsAndPolicyPromise)
239+
tagsPromises.push(additionalMetadataPromise)
212240
})
213241

214242
logger.debug(lt.gettingLambdaTags)

src/services/lambda/format.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import { generateUniqueId } from '@cloudgraph/sdk'
12
import isEmpty from 'lodash/isEmpty'
23
import t from '../../properties/translations'
3-
import { AwsLambda } from '../../types/generated'
4+
import { AwsLambda, AwsLambdaEventSourceMappings } from '../../types/generated'
45
import { formatTagsFromMap, formatIamJsonPolicy } from '../../utils/format'
56
import { RawAwsLambdaFunction } from './data'
7+
import { EventSourceMappingConfiguration } from 'aws-sdk/clients/lambda'
68

79
/**
810
* Lambda
@@ -33,6 +35,7 @@ export default ({
3335
reservedConcurrentExecutions: rawReservedConcurrentExecutions,
3436
VpcConfig: vpcConfig,
3537
PolicyData: { Policy: policy = '', RevisionId: policyRevisionId = '' },
38+
EventSourceMappings: eventSourceMappings = []
3639
} = rawData
3740
const environmentVariables = []
3841
const secretNames = [t.pass, t.secret, t.private, t.cert]
@@ -68,6 +71,62 @@ export default ({
6871
securityGroupIds: vpcConfig?.SecurityGroupIds,
6972
}
7073

74+
const formatEventSourceMappings = (
75+
eventSourceMappings?: EventSourceMappingConfiguration[]
76+
): AwsLambdaEventSourceMappings[] => {
77+
return (
78+
eventSourceMappings?.map(e => ({
79+
id: generateUniqueId({
80+
arn,
81+
...e,
82+
}),
83+
uuid: e.UUID,
84+
startingPosition: e.StartingPosition,
85+
batchSize: e.BatchSize,
86+
maximumBatchingWindowInSeconds: e.MaximumBatchingWindowInSeconds,
87+
parallelizationFactor: e.ParallelizationFactor,
88+
eventSourceArn: e.EventSourceArn,
89+
filterCriteria: e.FilterCriteria?.Filters?.map(f => f.Pattern) || [],
90+
functionArn: e.FunctionArn,
91+
lastModified: e.LastModified?.toISOString(),
92+
lastProcessingResult: e.LastProcessingResult,
93+
state: e.State,
94+
stateTransitionReason: e.StateTransitionReason,
95+
destinationConfig: {
96+
id: generateUniqueId({
97+
arn,
98+
...e.DestinationConfig,
99+
100+
}),
101+
OnSuccess: e.DestinationConfig?.OnSuccess?.Destination,
102+
OnFailure: e.DestinationConfig?.OnFailure?.Destination
103+
104+
},
105+
topics: e.Topics,
106+
queues: e.Queues,
107+
maximumRecordAgeInSeconds: e.MaximumRecordAgeInSeconds,
108+
bisectBatchOnFunctionError: e.BisectBatchOnFunctionError,
109+
maximumRetryAttempts: e.MaximumRetryAttempts,
110+
tumblingWindowInSeconds: e.TumblingWindowInSeconds,
111+
functionResponseTypes: e.FunctionResponseTypes,
112+
amazonManagedKafkaEventSourceConfig: {
113+
id: generateUniqueId({
114+
arn,
115+
...e.AmazonManagedKafkaEventSourceConfig
116+
}),
117+
consumerGroupId: e.AmazonManagedKafkaEventSourceConfig?.ConsumerGroupId
118+
},
119+
selfManagedKafkaEventSourceConfig: {
120+
id: generateUniqueId({
121+
arn,
122+
...e.SelfManagedKafkaEventSourceConfig
123+
}),
124+
consumerGroupId: e.SelfManagedKafkaEventSourceConfig?.ConsumerGroupId
125+
}
126+
})) || []
127+
)
128+
}
129+
71130
return {
72131
accountId: account,
73132
arn,
@@ -90,5 +149,6 @@ export default ({
90149
rawPolicy: policy,
91150
policy: formatIamJsonPolicy(policy),
92151
tags: formatTagsFromMap(Tags),
152+
eventSourceMappings: formatEventSourceMappings(eventSourceMappings)
93153
}
94154
}

src/services/lambda/schema.graphql

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,67 @@
1+
type awsLambdaEventSourceConfig
2+
@generate(
3+
query: { get: false, query: true, aggregate: false }
4+
mutation: { add: false, delete: false }
5+
subscription: false
6+
) {
7+
id: String! @id
8+
consumerGroupId: String @search(by: [hash, regexp])
9+
}
10+
11+
type awsLambdaSourceAccessConfiguration
12+
@generate(
13+
query: { get: false, query: true, aggregate: false }
14+
mutation: { add: false, delete: false }
15+
subscription: false
16+
) {
17+
id: String! @id
18+
type: String @search(by: [hash, regexp])
19+
uri: String @search(by: [hash, regexp])
20+
}
21+
22+
type awsLambdaDestinationConfig
23+
@generate(
24+
query: { get: false, query: true, aggregate: false }
25+
mutation: { add: false, delete: false }
26+
subscription: false
27+
) {
28+
id: String! @id
29+
OnSuccess: String @search(by: [hash, regexp])
30+
OnFailure: String @search(by: [hash, regexp])
31+
}
32+
33+
type awsLambdaEventSourceMappings
34+
@generate(
35+
query: { get: false, query: true, aggregate: false }
36+
mutation: { add: false, delete: false }
37+
subscription: false
38+
) {
39+
id: String! @id
40+
uuid: String @search(by: [hash, regexp])
41+
startingPosition: String @search(by: [hash, regexp])
42+
batchSize: Int
43+
maximumBatchingWindowInSeconds: Int
44+
parallelizationFactor: Int
45+
eventSourceArn: String @search(by: [hash, regexp])
46+
filterCriteria: [String] @search(by: [hash, regexp])
47+
functionArn: String @search(by: [hash, regexp])
48+
lastModified: DateTime @search(by: [day])
49+
lastProcessingResult: String @search(by: [hash, regexp])
50+
state: String @search(by: [hash, regexp])
51+
stateTransitionReason: String @search(by: [hash, regexp])
52+
destinationConfig: awsLambdaDestinationConfig
53+
topics: [String] @search(by: [hash, regexp])
54+
queues: [String] @search(by: [hash, regexp])
55+
maximumRecordAgeInSeconds: Int
56+
bisectBatchOnFunctionError: Boolean
57+
maximumRetryAttempts: Int
58+
tumblingWindowInSeconds: Int
59+
functionResponseTypes: [String] @search(by: [hash, regexp])
60+
amazonManagedKafkaEventSourceConfig: awsLambdaEventSourceConfig
61+
selfManagedKafkaEventSourceConfig: awsLambdaEventSourceConfig
62+
}
63+
64+
165
type awsLambda implements awsBaseService @key(fields: "arn") {
266
description: String @search(by: [hash, regexp, fulltext])
367
handler: String @search(by: [hash, regexp])
@@ -15,6 +79,7 @@ type awsLambda implements awsBaseService @key(fields: "arn") {
1579
policyRevisionId: String @search(by: [hash, regexp])
1680
rawPolicy: String @search(by: [hash, regexp])
1781
policy: awsIamJSONPolicy
82+
eventSourceMappings: [awsLambdaEventSourceMappings]
1883
tags: [awsRawTag]
1984
kms: [awsKms] @hasInverse(field: lambda)
2085
securityGroups: [awsSecurityGroup] @hasInverse(field: lambda)

src/types/generated.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3410,6 +3410,7 @@ export type AwsLambda = AwsBaseService & {
34103410
cognitoUserPools?: Maybe<Array<Maybe<AwsCognitoUserPool>>>;
34113411
description?: Maybe<Scalars['String']>;
34123412
environmentVariables?: Maybe<Array<Maybe<AwsLambdaEnvironmentVariable>>>;
3413+
eventSourceMappings?: Maybe<Array<Maybe<AwsLambdaEventSourceMappings>>>;
34133414
handler?: Maybe<Scalars['String']>;
34143415
iamRole?: Maybe<Array<Maybe<AwsIamRole>>>;
34153416
kms?: Maybe<Array<Maybe<AwsKms>>>;
@@ -3434,12 +3435,57 @@ export type AwsLambda = AwsBaseService & {
34343435
vpcConfig?: Maybe<AwsLambdaVpcConfig>;
34353436
};
34363437

3438+
export type AwsLambdaDestinationConfig = {
3439+
OnFailure?: Maybe<Scalars['String']>;
3440+
OnSuccess?: Maybe<Scalars['String']>;
3441+
id: Scalars['String'];
3442+
};
3443+
34373444
export type AwsLambdaEnvironmentVariable = {
34383445
id: Scalars['String'];
34393446
key: Scalars['String'];
34403447
value?: Maybe<Scalars['String']>;
34413448
};
34423449

3450+
export type AwsLambdaEventSourceConfig = {
3451+
consumerGroupId?: Maybe<Scalars['String']>;
3452+
id: Scalars['String'];
3453+
};
3454+
3455+
export type AwsLambdaEventSourceMappings = {
3456+
amazonManagedKafkaEventSourceConfig?: Maybe<AwsLambdaEventSourceConfig>;
3457+
batchSize?: Maybe<Scalars['Int']>;
3458+
bisectBatchOnFunctionError?: Maybe<Scalars['Boolean']>;
3459+
destinationConfig?: Maybe<AwsLambdaDestinationConfig>;
3460+
eventSourceArn?: Maybe<Scalars['String']>;
3461+
filterCriteria?: Maybe<Array<Maybe<Scalars['String']>>>;
3462+
functionArn?: Maybe<Scalars['String']>;
3463+
functionResponseTypes?: Maybe<Array<Maybe<Scalars['String']>>>;
3464+
id: Scalars['String'];
3465+
lastModified?: Maybe<Scalars['DateTime']>;
3466+
lastProcessingResult?: Maybe<Scalars['String']>;
3467+
maximumBatchingWindowInSeconds?: Maybe<Scalars['Int']>;
3468+
maximumRecordAgeInSeconds?: Maybe<Scalars['Int']>;
3469+
maximumRetryAttempts?: Maybe<Scalars['Int']>;
3470+
parallelizationFactor?: Maybe<Scalars['Int']>;
3471+
queues?: Maybe<Array<Maybe<Scalars['String']>>>;
3472+
selfManagedEventSource?: Maybe<Array<Maybe<Scalars['String']>>>;
3473+
selfManagedKafkaEventSourceConfig?: Maybe<AwsLambdaEventSourceConfig>;
3474+
sourceAccessConfigurations?: Maybe<Array<Maybe<AwsLambdaSourceAccessConfiguration>>>;
3475+
startingPosition?: Maybe<Scalars['String']>;
3476+
state?: Maybe<Scalars['String']>;
3477+
stateTransitionReason?: Maybe<Scalars['String']>;
3478+
topics?: Maybe<Array<Maybe<Scalars['String']>>>;
3479+
tumblingWindowInSeconds?: Maybe<Scalars['Int']>;
3480+
uuid?: Maybe<Scalars['String']>;
3481+
};
3482+
3483+
export type AwsLambdaSourceAccessConfiguration = {
3484+
id: Scalars['String'];
3485+
type?: Maybe<Scalars['String']>;
3486+
uri?: Maybe<Scalars['String']>;
3487+
};
3488+
34433489
export type AwsLambdaVpcConfig = {
34443490
securityGroupIds?: Maybe<Array<Maybe<Scalars['String']>>>;
34453491
subnetIds?: Maybe<Array<Maybe<Scalars['String']>>>;

0 commit comments

Comments
 (0)