Skip to content

Commit 214287f

Browse files
author
Marco Franceschi
committed
feat: Split up ses service depending on identity type
1 parent 80af943 commit 214287f

20 files changed

Lines changed: 241 additions & 47 deletions

src/enums/schemasMap.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ export default {
103103
[services.sageMakerProject]: 'awsSageMakerProject',
104104
[services.s3]: 'awsS3',
105105
[services.secretsManager]: 'awsSecretsManager',
106-
[services.ses]: 'awsSes',
106+
[services.sesEmail]: 'awsSesEmail',
107+
[services.sesDomain]: 'awsSesDomain',
107108
[services.sns]: 'awsSns',
108109
[services.systemsManagerInstance]: 'awsSystemsManagerInstance',
109110
[services.systemsManagerDocument]: 'awsSystemsManagerDocument',

src/enums/serviceMap.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ import SageMakerProject from '../services/sageMakerProject'
102102
import SecretsManager from '../services/secretsManager'
103103
import AwsSecurityGroup from '../services/securityGroup'
104104
import SecurityHub from '../services/securityHub'
105-
import SES from '../services/ses'
105+
import SESEmail from '../services/sesEmail'
106+
import SESDomain from '../services/sesDomain'
106107
import SNS from '../services/sns'
107108
import SQS from '../services/sqs'
108109
import AwsSubnet from '../services/subnet'
@@ -217,7 +218,8 @@ export default {
217218
[services.s3]: S3,
218219
[services.secretsManager]: SecretsManager,
219220
[services.securityHub]: SecurityHub,
220-
[services.ses]: SES,
221+
[services.sesEmail]: SESEmail,
222+
[services.sesDomain]: SESDomain,
221223
[services.iamAccessAnalyzer]: IamAccessAnalyzer,
222224
[services.iamUser]: IamUser,
223225
[services.iamGroup]: IamGroup,

src/enums/services.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ export default {
101101
s3: 's3',
102102
secretsManager: 'secretsManager',
103103
securityHub: 'securityHub',
104-
ses: 'ses',
104+
sesEmail: 'sesEmail',
105+
sesDomain: 'sesDomain',
105106
sg: 'sg',
106107
sns: 'sns',
107108
sqs: 'sqs',

src/services/account/schema.graphql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ type awsAccount implements awsOptionalService @key(fields: "id") {
102102
systemsManagerDocuments: [awsSystemsManagerDocument]
103103
systemsManagerInstances: [awsSystemsManagerInstance]
104104
systemsManagerParameters: [awsSystemsManagerParameter]
105-
ses: [awsSes]
105+
sesEmail: [awsSesEmail]
106+
sesDomain: [awsSesDomain]
106107
sns: [awsSns]
107108
sqs: [awsSqs]
108109
subnets: [awsSubnet]

src/services/cognitoUserPool/connections.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { isEmpty } from 'lodash'
55
import services from '../../enums/services'
66
import { sesArn } from '../../utils/generateArns'
77
import { RawAwsLambdaFunction } from '../lambda/data'
8-
import { RawAwsSes } from '../ses/data'
8+
import { RawAwsSesEmail } from '../sesEmail/data'
99
import { RawAwsIamRole } from '../iamRole/data'
1010
import { AwsKms } from '../kms/data'
1111

@@ -121,20 +121,20 @@ export default ({
121121
* related to this cognito user pool
122122
*/
123123
const emailConfigSourceArn = emailConfiguration?.SourceArn
124-
const emails = data.find(({ name }) => name === services.ses)
124+
const emails = data.find(({ name }) => name === services.sesEmail)
125125

126126
if (emailConfigSourceArn && emails?.data?.[region]) {
127-
const emailInRegion: RawAwsSes = emails.data[region].find(
128-
({ Identity }: RawAwsSes) =>
129-
emailConfigSourceArn === sesArn({ region, account, email: Identity })
127+
const emailInRegion: RawAwsSesEmail = emails.data[region].find(
128+
({ Identity }: RawAwsSesEmail) =>
129+
emailConfigSourceArn === sesArn({ region, account, identity: Identity })
130130
)
131131

132132
if (emailInRegion) {
133133
connections.push({
134-
id: sesArn({ region, account, email: emailInRegion.Identity }),
135-
resourceType: services.ses,
134+
id: sesArn({ region, account, identity: emailInRegion.Identity }),
135+
resourceType: services.sesEmail,
136136
relation: 'child',
137-
field: 'ses',
137+
field: 'sesEmail',
138138
})
139139
}
140140
}

src/services/cognitoUserPool/schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ type awsCognitoUserPool implements awsBaseService @key(fields: "id") {
122122
lambdas: [awsLambda] @hasInverse(field: cognitoUserPools)
123123
appSync: [awsAppSync] @hasInverse(field: cognitoUserPool)
124124
kms: [awsKms] @hasInverse(field: cognitoUserPools)
125-
ses: [awsSes] @hasInverse(field: cognitoUserPools)
125+
sesEmail: [awsSesEmail] @hasInverse(field: cognitoUserPools)
126126
iamRole: [awsIamRole] @hasInverse(field: cognitoUserPools)
127127
elasticSearchDomains: [awsElasticSearchDomain] @hasInverse(field: cognitoUserPool)
128128
}

src/services/ses/mutation.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/services/ses/schema.graphql

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/services/sesDomain/data.ts

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import SES, {
2+
ListIdentitiesResponse,
3+
IdentityVerificationAttributes,
4+
GetIdentityVerificationAttributesResponse,
5+
} from 'aws-sdk/clients/ses'
6+
import { AWSError } from 'aws-sdk/lib/error'
7+
import { Config } from 'aws-sdk/lib/config'
8+
9+
import CloudGraph from '@cloudgraph/sdk'
10+
import groupBy from 'lodash/groupBy'
11+
import isEmpty from 'lodash/isEmpty'
12+
13+
import awsLoggerText from '../../properties/logger'
14+
import { initTestEndpoint } from '../../utils'
15+
import AwsErrorLog from '../../utils/errorLog'
16+
17+
const lt = { ...awsLoggerText }
18+
const { logger } = CloudGraph
19+
const serviceName = 'SES Domain'
20+
const errorLog = new AwsErrorLog(serviceName)
21+
const endpoint = initTestEndpoint(serviceName)
22+
23+
24+
/**
25+
* SES Domains
26+
*/
27+
export interface RawAwsSesDomain extends IdentityVerificationAttributes {
28+
Identity: string
29+
region: string
30+
}
31+
32+
export default async ({
33+
regions,
34+
config,
35+
}: {
36+
regions: string
37+
config: Config
38+
}): Promise<{ [property: string]: RawAwsSesDomain[] }> =>
39+
new Promise(async resolve => {
40+
const sesData: RawAwsSesDomain[] = []
41+
const regionPromises = []
42+
const identityVerificationPromises = []
43+
44+
regions.split(',').map(region => {
45+
const regionPromise = new Promise<void>(resolveRegion => {
46+
const ses = new SES({ ...config, region, endpoint })
47+
48+
ses.listIdentities(
49+
{ IdentityType: 'Domain' },
50+
(err: AWSError, data: ListIdentitiesResponse) => {
51+
/**
52+
* No Data for the region
53+
*/
54+
if (isEmpty(data)) {
55+
return resolveRegion()
56+
}
57+
58+
if (err) {
59+
errorLog.generateAwsErrorLog({
60+
functionName: 'sesDomain:listIdentities',
61+
err,
62+
})
63+
}
64+
65+
const { Identities }: { Identities: string[] } = data
66+
67+
/**
68+
* No Identities Found
69+
*/
70+
71+
if (isEmpty(Identities)) {
72+
return resolveRegion()
73+
}
74+
75+
logger.debug(lt.fetchedSesIdentities(Identities.length))
76+
77+
const identityVerificationPromise = new Promise<void>(
78+
resolveIdVer => {
79+
ses.getTemplate()
80+
ses.getIdentityVerificationAttributes(
81+
{ Identities },
82+
(
83+
err: AWSError,
84+
{
85+
VerificationAttributes: identities,
86+
}: GetIdentityVerificationAttributesResponse
87+
) => {
88+
if (err) {
89+
errorLog.generateAwsErrorLog({
90+
functionName: 'sesDomain:getIdentityVerificationAttributes',
91+
err,
92+
})
93+
}
94+
95+
if (!isEmpty(identities)) {
96+
sesData.push(
97+
...Identities.map(Identity => ({
98+
99+
Identity,
100+
...identities[Identity],
101+
region,
102+
}))
103+
)
104+
}
105+
106+
resolveIdVer()
107+
resolveRegion()
108+
}
109+
)
110+
ses.listConfigurationSets()
111+
}
112+
)
113+
identityVerificationPromises.push(identityVerificationPromise)
114+
}
115+
)
116+
})
117+
regionPromises.push(regionPromise)
118+
})
119+
120+
await Promise.all(regionPromises)
121+
122+
await Promise.all(identityVerificationPromises)
123+
errorLog.reset()
124+
125+
resolve(groupBy(sesData, 'region'))
126+
})

src/services/sesDomain/format.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { RawAwsSesDomain } from './data'
2+
import { AwsSesDomain } from '../../types/generated'
3+
import { sesArn } from '../../utils/generateArns'
4+
5+
/**
6+
* SES Domain
7+
*/
8+
9+
export default ({
10+
service,
11+
account,
12+
region,
13+
}: {
14+
service: RawAwsSesDomain
15+
account: string
16+
region: string
17+
}): AwsSesDomain => {
18+
const {
19+
Identity: domain,
20+
VerificationStatus: verificationStatus,
21+
} = service
22+
const arn = sesArn({ region, account, identity: domain })
23+
24+
return {
25+
id: arn,
26+
accountId: account,
27+
arn,
28+
region,
29+
domain,
30+
verificationStatus,
31+
}
32+
}

0 commit comments

Comments
 (0)