From 9fe78679c719f1a1121021c7e82f3dd213d098b6 Mon Sep 17 00:00:00 2001 From: Nicolas Moutschen Date: Thu, 18 Jun 2020 18:48:15 +0200 Subject: [PATCH] platform: add websockets based listener --- delivery/template.yaml | 19 +- delivery/tests/integ/test_events.py | 40 +-- orders/template.yaml | 17 -- orders/tests/integ/test_events.py | 87 ++---- orders/tests/integ/test_on_events.py | 158 ++++------- platform/Makefile | 4 +- platform/README.md | 19 ++ platform/images/platform.png | Bin 0 -> 198324 bytes platform/metadata.yaml | 4 +- platform/src/on_connect/main.py | 57 ++++ platform/src/on_connect/requirements.txt | 3 + platform/src/on_disconnect/main.py | 57 ++++ platform/src/on_disconnect/requirements.txt | 3 + platform/src/on_events/main.py | 80 ++++++ platform/src/on_events/requirements.txt | 2 + platform/src/register/main.py | 78 +++++ platform/src/register/requirements.txt | 3 + platform/template.yaml | 300 +++++++++++++++++++- platform/tests/integ/test_on_events.py | 48 ++++ platform/tests/unit/test_on_connect.py | 82 ++++++ platform/tests/unit/test_on_disconnect.py | 82 ++++++ platform/tests/unit/test_on_events.py | 114 ++++++++ platform/tests/unit/test_register.py | 149 ++++++++++ products/template.yaml | 19 +- products/tests/integ/test_events.py | 44 +-- requirements.txt | 3 +- shared/templates/listener.yaml | 56 ---- shared/tests/integ/fixtures.py | 142 ++++++--- users/template.yaml | 19 +- users/tests/integ/test_events.py | 95 +++---- warehouse/template.yaml | 19 +- warehouse/tests/integ/test_events.py | 23 +- 32 files changed, 1335 insertions(+), 491 deletions(-) create mode 100644 platform/README.md create mode 100644 platform/images/platform.png create mode 100644 platform/src/on_connect/main.py create mode 100644 platform/src/on_connect/requirements.txt create mode 100644 platform/src/on_disconnect/main.py create mode 100644 platform/src/on_disconnect/requirements.txt create mode 100644 platform/src/on_events/main.py create mode 100644 platform/src/on_events/requirements.txt create mode 100644 platform/src/register/main.py create mode 100644 platform/src/register/requirements.txt create mode 100644 platform/tests/integ/test_on_events.py create mode 100644 platform/tests/unit/test_on_connect.py create mode 100644 platform/tests/unit/test_on_disconnect.py create mode 100644 platform/tests/unit/test_on_events.py create mode 100644 platform/tests/unit/test_register.py delete mode 100644 shared/templates/listener.yaml diff --git a/delivery/template.yaml b/delivery/template.yaml index b852fd8..a780ef7 100644 --- a/delivery/template.yaml +++ b/delivery/template.yaml @@ -41,10 +41,6 @@ Globals: LOG_LEVEL: !Ref LogLevel -Conditions: - IsNotProd: !Not [!Equals [!Ref Environment, prod]] - - Resources: ######### # TABLE # @@ -159,17 +155,4 @@ Resources: DeadLetterQueue: Type: AWS::CloudFormation::Stack Properties: - TemplateURL: ../../shared/templates/dlq.yaml - - ############ - # LISTENER # - ############ - Listener: - Type: AWS::CloudFormation::Stack - Condition: IsNotProd - Properties: - TemplateURL: ../../shared/templates/listener.yaml - Parameters: - Environment: !Ref Environment - EventBusName: !Ref EventBusName - ServiceName: "delivery" \ No newline at end of file + TemplateURL: ../../shared/templates/dlq.yaml \ No newline at end of file diff --git a/delivery/tests/integ/test_events.py b/delivery/tests/integ/test_events.py index f8a91b2..4dd0cba 100644 --- a/delivery/tests/integ/test_events.py +++ b/delivery/tests/integ/test_events.py @@ -45,21 +45,13 @@ def test_table_update_completed(table_name, listener, order): # Set the item to COMPLETED order["status"] = "COMPLETED" - table.put_item(Item=order) - - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("delivery") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"]: - found = True - assert body["detail-type"] == "DeliveryCompleted" - assert found == True + # Listen for messages on EventBridge + listener( + "ecommerce.delivery", + lambda: table.put_item(Item=order), + lambda m: order["orderId"] in m["resources"] and m["detail-type"] == "DeliveryCompleted" + ) # Delete the item table.delete_item(Key={"orderId": order["orderId"]}) @@ -76,19 +68,9 @@ def test_table_update_failed(table_name, listener, order): order["status"] = "NEW" table.put_item(Item=order) - # Delete the item - table.delete_item(Key={"orderId": order["orderId"]}) - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("delivery") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"]: - found = True - assert body["detail-type"] == "DeliveryFailed" - - assert found == True \ No newline at end of file + listener( + "ecommerce.delivery", + lambda: table.delete_item(Key={"orderId": order["orderId"]}), + lambda m: order["orderId"] in m["resources"] and m["detail-type"] == "DeliveryFailed" + ) \ No newline at end of file diff --git a/orders/template.yaml b/orders/template.yaml index fad5e4f..d1ca7c9 100644 --- a/orders/template.yaml +++ b/orders/template.yaml @@ -53,10 +53,6 @@ Globals: LOG_LEVEL: !Ref LogLevel -Conditions: - IsNotProd: !Not [!Equals [!Ref Environment, prod]] - - Resources: ######### # TABLE # @@ -286,19 +282,6 @@ Resources: Parameters: AlarmAction: !Ref AlarmTopic - ############ - # LISTENER # - ############ - Listener: - Type: AWS::CloudFormation::Stack - Condition: IsNotProd - Properties: - TemplateURL: ../../shared/templates/listener.yaml - Parameters: - Environment: !Ref Environment - EventBusName: !Ref EventBusName - ServiceName: "orders" - ############# # DASHBOARD # ############# diff --git a/orders/tests/integ/test_events.py b/orders/tests/integ/test_events.py index b4a47a0..92c260f 100644 --- a/orders/tests/integ/test_events.py +++ b/orders/tests/integ/test_events.py @@ -26,66 +26,37 @@ def test_table_update(table_name, listener, order): Test that the TableUpdate function reacts to changes to DynamoDB and sends events to EventBridge """ - # Add a new item table = boto3.resource("dynamodb").Table(table_name) # pylint: disable=no-member - table.put_item(Item=order) - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("orders") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"]: - found = True - assert body["detail-type"] == "OrderCreated" - - assert found == True - - # Change the status to cancelled - table.update_item( - Key={"orderId": order["orderId"]}, - UpdateExpression="set #s = :s", - ExpressionAttributeNames={ - "#s": "status" - }, - ExpressionAttributeValues={ - ":s": "CANCELLED" - } + # Listen for messages on EventBridge + listener( + "ecommerce.orders", + # Add a new item + lambda: table.put_item(Item=order), + lambda m: order["orderId"] in m["resources"] and m["detail-type"] == "OrderCreated" ) - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("orders") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"]: - found = True - assert body["detail-type"] == "OrderModified" - detail = body["detail"] - assert "changed" in detail - assert "status" in detail["changed"] - - assert found == True - - # Delete the item - table.delete_item(Key={"orderId": order["orderId"]}) - - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("orders") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"]: - found = True - assert body["detail-type"] == "OrderDeleted" + # Listen for messages on EventBridge + listener( + "ecommerce.orders", + # Change the status to cancelled + lambda: table.update_item( + Key={"orderId": order["orderId"]}, + UpdateExpression="set #s = :s", + ExpressionAttributeNames={ + "#s": "status" + }, + ExpressionAttributeValues={ + ":s": "CANCELLED" + } + ), + lambda m: order["orderId"] in m["resources"] and m["detail-type"] == "OrderModified" + ) - assert found == True \ No newline at end of file + # Listen for messages on EventBridge + listener( + "ecommerce.orders", + # Delete the item + lambda: table.delete_item(Key={"orderId": order["orderId"]}), + lambda m: order["orderId"] in m["resources"] and m["detail-type"] == "OrderDeleted" + ) \ No newline at end of file diff --git a/orders/tests/integ/test_on_events.py b/orders/tests/integ/test_on_events.py index de1edf9..1967f0a 100644 --- a/orders/tests/integ/test_on_events.py +++ b/orders/tests/integ/test_on_events.py @@ -51,29 +51,19 @@ def test_on_package_created(order, listener, table_name, event_bus_name): "Detail": json.dumps(order), "EventBusName": event_bus_name } - eventbridge.put_events(Entries=[event]) - - # Wait - time.sleep(5) - - # Check the DynamoDB table - response = table.get_item(Key={"orderId": order["orderId"]}) - assert "Item" in response - assert "status" in response["Item"] - assert response["Item"]["status"] == "PACKAGED" # Check events - messages = listener("orders", 5) - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"] and body["detail-type"] == "OrderModified": - found = True - assert "status" in body["detail"]["changed"] - assert "products" not in body["detail"]["changed"] - assert body["detail"]["new"]["status"] == "PACKAGED" - assert found == True + listener( + "ecommerce.orders", + lambda: eventbridge.put_events(Entries=[event]), + lambda m: ( + order["orderId"] in m["resources"] and + m["detail-type"] == "OrderModified" and + "status" in m["detail"]["changed"] and + "products" not in m["detail"]["changed"] and + m["detail"]["new"]["status"] == "PACKAGED" + ) + ) # Clean up table.delete_item(Key={"orderId": order["orderId"]}) @@ -102,31 +92,19 @@ def test_on_package_created_products(order, listener, table_name, event_bus_name "Detail": json.dumps(package_order), "EventBusName": event_bus_name } - eventbridge.put_events(Entries=[event]) - - # Wait - time.sleep(5) - - # Check the DynamoDB table - response = table.get_item(Key={"orderId": order["orderId"]}) - assert "Item" in response - assert "status" in response["Item"] - assert response["Item"]["status"] == "PACKAGED" - assert len(response["Item"]["products"]) == len(package_order["products"]) - assert removed_product["productId"] not in [p["productId"] for p in response["Item"]["products"]] # Check events - messages = listener("orders", 5) - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"] and body["detail-type"] == "OrderModified": - found = True - assert "status" in body["detail"]["changed"] - assert "products" in body["detail"]["changed"] - assert body["detail"]["new"]["status"] == "PACKAGED" - assert found == True + listener( + "ecommerce.orders", + lambda: eventbridge.put_events(Entries=[event]), + lambda m: ( + order["orderId"] in m["resources"] and + m["detail-type"] == "OrderModified" and + "status" in m["detail"]["changed"] and + "products" in m["detail"]["changed"] and + m["detail"]["new"]["status"] == "PACKAGED" + ) + ) # Clean up table.delete_item(Key={"orderId": order["orderId"]}) @@ -152,28 +130,18 @@ def test_on_packaging_failed(order, listener, table_name, event_bus_name): "Detail": json.dumps(order), "EventBusName": event_bus_name } - eventbridge.put_events(Entries=[event]) - - # Wait - time.sleep(5) - - # Check the DynamoDB table - response = table.get_item(Key={"orderId": order["orderId"]}) - assert "Item" in response - assert "status" in response["Item"] - assert response["Item"]["status"] == "PACKAGING_FAILED" - + # Check events - messages = listener("orders", 5) - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"] and body["detail-type"] == "OrderModified": - found = True - assert "status" in body["detail"]["changed"] - assert body["detail"]["new"]["status"] == "PACKAGING_FAILED" - assert found == True + listener( + "ecommerce.orders", + lambda: eventbridge.put_events(Entries=[event]), + lambda m: ( + order["orderId"] in m["resources"] and + m["detail-type"] == "OrderModified" and + "status" in m["detail"]["changed"] and + m["detail"]["new"]["status"] == "PACKAGING_FAILED" + ) + ) # Clean up table.delete_item(Key={"orderId": order["orderId"]}) @@ -199,28 +167,18 @@ def test_on_delivery_completed(order, listener, table_name, event_bus_name): "Detail": json.dumps(order), "EventBusName": event_bus_name } - eventbridge.put_events(Entries=[event]) - - # Wait - time.sleep(5) - - # Check the DynamoDB table - response = table.get_item(Key={"orderId": order["orderId"]}) - assert "Item" in response - assert "status" in response["Item"] - assert response["Item"]["status"] == "FULFILLED" # Check events - messages = listener("orders", 5) - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"] and body["detail-type"] == "OrderModified": - found = True - assert "status" in body["detail"]["changed"] - assert body["detail"]["new"]["status"] == "FULFILLED" - assert found == True + listener( + "ecommerce.orders", + lambda: eventbridge.put_events(Entries=[event]), + lambda m: ( + order["orderId"] in m["resources"] and + m["detail-type"] == "OrderModified" and + "status" in m["detail"]["changed"] and + m["detail"]["new"]["status"] == "FULFILLED" + ) + ) # Clean up table.delete_item(Key={"orderId": order["orderId"]}) @@ -246,28 +204,18 @@ def test_on_delivery_failed(order, listener, table_name, event_bus_name): "Detail": json.dumps(order), "EventBusName": event_bus_name } - eventbridge.put_events(Entries=[event]) - - # Wait - time.sleep(5) - - # Check the DynamoDB table - response = table.get_item(Key={"orderId": order["orderId"]}) - assert "Item" in response - assert "status" in response["Item"] - assert response["Item"]["status"] == "DELIVERY_FAILED" # Check events - messages = listener("orders", 5) - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if order["orderId"] in body["resources"] and body["detail-type"] == "OrderModified": - found = True - assert "status" in body["detail"]["changed"] - assert body["detail"]["new"]["status"] == "DELIVERY_FAILED" - assert found == True + listener( + "ecommerce.orders", + lambda: eventbridge.put_events(Entries=[event]), + lambda m: ( + order["orderId"] in m["resources"] and + m["detail-type"] == "OrderModified" and + "status" in m["detail"]["changed"] and + m["detail"]["new"]["status"] == "DELIVERY_FAILED" + ) + ) # Clean up table.delete_item(Key={"orderId": order["orderId"]}) \ No newline at end of file diff --git a/platform/Makefile b/platform/Makefile index 880afde..0937551 100644 --- a/platform/Makefile +++ b/platform/Makefile @@ -9,6 +9,7 @@ artifacts: build: @${ROOT}/tools/build resources ${SERVICE} @${ROOT}/tools/build openapi ${SERVICE} + @${ROOT}/tools/build python3 ${SERVICE} @${ROOT}/tools/build cloudformation ${SERVICE} .PHONY: build @@ -23,6 +24,7 @@ deploy: lint: @${ROOT}/tools/lint cloudformation ${SERVICE} + @${ROOT}/tools/lint python3 ${SERVICE} @${ROOT}/tools/lint openapi ${SERVICE} package: @@ -35,4 +37,4 @@ tests-integ: @${ROOT}/tools/tests-integ cloudformation ${SERVICE} tests-unit: - @echo "Skipping unit tests" \ No newline at end of file + @${ROOT}/tools/tests-unit python3 ${SERVICE} \ No newline at end of file diff --git a/platform/README.md b/platform/README.md new file mode 100644 index 0000000..0d437b4 --- /dev/null +++ b/platform/README.md @@ -0,0 +1,19 @@ +Platform service +================ + +![Platform architecture diagram](images/platform.png) + +## API + +_This service does not expose a REST API_ + +## Events + +_This service does not emit any event_ + +## SSM Parameters + +This service defines the following SSM parameters: + +* `/ecommerce/{Environment}/platform/event-bus/name`: Event Bus Name +* `/ecommerce/{Environment}/platform/listener-api/url`: URL for the WebSocket Listener API diff --git a/platform/images/platform.png b/platform/images/platform.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7e1ef27adfa72351e9278c1af896f389ddc6e3 GIT binary patch literal 198324 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�R{Y%i=9+Z5s3 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%0A8`k(e0RaMU9u{tG@KDt0r(y;u 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 List[str]: + """ + Retrieve connection IDs for a service name + """ + + res = table.query( + IndexName="listener-service", + KeyConditionExpression=Key("service").eq(service_name), + # Only check for 100 connections + Limit=100 + ) + + return [c["id"] for c in res.get("Items", [])] + + +@tracer.capture_method +def send_event(event: dict, connection_ids: List[str]): + """ + Send an event to a list of connection IDs + """ + + for connection_id in connection_ids: + try: + apigwmgmt.post_to_connection( + ConnectionId=connection_id, + Data=json.dumps(event).encode("utf-8") + ) + # The client is disconnected, we can safely ignore and move to the + # next connection ID. + except apigwmgmt.exceptions.GoneException: + continue + + +@logger.inject_lambda_context +@tracer.capture_lambda_handler +def handler(event, _): + """ + Lambda handler + """ + + # Get the service name + service_name = event["source"] + logger.debug({ + "message": "Receive event from {}".format(service_name), + "serviceName": service_name, + "event": event + }) + + # Get connection IDs + connection_ids = get_connection_ids(service_name) + + # Send event to connected users + send_event(event, connection_ids) diff --git a/platform/src/on_events/requirements.txt b/platform/src/on_events/requirements.txt new file mode 100644 index 0000000..a3ad852 --- /dev/null +++ b/platform/src/on_events/requirements.txt @@ -0,0 +1,2 @@ +aws-lambda-powertools==0.9.3 +boto3 \ No newline at end of file diff --git a/platform/src/register/main.py b/platform/src/register/main.py new file mode 100644 index 0000000..afc1998 --- /dev/null +++ b/platform/src/register/main.py @@ -0,0 +1,78 @@ +""" +Register Lambda function +""" + + +import json +import os +import boto3 +from aws_lambda_powertools.tracing import Tracer # pylint: disable=import-error +from aws_lambda_powertools.logging.logger import Logger # pylint: disable=import-error +from ecom.apigateway import response # pylint: disable=import-error + + +ENVIRONMENT = os.environ["ENVIRONMENT"] +TABLE_NAME = os.environ["LISTENER_TABLE_NAME"] + + +dynamodb = boto3.resource("dynamodb") # pylint: disable=invalid-name +table = dynamodb.Table(TABLE_NAME) # pylint: disable=invalid-name,no-member +logger = Logger() # pylint: disable=invalid-name +tracer = Tracer() # pylint: disable=invalid-name + + +@tracer.capture_method +def register_service(connection_id: str, service_name: str): + """ + Store the connectionId in DynamoDB + """ + + table.put_item(Item={ + "id": connection_id, + "service": service_name + }) + + +@logger.inject_lambda_context +@tracer.capture_lambda_handler +def handler(event, _): + """ + Lambda handler + """ + + try: + connection_id = event["requestContext"]["connectionId"] + except (KeyError, TypeError): + logger.error({ + "message": "Missing connection ID in event", + "event": event + }) + return response("Missing connection ID", 400) + + try: + body = json.loads(event["body"]) + except json.decoder.JSONDecodeError: + logger.error({ + "message": "Failed to parse request body", + "event": event + }) + return response("Failed to parse request body", 400) + + try: + body = json.loads(event["body"]) + service_name = body["serviceName"] + except (KeyError, TypeError): + logger.warning({ + "message": "Missing 'serviceName' in request body", + "event": event + }) + return response("Missing 'serviceName' in request body", 400) + + logger.debug({ + "message": f"Register {connection_id} with service '{service_name}'", + "event": event + }) + + register_service(connection_id, service_name) + + return response("Connected") diff --git a/platform/src/register/requirements.txt b/platform/src/register/requirements.txt new file mode 100644 index 0000000..798b60d --- /dev/null +++ b/platform/src/register/requirements.txt @@ -0,0 +1,3 @@ +aws-lambda-powertools==0.9.3 +boto3 +../shared/src/ecom/ \ No newline at end of file diff --git a/platform/template.yaml b/platform/template.yaml index b943727..8551419 100644 --- a/platform/template.yaml +++ b/platform/template.yaml @@ -5,6 +5,31 @@ Parameters: Environment: Type: String Default: dev + LogLevel: + Type: String + Default: INFO + RetentionInDays: + Type: Number + Default: 30 + Description: CloudWatch Logs retention period for Lambda functions + + +Globals: + Function: + Runtime: python3.8 + Handler: main.handler + Timeout: 30 + Tracing: Active + Environment: + Variables: + ENVIRONMENT: !Ref Environment + POWERTOOLS_SERVICE_NAME: platform + POWERTOOLS_TRACE_DISABLED: "false" + LOG_LEVEL: !Ref LogLevel + + +Conditions: + IsNotProd: !Not [!Equals [!Ref Environment, prod]] Resources: @@ -21,4 +46,277 @@ Resources: Properties: Name: !Sub /ecommerce/${Environment}/platform/event-bus/name Type: String - Value: !Ref EventBus \ No newline at end of file + Value: !Ref EventBus + + ################## + # LISTENER TABLE # + ################## + ListenerTable: + Type: AWS::DynamoDB::Table + Condition: IsNotProd + Properties: + AttributeDefinitions: + - AttributeName: id + AttributeType: S + - AttributeName: service + AttributeType: S + KeySchema: + - AttributeName: id + KeyType: HASH + GlobalSecondaryIndexes: + - IndexName: listener-service + KeySchema: + - AttributeName: service + KeyType: HASH + Projection: + ProjectionType: ALL + BillingMode: PAY_PER_REQUEST + + ################ + # LISTENER API # + ################ + + ListenerApi: + Type: AWS::ApiGatewayV2::Api + Condition: IsNotProd + Properties: + Name: !Sub "ecommerce-${Environment}-platform-listener" + ProtocolType: WEBSOCKET + RouteSelectionExpression: "$request.body.action" + + ListenerApiParameter: + Type: AWS::SSM::Parameter + Condition: IsNotProd + Properties: + Name: !Sub /ecommerce/${Environment}/platform/listener-api/url + Type: String + Value: !Sub "wss://${ListenerApi}.execute-api.${AWS::Region}.amazonaws.com/prod/" + + ListenerApiStage: + Type: AWS::ApiGatewayV2::Stage + Condition: IsNotProd + Properties: + StageName: prod + ApiId: !Ref ListenerApi + DeploymentId: !Ref ListenerApiDeployment + + ListenerApiDeployment: + Type: AWS::ApiGatewayV2::Deployment + Condition: IsNotProd + DependsOn: + - ListenerConnectRoute + - ListenerDisconnectRoute + - ListenerRegisterRoute + Properties: + ApiId: !Ref ListenerApi + + ListenerConnectIntegration: + Type: AWS::ApiGatewayV2::Integration + Condition: IsNotProd + Properties: + ApiId: !Ref ListenerApi + IntegrationType: AWS_PROXY + IntegrationUri: !Sub "arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${OnConnectFunction.Arn}/invocations" + + ListenerConnectRoute: + Type: AWS::ApiGatewayV2::Route + Condition: IsNotProd + Properties: + ApiId: !Ref ListenerApi + RouteKey: "$connect" + AuthorizationType: AWS_IAM + Target: !Sub "integrations/${ListenerConnectIntegration}" + + OnConnectFunction: + Type: AWS::Serverless::Function + Condition: IsNotProd + Properties: + CodeUri: src/on_connect/ + Environment: + Variables: + LISTENER_TABLE_NAME: !Ref ListenerTable + Policies: + - Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - dynamodb:PutItem + Resource: + - !GetAtt ListenerTable.Arn + + OnConnectPermission: + Type: AWS::Lambda::Permission + Condition: IsNotProd + Properties: + Action: lambda:InvokeFunction + FunctionName: !Ref OnConnectFunction + Principal: apigateway.amazonaws.com + + OnConnectLogGroup: + Type: AWS::Logs::LogGroup + Condition: IsNotProd + Properties: + LogGroupName: !Sub "/aws/lambda/${OnConnectFunction}" + RetentionInDays: !Ref RetentionInDays + + ListenerDisconnectIntegration: + Type: AWS::ApiGatewayV2::Integration + Condition: IsNotProd + Properties: + ApiId: !Ref ListenerApi + IntegrationType: AWS_PROXY + IntegrationUri: !Sub "arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${OnDisconnectFunction.Arn}/invocations" + + ListenerDisconnectRoute: + Type: AWS::ApiGatewayV2::Route + Condition: IsNotProd + Properties: + ApiId: !Ref ListenerApi + RouteKey: "$disconnect" + Target: !Sub "integrations/${ListenerDisconnectIntegration}" + + OnDisconnectFunction: + Type: AWS::Serverless::Function + Condition: IsNotProd + Properties: + CodeUri: src/on_disconnect/ + Environment: + Variables: + LISTENER_TABLE_NAME: !Ref ListenerTable + Policies: + - Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - dynamodb:DeleteItem + Resource: + - !GetAtt ListenerTable.Arn + + OnDisconnectPermission: + Type: AWS::Lambda::Permission + Condition: IsNotProd + Properties: + Action: lambda:InvokeFunction + FunctionName: !Ref OnDisconnectFunction + Principal: apigateway.amazonaws.com + + OnDisconnectLogGroup: + Type: AWS::Logs::LogGroup + Condition: IsNotProd + Properties: + LogGroupName: !Sub "/aws/lambda/${OnDisconnectFunction}" + RetentionInDays: !Ref RetentionInDays + + ListenerRegisterIntegration: + Type: AWS::ApiGatewayV2::Integration + Condition: IsNotProd + Properties: + ApiId: !Ref ListenerApi + IntegrationType: AWS_PROXY + IntegrationUri: !Sub "arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${RegisterFunction.Arn}/invocations" + + ListenerRegisterRoute: + Type: AWS::ApiGatewayV2::Route + Condition: IsNotProd + Properties: + ApiId: !Ref ListenerApi + RouteKey: "register" + Target: !Sub "integrations/${ListenerRegisterIntegration}" + + RegisterFunction: + Type: AWS::Serverless::Function + Condition: IsNotProd + Properties: + CodeUri: src/register/ + Environment: + Variables: + LISTENER_TABLE_NAME: !Ref ListenerTable + Policies: + - Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - dynamodb:PutItem + Resource: + - !GetAtt ListenerTable.Arn + + RegisterPermission: + Type: AWS::Lambda::Permission + Condition: IsNotProd + Properties: + Action: lambda:InvokeFunction + FunctionName: !Ref RegisterFunction + Principal: apigateway.amazonaws.com + + RegisterLogGroup: + Type: AWS::Logs::LogGroup + Condition: IsNotProd + Properties: + LogGroupName: !Sub "/aws/lambda/${RegisterFunction}" + RetentionInDays: !Ref RetentionInDays + + ################### + # EVENT FUNCTIONS # + ################### + OnEventsFunction: + Type: AWS::Serverless::Function + Condition: IsNotProd + Properties: + CodeUri: src/on_events/ + Environment: + Variables: + LISTENER_API_URL: !Sub "https://${ListenerApi}.execute-api.${AWS::Region}.amazonaws.com/prod/" + LISTENER_TABLE_NAME: !Ref ListenerTable + Policies: + - Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - dynamodb:Query + Resource: + - !Sub "arn:${AWS::Partition}:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${ListenerTable}/index/listener-service" + - Effect: Allow + Action: + - execute-api:ManageConnections + Resource: + - !Sub "arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${ListenerApi}/prod/*" + Events: + Event: + Type: CloudWatchEvent + Properties: + EventBusName: !Ref EventBus + Pattern: + account: + - !Ref AWS::AccountId + EventInvokeConfig: + # Put failed events on a DLQ + DestinationConfig: + OnFailure: + Type: SQS + Destination: !GetAtt DeadLetterQueue.Outputs.QueueArn + + OnEventsLogGroup: + Type: AWS::Logs::LogGroup + Condition: IsNotProd + Properties: + LogGroupName: !Sub "/aws/lambda/${OnEventsFunction}" + RetentionInDays: !Ref RetentionInDays + + ##################### + # DEAD LETTER QUEUE # + ##################### + DeadLetterQueue: + Type: AWS::CloudFormation::Stack + Properties: + TemplateURL: ../../shared/templates/dlq.yaml + Parameters: + AlarmAction: !Ref AlarmTopic + + ########## + # ALARMS # + ########## + + AlarmTopic: + Type: AWS::SNS::Topic + Properties: + DisplayName: Orders Alarm \ No newline at end of file diff --git a/platform/tests/integ/test_on_events.py b/platform/tests/integ/test_on_events.py new file mode 100644 index 0000000..d96c796 --- /dev/null +++ b/platform/tests/integ/test_on_events.py @@ -0,0 +1,48 @@ +import asyncio +import datetime +import hashlib +import hmac +import json +import time +import urllib +import uuid +import boto3 +import pytest +import websockets # pylint: disable=import-error + +from fixtures import listener #pylint: disable=import-error +from helpers import get_parameter # pylint: disable=no-name-in-module + + +@pytest.fixture(scope="module") +def listener_api_url(): + return get_parameter("/ecommerce/{Environment}/platform/listener-api/url") + + +@pytest.fixture(scope="module") +def event_bus_name(): + return get_parameter("/ecommerce/{Environment}/platform/event-bus/name") + + +def test_listener(listener, event_bus_name): + service_name = "ecommerce.test" + resource = str(uuid.uuid4()) + event_type = "TestEvent" + + events = boto3.client("events") + + listener(service_name, lambda: + events.put_events(Entries=[{ + "Time": datetime.datetime.utcnow(), + "Source": service_name, + "Resources": [resource], + "DetailType": event_type, + "Detail": "{}", + "EventBusName": event_bus_name + }]), + lambda x: ( + x["source"] == service_name and + x["resources"][0] == resource and + x["detail-type"] == event_type + ) + ) diff --git a/platform/tests/unit/test_on_connect.py b/platform/tests/unit/test_on_connect.py new file mode 100644 index 0000000..b0b893a --- /dev/null +++ b/platform/tests/unit/test_on_connect.py @@ -0,0 +1,82 @@ +import uuid +import pytest +from fixtures import apigateway_event, context, lambda_module # pylint: disable=import-error +from helpers import mock_table # pylint: disable=import-error,no-name-in-module + + +lambda_module = pytest.fixture(scope="module", params=[{ + "function_dir": "on_connect", + "module_name": "main", + "environ": { + "ENVIRONMENT": "test", + "LISTENER_TABLE_NAME": "TABLE_NAME", + "POWERTOOLS_TRACE_DISABLED": "true" + } +}])(lambda_module) +context = pytest.fixture(context) + + +def test_store_id(lambda_module): + """ + Test store_id() + """ + + connection_id = str(uuid.uuid4()) + table = mock_table( + lambda_module.table, "put_item", ["id"], + items={"id": connection_id} + ) + + lambda_module.store_id(connection_id) + + table.assert_no_pending_responses() + table.deactivate() + + +def test_handler(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() + """ + + connection_id = str(uuid.uuid4()) + + event = apigateway_event() + event["requestContext"] = {"connectionId": connection_id} + + calls = { + "store_id": 0 + } + + def store_id(connection_id_req: str): + calls["store_id"] += 1 + assert connection_id_req == connection_id + monkeypatch.setattr(lambda_module, "store_id", store_id) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 200 + assert calls["store_id"] == 1 + + +def test_handler_no_id(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() + """ + + connection_id = str(uuid.uuid4()) + + event = apigateway_event() + + calls = { + "store_id": 0 + } + + def store_id(connection_id_req: str): + calls["store_id"] += 1 + assert connection_id_req == connection_id + monkeypatch.setattr(lambda_module, "store_id", store_id) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 400 + assert calls["store_id"] == 0 \ No newline at end of file diff --git a/platform/tests/unit/test_on_disconnect.py b/platform/tests/unit/test_on_disconnect.py new file mode 100644 index 0000000..5a7d0da --- /dev/null +++ b/platform/tests/unit/test_on_disconnect.py @@ -0,0 +1,82 @@ +import uuid +import pytest +from fixtures import apigateway_event, context, lambda_module # pylint: disable=import-error +from helpers import mock_table # pylint: disable=import-error,no-name-in-module + + +lambda_module = pytest.fixture(scope="module", params=[{ + "function_dir": "on_disconnect", + "module_name": "main", + "environ": { + "ENVIRONMENT": "test", + "LISTENER_TABLE_NAME": "TABLE_NAME", + "POWERTOOLS_TRACE_DISABLED": "true" + } +}])(lambda_module) +context = pytest.fixture(context) + + +def test_delete_id(lambda_module): + """ + Test delete_id() + """ + + connection_id = str(uuid.uuid4()) + table = mock_table( + lambda_module.table, "delete_item", ["id"], + items={"id": connection_id} + ) + + lambda_module.delete_id(connection_id) + + table.assert_no_pending_responses() + table.deactivate() + + +def test_handler(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() + """ + + connection_id = str(uuid.uuid4()) + + event = apigateway_event() + event["requestContext"] = {"connectionId": connection_id} + + calls = { + "delete_id": 0 + } + + def delete_id(connection_id_req: str): + calls["delete_id"] += 1 + assert connection_id_req == connection_id + monkeypatch.setattr(lambda_module, "delete_id", delete_id) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 200 + assert calls["delete_id"] == 1 + + +def test_handler_no_id(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() + """ + + connection_id = str(uuid.uuid4()) + + event = apigateway_event() + + calls = { + "delete_id": 0 + } + + def delete_id(connection_id_req: str): + calls["delete_id"] += 1 + assert connection_id_req == connection_id + monkeypatch.setattr(lambda_module, "delete_id", delete_id) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 400 + assert calls["delete_id"] == 0 \ No newline at end of file diff --git a/platform/tests/unit/test_on_events.py b/platform/tests/unit/test_on_events.py new file mode 100644 index 0000000..31ff2ab --- /dev/null +++ b/platform/tests/unit/test_on_events.py @@ -0,0 +1,114 @@ +import json +from typing import List +import uuid +from boto3.dynamodb.types import TypeSerializer +from botocore import stub +import pytest +from fixtures import context, lambda_module # pylint: disable=import-error + + +lambda_module = pytest.fixture(scope="module", params=[{ + "function_dir": "on_events", + "module_name": "main", + "environ": { + "ENVIRONMENT": "test", + "LISTENER_TABLE_NAME": "TABLE_NAME", + "LISTENER_API_URL": "https://listener-api-url/", + "POWERTOOLS_TRACE_DISABLED": "true" + } +}])(lambda_module) +context = pytest.fixture(context) + + +def test_get_connection_ids(lambda_module): + """ + Test get_connection_ids() + """ + + service_name = "ecommerce.test" + connection_ids = [str(uuid.uuid4()) for _ in range(100)] + + table = stub.Stubber(lambda_module.table.meta.client) + response = { + "Items": [{ + "service": {"S": service_name}, + "id": {"S": connection_id} + } for connection_id in connection_ids] + } + expected_params = { + "TableName": "TABLE_NAME", + "IndexName": "listener-service", + "KeyConditionExpression": stub.ANY, + "Limit": stub.ANY + } + table.add_response("query", response, expected_params) + table.activate() + + retval = lambda_module.get_connection_ids(service_name) + + for connection_id in connection_ids: + assert connection_id in retval + + table.assert_no_pending_responses() + table.deactivate() + + +def test_send_event(lambda_module): + """ + Test send_event() + """ + + event = {"message": "sample_payload"} + event_bytes = json.dumps(event).encode("utf-8") + connection_ids = [str(uuid.uuid4()) for _ in range(100)] + + apigw_mock = stub.Stubber(lambda_module.apigwmgmt) + response = {} + for connection_id in connection_ids: + expected_params = { + "ConnectionId": connection_id, + "Data": event_bytes + } + apigw_mock.add_response("post_to_connection", response, expected_params) + apigw_mock.activate() + + lambda_module.send_event(event, connection_ids) + + apigw_mock.assert_no_pending_responses() + apigw_mock.deactivate() + + +def test_handler(monkeypatch, lambda_module, context): + """ + Test handler() + """ + + service_name = "ecommerce.test" + event = { + "source": service_name, + "message": "test_event" + } + connection_ids = [str(uuid.uuid4()) for _ in range(100)] + + called = { + "get_connection_ids": False, + "send_event": False + } + + def get_connection_ids(service_name_got: str) -> List[str]: + assert service_name == service_name + called["get_connection_ids"] = True + return connection_ids + + def send_event(event_got: dict, connection_ids_got: list): + assert event == event_got + assert connection_ids == connection_ids_got + called["send_event"] = True + + monkeypatch.setattr(lambda_module, "get_connection_ids", get_connection_ids) + monkeypatch.setattr(lambda_module, "send_event", send_event) + + lambda_module.handler(event, context) + + for k in called.keys(): + assert called[k] == True \ No newline at end of file diff --git a/platform/tests/unit/test_register.py b/platform/tests/unit/test_register.py new file mode 100644 index 0000000..7706ac4 --- /dev/null +++ b/platform/tests/unit/test_register.py @@ -0,0 +1,149 @@ +import json +import uuid +import pytest +from fixtures import apigateway_event, context, lambda_module # pylint: disable=import-error +from helpers import mock_table # pylint: disable=import-error,no-name-in-module + + +lambda_module = pytest.fixture(scope="module", params=[{ + "function_dir": "register", + "module_name": "main", + "environ": { + "ENVIRONMENT": "test", + "LISTENER_TABLE_NAME": "TABLE_NAME", + "POWERTOOLS_TRACE_DISABLED": "true" + } +}])(lambda_module) +context = pytest.fixture(context) + + +def test_register_service(lambda_module): + """ + Test register_service() + """ + + connection_id = str(uuid.uuid4()) + service_name = "test" + table = mock_table( + lambda_module.table, "put_item", ["id"], + items={ + "id": connection_id, + "service": service_name + } + ) + + lambda_module.register_service(connection_id, service_name) + + table.assert_no_pending_responses() + table.deactivate() + + +def test_handler(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() + """ + + connection_id = str(uuid.uuid4()) + service_name = "ecommerce.test" + + event = apigateway_event() + event["requestContext"] = {"connectionId": connection_id} + event["body"] = json.dumps({"serviceName": service_name}) + + calls = { + "register_service": 0 + } + + def register_service(connection_id_req: str, service_name_req: str): + calls["register_service"] += 1 + assert connection_id_req == connection_id + assert service_name_req == service_name + monkeypatch.setattr(lambda_module, "register_service", register_service) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 200 + assert calls["register_service"] == 1 + + +def test_handler_no_id(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() without connectionId + """ + + connection_id = str(uuid.uuid4()) + service_name = "ecommerce.test" + + event = apigateway_event() + event["body"] = json.dumps({"serviceName": service_name}) + + calls = { + "register_service": 0 + } + + def register_service(connection_id_req: str, service_name_req: str): + calls["register_service"] += 1 + assert connection_id_req == connection_id + assert service_name_req == service_name + monkeypatch.setattr(lambda_module, "register_service", register_service) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 400 + assert calls["register_service"] == 0 + + +def test_handler_invalid_body(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() without a correct JSON body + """ + + connection_id = str(uuid.uuid4()) + service_name = "ecommerce.test" + + event = apigateway_event() + event["requestContext"] = {"connectionId": connection_id} + event["body"] = "{" + + calls = { + "register_service": 0 + } + + def register_service(connection_id_req: str, service_name_req: str): + calls["register_service"] += 1 + assert connection_id_req == connection_id + assert service_name_req == service_name + monkeypatch.setattr(lambda_module, "register_service", register_service) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 400 + assert calls["register_service"] == 0 + + +def test_handler_no_service(monkeypatch, lambda_module, context, apigateway_event): + """ + Test handler() without serviceName in body + """ + + connection_id = str(uuid.uuid4()) + service_name = "ecommerce.test" + + event = apigateway_event() + event["requestContext"] = {"connectionId": connection_id} + event["body"] = "{}" + + calls = { + "register_service": 0 + } + + def register_service(connection_id_req: str, service_name_req: str): + calls["register_service"] += 1 + assert connection_id_req == connection_id + assert service_name_req == service_name + monkeypatch.setattr(lambda_module, "register_service", register_service) + + result = lambda_module.handler(event, context) + + assert result["statusCode"] == 400 + assert calls["register_service"] == 0 \ No newline at end of file diff --git a/products/template.yaml b/products/template.yaml index ee0f005..fdf307e 100644 --- a/products/template.yaml +++ b/products/template.yaml @@ -35,10 +35,6 @@ Globals: LOG_LEVEL: !Ref LogLevel -Conditions: - IsNotProd: !Not [!Equals [!Ref Environment, prod]] - - Resources: ######### # TABLE # @@ -166,17 +162,4 @@ Resources: DeadLetterQueue: Type: AWS::CloudFormation::Stack Properties: - TemplateURL: ../../shared/templates/dlq.yaml - - ############ - # LISTENER # - ############ - Listener: - Type: AWS::CloudFormation::Stack - Condition: IsNotProd - Properties: - TemplateURL: ../../shared/templates/listener.yaml - Parameters: - Environment: !Ref Environment - EventBusName: !Ref EventBusName - ServiceName: "products" \ No newline at end of file + TemplateURL: ../../shared/templates/dlq.yaml \ No newline at end of file diff --git a/products/tests/integ/test_events.py b/products/tests/integ/test_events.py index a2940ed..c3d85bf 100644 --- a/products/tests/integ/test_events.py +++ b/products/tests/integ/test_events.py @@ -38,35 +38,17 @@ def test_table_update(table_name, listener, product): """ # Add a new item table = boto3.resource("dynamodb").Table(table_name) # pylint: disable=no-member - table.put_item(Item=product) - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("products") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if product["productId"] in body["resources"]: - found = True - assert body["detail-type"] == "ProductCreated" - - assert found == True - - # Delete the item - table.delete_item(Key={"productId": product["productId"]}) - - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("products") - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if product["productId"] in body["resources"]: - found = True - assert body["detail-type"] == "ProductDeleted" - - assert found == True \ No newline at end of file + # Listen for messages on EventBridge + listener( + "ecommerce.products", + lambda: table.put_item(Item=product), + lambda m: product["productId"] in m["resources"] and m["detail-type"] == "ProductCreated" + ) + + # Listen for messages on EventBridge + listener( + "ecommerce.products", + lambda: table.delete_item(Key={"productId": product["productId"]}), + lambda m: product["productId"] in m["resources"] and m["detail-type"] == "ProductDeleted" + ) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 6c25cb7..da74dd0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,9 +4,10 @@ cfn-lint==0.28.2 jsonschema==3.2.0 locust==1.0.3 pylint==2.4.4 -pytest==5.3.5 +pytest==5.4.3 pytest-cov==2.8.1 PyYAML==5.3 requests==2.23.0 requests-mock==1.7.0 +websockets==8.1 yq==2.10.0 \ No newline at end of file diff --git a/shared/templates/listener.yaml b/shared/templates/listener.yaml deleted file mode 100644 index c17119d..0000000 --- a/shared/templates/listener.yaml +++ /dev/null @@ -1,56 +0,0 @@ -AWSTemplateFormatVersion: "2010-09-09" - - -Parameters: - Environment: - Type: String - Default: dev - Description: Environment name - ServiceName: - Type: String - Description: | - Name of the service in lowercase - This should match the service value used as event source and for SSM parameters. - EventBusName: - Type: String - Description: EventBridge Event Bus Name - - -Resources: - Queue: - Type: AWS::SQS::Queue - - QueuePolicy: - Type: AWS::SQS::QueuePolicy - Properties: - PolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: Allow - Principal: - Service: "events.amazonaws.com" - Action: - - sqs:SendMessage - Resource: !GetAtt Queue.Arn - Condition: - ArnEquals: - aws:SourceArn: !GetAtt Rule.Arn - Queues: - - !Ref Queue - - Rule: - Type: AWS::Events::Rule - Properties: - EventBusName: !Ref EventBusName - EventPattern: !Sub '{"source": ["ecommerce.${ServiceName}"]}' - State: ENABLED - Targets: - - Id: ListenerQueue - Arn: !GetAtt Queue.Arn - - Parameter: - Type: AWS::SSM::Parameter - Properties: - Name: !Sub "/ecommerce/${Environment}/${ServiceName}/listener/url" - Type: String - Value: !Ref Queue \ No newline at end of file diff --git a/shared/tests/integ/fixtures.py b/shared/tests/integ/fixtures.py index 437d6db..0592d3f 100644 --- a/shared/tests/integ/fixtures.py +++ b/shared/tests/integ/fixtures.py @@ -1,14 +1,19 @@ +import asyncio import datetime +import json +import hashlib +import hmac import os import random import string import time -from typing import List, Optional +from typing import Callable, List, Optional from urllib.parse import urlparse import uuid from aws_requests_auth.boto_utils import BotoAWSRequestsAuth import boto3 import pytest +import websockets # pylint: disable=import-error sqs = boto3.client("sqs") @@ -16,54 +21,107 @@ @pytest.fixture -def listener(request): +def listener(): """ - Listens to messages in the Listener queue for a given service for a fixed - period of time. - - To use in your integration tests: - - from fixtures import listener - - Then to write a test: - - test_with_listener(listener): - # Trigger an event that would result in messages - # ... - - messages = listener("your-service") - - # Parse messages + Listens to messages through a WebSocket API """ - def _listener(service_name: str, timeout: int=15): - queue_url = ssm.get_parameter( - Name="/ecommerce/{}/{}/listener/url".format( - os.environ["ECOM_ENVIRONMENT"], service_name - ) + def signed_url_headers(url): + """ + Generate SigV4 signature headers + + Taken from https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html + """ + + def sign(key, msg): + return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest() + + def get_signature_key(key, dateStamp, regionName, serviceName): + kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp) + kRegion = sign(kDate, regionName) + kService = sign(kRegion, serviceName) + kSigning = sign(kService, 'aws4_request') + return kSigning + + uri = urlparse(url) + session = boto3.Session() + credentials = session.get_credentials() + + t = datetime.datetime.utcnow() + amzdate = t.strftime('%Y%m%dT%H%M%SZ') + datestamp = t.strftime('%Y%m%d') + canonical_uri = uri.path + canonical_headers = f"host:{uri.netloc}\nx-amz-date:{amzdate}\n" + signed_headers = "host;x-amz-date" + payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest() + canonical_request = f"GET\n{canonical_uri}\n\n{canonical_headers}\n{signed_headers}\n{payload_hash}" + canonical_request_enc = hashlib.sha256(canonical_request.encode('utf-8')).hexdigest() + credential_scope = f"{datestamp}/{session.region_name}/execute-api/aws4_request" + string_to_sign = f"AWS4-HMAC-SHA256\n{amzdate}\n{credential_scope}\n{canonical_request_enc}" + signing_key = get_signature_key(credentials.secret_key, datestamp, session.region_name, "execute-api") + signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest() + authorization_header = f"AWS4-HMAC-SHA256 Credential={credentials.access_key}/{credential_scope}, SignedHeaders={signed_headers}, Signature={signature}" + + return {'x-amz-date':amzdate, 'Authorization':authorization_header} + + def _listener(service_name: str, gen_function: Callable[[None], None], test_function: Optional[Callable[[dict], bool]]=None, wait_time: int=8): + """ + Listener fixture function + """ + + # Retrieve the listener API URL + listener_api_url = ssm.get_parameter( + Name="/ecommerce/{}/platform/listener-api/url".format(os.environ["ECOM_ENVIRONMENT"]) )["Parameter"]["Value"] - print("TIMEOUT", timeout) - messages = [] - start_time = time.time() - while time.time() < start_time + timeout: - response = sqs.receive_message( - QueueUrl=queue_url, - MaxNumberOfMessages=10, - WaitTimeSeconds=min(20, int(time.time()-start_time+timeout)) - ) - if response.get("Messages", []): - sqs.delete_message_batch( - QueueUrl=queue_url, - Entries=[ - {"Id": m["MessageId"], "ReceiptHandle": m["ReceiptHandle"]} - for m in response["Messages"] - ] + # Inner async function + async def _listen() -> List[dict]: + # Generate SigV4 headers + headers = signed_url_headers(listener_api_url) + # Connects to API + async with websockets.connect(listener_api_url, extra_headers=headers) as websocket: + # Send to which service we are subscribing + await websocket.send( + json.dumps({"action": "register", "serviceName": service_name}) ) - messages.extend(response.get("Messages", [])) - return messages - + # Sleep to ensure propagation + time.sleep(2) + + # Run the function that will produce messages + gen_function() + + # Listen to messages through the WebSockets API + found = False + messages = [] + # Since asyncio.wait_for timeout parameter takes an integer, we need to + # calculate the value. For this, we calculate the datetime until we want to + # wait in the worst case, then calculate the timeout integer value based on + # that. + timeout = datetime.datetime.utcnow() + datetime.timedelta(seconds=wait_time) + while datetime.datetime.utcnow() < timeout: + try: + message = json.loads(await asyncio.wait_for( + websocket.recv(), + timeout=(timeout - datetime.datetime.utcnow()).total_seconds() + )) + print(message) + messages.append(message) + # Run the user-provided test + if test_function is not None and test_function(message): + found = True + break + except asyncio.exceptions.TimeoutError: + # Timeout exceeded + break + + if test_function is not None: + assert found == True + + return messages + + return asyncio.run(_listen()) + return _listener diff --git a/users/template.yaml b/users/template.yaml index 4dad321..af98216 100644 --- a/users/template.yaml +++ b/users/template.yaml @@ -33,10 +33,6 @@ Globals: LOG_LEVEL: !Ref LogLevel -Conditions: - IsNotProd: !Not [!Equals [!Ref Environment, prod]] - - Resources: ############# # USER POOL # @@ -93,17 +89,4 @@ Resources: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${SignUpFunction}" - RetentionInDays: !Ref RetentionInDays - - ############ - # LISTENER # - ############ - Listener: - Type: AWS::CloudFormation::Stack - Condition: IsNotProd - Properties: - TemplateURL: ../../shared/templates/listener.yaml - Parameters: - Environment: !Ref Environment - EventBusName: !Ref EventBusName - ServiceName: "users" \ No newline at end of file + RetentionInDays: !Ref RetentionInDays \ No newline at end of file diff --git a/users/tests/integ/test_events.py b/users/tests/integ/test_events.py index 5615ec3..bfc8a9f 100644 --- a/users/tests/integ/test_events.py +++ b/users/tests/integ/test_events.py @@ -5,7 +5,7 @@ import string import boto3 import pytest -from fixtures import listener +from fixtures import listener # pylint: disable=import-error ssm = boto3.client("ssm") @@ -19,68 +19,43 @@ cognito = boto3.client("cognito-idp") -@pytest.fixture -def user_id(): - email = "".join(random.choices(string.ascii_lowercase, k=20))+"@example.local" - password = "".join( - random.choices(string.ascii_uppercase, k=10) + - random.choices(string.ascii_lowercase, k=10) + - random.choices(string.digits, k=5) + - random.choices(string.punctuation, k=3) - ) - - # Create a new user - response = cognito.admin_create_user( - UserPoolId=COGNITO_USER_POOL, - Username=email, - UserAttributes=[{ - "Name": "email", - "Value": email - }], - # Do not send an email as this is a fake address - MessageAction="SUPPRESS" - ) - user_id = response["User"]["Username"] - - # # Set a user password - # cognito.admin_set_user_password( - # UserPoolId=COGNITO_USER_POOL, - # Username=user_id, - # Password=password, - # Permanent=True - # ) - - # cognito.admin_confirm_sign_up( - # UserPoolId=COGNITO_USER_POOL, - # Username=user_id - # ) - - # Return the user ID - yield user_id - - # Delete the user - cognito.admin_delete_user( - UserPoolId=COGNITO_USER_POOL, - Username=user_id - ) - - -def test_sign_up(listener, user_id): +def test_sign_up(listener): """ Test that the SignUp function reacts to new users in Cognito User Pools and sends an event to EventBridge """ - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("users") + data = {} + + def gen_func(): + email = "".join(random.choices(string.ascii_lowercase, k=20))+"@example.local" + password = "".join( + random.choices(string.ascii_uppercase, k=10) + + random.choices(string.ascii_lowercase, k=10) + + random.choices(string.digits, k=5) + + random.choices(string.punctuation, k=3) + ) + + # Create a new user + response = cognito.admin_create_user( + UserPoolId=COGNITO_USER_POOL, + Username=email, + UserAttributes=[{ + "Name": "email", + "Value": email + }], + # Do not send an email as this is a fake address + MessageAction="SUPPRESS" + ) + data["user_id"] = response["User"]["Username"] + + def test_func(m): + return data["user_id"] in m["resources"] and m["detail-type"] == "UserCreated" + + # Listen for messages on EventBridge + listener("ecommerce.users", gen_func, test_func) - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if user_id in body["resources"]: - found = True - assert body["detail-type"] == "UserCreated" - - assert found == True + cognito.admin_delete_user( + UserPoolId=COGNITO_USER_POOL, + Username=data["user_id"] + ) \ No newline at end of file diff --git a/warehouse/template.yaml b/warehouse/template.yaml index 1d868de..5052d07 100644 --- a/warehouse/template.yaml +++ b/warehouse/template.yaml @@ -36,10 +36,6 @@ Globals: LOG_LEVEL: !Ref LogLevel -Conditions: - IsNotProd: !Not [!Equals [!Ref Environment, prod]] - - Resources: ######### # TABLE # @@ -176,17 +172,4 @@ Resources: DeadLetterQueue: Type: AWS::CloudFormation::Stack Properties: - TemplateURL: ../../shared/templates/dlq.yaml - - ############ - # LISTENER # - ############ - Listener: - Type: AWS::CloudFormation::Stack - Condition: IsNotProd - Properties: - TemplateURL: ../../shared/templates/listener.yaml - Parameters: - Environment: !Ref Environment - EventBusName: !Ref EventBusName - ServiceName: "warehouse" \ No newline at end of file + TemplateURL: ../../shared/templates/dlq.yaml \ No newline at end of file diff --git a/warehouse/tests/integ/test_events.py b/warehouse/tests/integ/test_events.py index 38119d0..3d5267c 100644 --- a/warehouse/tests/integ/test_events.py +++ b/warehouse/tests/integ/test_events.py @@ -78,21 +78,14 @@ def test_table_update(table_name, metadata, products, listener): # Mark the packaging as completed metadata["status"] = "COMPLETED" - table.put_item(Item=metadata) - - # Listen for messages on EventBridge through a listener SQS queue - messages = listener("warehouse", 15) - - # Parse messages - found = False - for message in messages: - print("MESSAGE RECEIVED:", message) - body = json.loads(message["Body"]) - if metadata["orderId"] in body["resources"]: - found = True - assert body["detail-type"] == "PackageCreated" - - assert found == True + + + # Listen for messages on EventBridge + listener( + "ecommerce.warehouse", + lambda: table.put_item(Item=metadata), + lambda m: metadata["orderId"] in m["resources"] and m["detail-type"] == "PackageCreated" + ) # Clean up the table with table.batch_writer() as batch: