Skip to content

Commit 71999cd

Browse files
committed
WIP on moving tenant service private calls to async events
1 parent 7d100ef commit 71999cd

File tree

12 files changed

+374
-349
lines changed

12 files changed

+374
-349
lines changed

functions/onboarding-app-stack-listener/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/OnboardingAppStackListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public Object handleRequest(SNSEvent event, Context context) {
136136
// The update tenant resources API call is additive, so we don't need to pull the
137137
// current tenant object ourselves.
138138
Utils.publishEvent(eventBridge, SAAS_BOOST_EVENT_BUS, EVENT_SOURCE,
139-
"Tenant Resources Updated",
139+
"Tenant Resources Changed",
140140
Map.of("tenantId", tenantId, "resources", Utils.toJson(tenantResource))
141141
);
142142
}

functions/onboarding-stack-listener/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/OnboardingStackListener.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public OnboardingStackListener() {
6767

6868
@Override
6969
public Object handleRequest(SNSEvent event, Context context) {
70-
LOGGER.info(Utils.toJson(event));
70+
//LOGGER.info(Utils.toJson(event));
7171

7272
List<SNSEvent.SNSRecord> records = event.getRecords();
7373
SNSEvent.SNS sns = records.get(0).getSNS();
@@ -79,6 +79,7 @@ public Object handleRequest(SNSEvent event, Context context) {
7979
// We want to process the resources of the tenant-onboarding.yaml CloudFormation stack only after the
8080
// stack has finished being created or updated so we don't trigger anything downstream prematurely.
8181
if (filter(cloudFormationEvent)) {
82+
LOGGER.info(Utils.toJson(event));
8283
String stackName = cloudFormationEvent.getStackName();
8384
String stackStatus = cloudFormationEvent.getResourceStatus();
8485
String stackId = cloudFormationEvent.getStackId();
@@ -124,7 +125,7 @@ public Object handleRequest(SNSEvent event, Context context) {
124125
}
125126
}
126127
// Fire a tenant hostname changed event
127-
Utils.publishEvent(eventBridge, SAAS_BOOST_EVENT_BUS, EVENT_SOURCE, "TENANT_HOSTNAME_CHANGE",
128+
Utils.publishEvent(eventBridge, SAAS_BOOST_EVENT_BUS, EVENT_SOURCE, "Tenant Hostname Changed",
128129
Map.of("tenantId", tenantId, "hostname", hostname));
129130
} catch (SdkServiceException cfnError) {
130131
LOGGER.error("cfn:DescribeStacks error", cfnError);
@@ -238,7 +239,7 @@ public Object handleRequest(SNSEvent event, Context context) {
238239
// Fire a tenant resources updated event
239240
LOGGER.info("Updating tenant resources AWS console links");
240241
Utils.publishEvent(eventBridge, SAAS_BOOST_EVENT_BUS, EVENT_SOURCE,
241-
"Tenant Resources Updated",
242+
"Tenant Resources Changed",
242243
Map.of("tenantId", tenantId, "resources", Utils.toJson(tenantResources))
243244
);
244245

resources/saas-boost-private-api.yaml

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ Parameters:
4343
TenantServiceGetProvisioned:
4444
Description: Tenant Service get provisioned tenants Lambda ARN
4545
Type: String
46-
TenantServiceUpdateOnboarding:
47-
Description: Tenant Service update tenant onboarding status Lambda ARN
48-
Type: String
4946
OnboardingUpdateAppConfig:
5047
Description: Onboarding Service update application config Lambda ARN
5148
Type: String
@@ -184,12 +181,6 @@ Resources:
184181
RestApiId: !Ref PrivateApi
185182
ParentId: !Ref TenantServiceResource
186183
PathPart: '{id}'
187-
TenantServiceTenantOnboardingResource:
188-
Type: AWS::ApiGateway::Resource
189-
Properties:
190-
RestApiId: !Ref PrivateApi
191-
ParentId: !Ref TenantServiceByIdResource
192-
PathPart: 'onboarding'
193184
TenantServiceGetByIdMethod:
194185
Type: AWS::ApiGateway::Method
195186
Properties:
@@ -348,62 +339,6 @@ Resources:
348339
method.response.header.Access-Control-Allow-Origin: false
349340
method.response.header.Access-Control-Max-Age: false
350341
method.response.header.X-Requested-With: false
351-
TenantServiceTenantOnboardingUpdateMethod:
352-
Type: AWS::ApiGateway::Method
353-
Properties:
354-
RestApiId: !Ref PrivateApi
355-
ResourceId: !Ref TenantServiceTenantOnboardingResource
356-
HttpMethod: PUT
357-
AuthorizationType: AWS_IAM
358-
RequestParameters: {method.request.path.id: true}
359-
Integration:
360-
Type: AWS_PROXY
361-
IntegrationHttpMethod: POST
362-
Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${TenantServiceUpdateOnboarding}/invocations
363-
PassthroughBehavior: WHEN_NO_MATCH
364-
RequestParameters: {integration.request.path.id: 'method.request.path.id'}
365-
MethodResponses:
366-
- StatusCode: '200'
367-
ResponseModels: {application/json: Empty}
368-
ResponseParameters:
369-
method.response.header.Access-Control-Allow-Origin: false
370-
TenantServiceUpdateOnboardingLambdaPermission:
371-
Type: AWS::Lambda::Permission
372-
Properties:
373-
Principal: apigateway.amazonaws.com
374-
Action: lambda:InvokeFunction
375-
FunctionName: !Ref TenantServiceUpdateOnboarding
376-
SourceArn: !Sub arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${PrivateApi}/*/PUT/tenants/{id}/onboarding
377-
TenantServiceTenantOnboardingResourceCORS:
378-
Type: AWS::ApiGateway::Method
379-
Properties:
380-
RestApiId: !Ref PrivateApi
381-
ResourceId: !Ref TenantServiceTenantOnboardingResource
382-
HttpMethod: OPTIONS
383-
AuthorizationType: NONE
384-
Integration:
385-
Type: MOCK
386-
PassthroughBehavior: WHEN_NO_MATCH
387-
IntegrationResponses:
388-
- StatusCode: '200'
389-
ResponseTemplates: {application/json: ''}
390-
ResponseParameters:
391-
method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
392-
method.response.header.Access-Control-Allow-Methods: "'PUT,OPTIONS'"
393-
method.response.header.Access-Control-Allow-Origin: "'*'"
394-
method.response.header.Access-Control-Max-Age: "'3600'"
395-
method.response.header.X-Requested-With: "'*'"
396-
RequestTemplates:
397-
application/json: '{"statusCode": 200}'
398-
MethodResponses:
399-
- StatusCode: '200'
400-
ResponseModels: {application/json: Empty}
401-
ResponseParameters:
402-
method.response.header.Access-Control-Allow-Headers: false
403-
method.response.header.Access-Control-Allow-Methods: false
404-
method.response.header.Access-Control-Allow-Origin: false
405-
method.response.header.Access-Control-Max-Age: false
406-
method.response.header.X-Requested-With: false
407342
OnboardingServiceResource:
408343
Type: AWS::ApiGateway::Resource
409344
Properties:
@@ -1015,8 +950,6 @@ Resources:
1015950
- TenantServiceGetByIdMethod
1016951
- TenantServiceInsertMethod
1017952
- TenantServiceResourceCORS
1018-
- TenantServiceTenantOnboardingUpdateMethod
1019-
- TenantServiceTenantOnboardingResourceCORS
1020953
- OnboardingServiceUpdateAppConfigMethod
1021954
- OnboardingServiceUpdateAppConfigResourceCORS
1022955
- SettingsServiceGetAllMethod

resources/saas-boost-svc-tenant.yaml

Lines changed: 30 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -218,37 +218,6 @@ Resources:
218218
Value: !Ref Environment
219219
- Key: "BoostService"
220220
Value: "Tenant"
221-
TenantServiceUpdateOnboardingLogs:
222-
Type: AWS::Logs::LogGroup
223-
Properties:
224-
LogGroupName: !Sub /aws/lambda/sb-${Environment}-tenants-update-onboarding
225-
RetentionInDays: 30
226-
TenantServiceUpdateOnboarding:
227-
Type: AWS::Lambda::Function
228-
Properties:
229-
FunctionName: !Sub sb-${Environment}-tenants-update-onboarding
230-
Role: !GetAtt TenantServiceExecutionRole.Arn
231-
Runtime: java11
232-
Timeout: 300
233-
MemorySize: 512
234-
Handler: com.amazon.aws.partners.saasfactory.saasboost.TenantService::updateTenantOnboarding
235-
Code:
236-
S3Bucket: !Ref SaaSBoostBucket
237-
S3Key: !Sub ${LambdaSourceFolder}/TenantService-lambda.zip
238-
Layers:
239-
- !Ref SaaSBoostUtilsLayer
240-
Environment:
241-
Variables:
242-
SAAS_BOOST_ENV: !Ref Environment
243-
SAAS_BOOST_EVENT_BUS: !Ref SaaSBoostEventBus
244-
TENANTS_TABLE: !Ref TenantsTable
245-
Tags:
246-
- Key: "Application"
247-
Value: "SaaSBoost"
248-
- Key: "Environment"
249-
Value: !Ref Environment
250-
- Key: "BoostService"
251-
Value: "Tenant"
252221
TenantServiceInsertLogs:
253222
Type: AWS::Logs::LogGroup
254223
Properties:
@@ -373,59 +342,63 @@ Resources:
373342
Value: !Ref Environment
374343
- Key: "BoostService"
375344
Value: "Tenant"
376-
TenantServiceUpdateResourcesLogGroup:
345+
TenantServiceEventHandlerLogs:
377346
Type: AWS::Logs::LogGroup
378347
Properties:
379-
LogGroupName: !Sub /aws/lambda/sb-${Environment}-tenants-update-resources
348+
LogGroupName: !Sub /aws/lambda/sb-${Environment}-tenant-events
380349
RetentionInDays: 30
381-
TenantServiceUpdateResourcesFunction:
350+
TenantServiceEventHandler:
382351
Type: AWS::Lambda::Function
383352
Properties:
384-
FunctionName: !Sub sb-${Environment}-tenants-update-resources
353+
FunctionName: !Sub sb-${Environment}-tenant-events
354+
Role: !GetAtt TenantServiceExecutionRole.Arn
385355
Runtime: java11
386-
Timeout: 300
387-
MemorySize: 384
388-
Environment:
389-
Variables:
390-
SAAS_BOOST_ENV: !Ref Environment
391-
SAAS_BOOST_EVENT_BUS: !Ref SaaSBoostEventBus
392-
TENANTS_TABLE: !Ref TenantsTable
393-
Handler: com.amazon.aws.partners.saasfactory.saasboost.TenantService::updateTenantResources
356+
Timeout: 45
357+
MemorySize: 512
358+
Handler: com.amazon.aws.partners.saasfactory.saasboost.TenantService::handleTenantEvent
394359
Code:
395360
S3Bucket: !Ref SaaSBoostBucket
396361
S3Key: !Sub ${LambdaSourceFolder}/TenantService-lambda.zip
397362
Layers:
398363
- !Ref SaaSBoostUtilsLayer
399-
Role: !GetAtt TenantServiceExecutionRole.Arn
364+
- !Ref ApiGatewayHelperLayer
365+
Environment:
366+
Variables:
367+
SAAS_BOOST_ENV: !Ref Environment
368+
TENANTS_TABLE: !Ref TenantsTable
369+
SAAS_BOOST_EVENT_BUS: !Ref SaaSBoostEventBus
400370
Tags:
401371
- Key: "Application"
402372
Value: "SaaSBoost"
403373
- Key: "Environment"
404374
Value: !Ref Environment
405375
- Key: "BoostService"
406-
Value: "Tenant"
407-
TenantServiceUpdateResourcesEventRule:
376+
TenantServiceEventRule:
408377
Type: AWS::Events::Rule
409378
Properties:
410-
Name: !Sub sb-${Environment}-tenant-update-resources
411-
Description: Tenant's provisioned resources changed
379+
Name: !Sub sb-${Environment}-tenant-events
380+
Description: SaaS Boost tenant events
412381
EventBusName: !Ref SaaSBoostEventBus
413382
EventPattern:
414-
detail-type:
415-
- Tenant Resources Updated
416-
source:
417-
- saas-boost
383+
{
384+
"source": [
385+
"saas-boost"
386+
],
387+
"detail-type": [{
388+
"prefix": "Tenant "
389+
}]
390+
}
418391
State: ENABLED
419392
Targets:
420-
- Arn: !GetAtt TenantServiceUpdateResourcesFunction.Arn
421-
Id: TenantServiceUpdateResourcesFunction
422-
TenantServiceUpdateResourcesFunctionPermission:
393+
- Arn: !GetAtt TenantServiceEventHandler.Arn
394+
Id: !Sub sb-${Environment}-tenant-events
395+
TenantServiceEventsPermission:
423396
Type: AWS::Lambda::Permission
424397
Properties:
425398
Action: lambda:InvokeFunction
426-
FunctionName: !GetAtt TenantServiceUpdateResourcesFunction.Arn
399+
FunctionName: !Ref TenantServiceEventHandler
427400
Principal: events.amazonaws.com
428-
SourceArn: !GetAtt TenantServiceUpdateResourcesEventRule.Arn
401+
SourceArn: !GetAtt TenantServiceEventRule.Arn
429402
Outputs:
430403
TenantServiceGetAllArn:
431404
Description: Tenant Service get all tenants Lambda ARN
@@ -451,7 +424,4 @@ Outputs:
451424
TenantServiceDisableArn:
452425
Description: Tenant Service disable tenant Lambda ARN
453426
Value: !GetAtt TenantServiceDisable.Arn
454-
TenantServiceUpdateOnboardingArn:
455-
Description: Tenant Service update tenant onboarding status Lambda ARN
456-
Value: !GetAtt TenantServiceUpdateOnboarding.Arn
457427
...

resources/saas-boost.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ Resources:
760760
TenantServiceInsert: !GetAtt tenant.Outputs.TenantServiceInsertArn
761761
TenantServiceGetAll: !GetAtt tenant.Outputs.TenantServiceGetAllArn
762762
TenantServiceGetProvisioned: !GetAtt tenant.Outputs.TenantServiceGetProvisionedArn
763-
TenantServiceUpdateOnboarding: !GetAtt tenant.Outputs.TenantServiceUpdateOnboardingArn
764763
OnboardingUpdateAppConfig: !GetAtt onboarding.Outputs.OnboardingUpdateAppConfigArn
765764
SettingsServiceGetAll: !GetAtt settings.Outputs.SettingsServiceGetAllArn
766765
SettingsServiceGetSecret: !GetAtt settings.Outputs.SettingsServiceGetSecretArn

services/onboarding-service/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/OnboardingEvent.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
package com.amazon.aws.partners.saasfactory.saasboost;
1818

19+
import java.util.Map;
20+
import java.util.UUID;
21+
1922
// TODO Make a marker interface of SaaSBoostEvent?
2023
public enum OnboardingEvent {
2124
ONBOARDING_INITIATED("Onboarding Initiated"),
@@ -50,4 +53,35 @@ public static OnboardingEvent fromDetailType(String detailType) {
5053
}
5154
return event;
5255
}
56+
57+
public static boolean validate(Map<String, Object> event) {
58+
return validate(event, null);
59+
}
60+
61+
public static boolean validate(Map<String, Object> event, String... requiredKeys) {
62+
if (event == null || !event.containsKey("detail")) {
63+
return false;
64+
}
65+
try {
66+
Map<String, Object> detail = (Map<String, Object>) event.get("detail");
67+
if (detail == null || !detail.containsKey("onboardingId")) {
68+
return false;
69+
}
70+
try {
71+
UUID.fromString(String.valueOf(detail.get("onboardingId")));
72+
} catch (IllegalArgumentException iae) {
73+
return false;
74+
}
75+
if (requiredKeys != null) {
76+
for (String requiredKey : requiredKeys) {
77+
if (!detail.containsKey(requiredKey)) {
78+
return false;
79+
}
80+
}
81+
}
82+
} catch (ClassCastException cce) {
83+
return false;
84+
}
85+
return true;
86+
}
5387
}

0 commit comments

Comments
 (0)