diff --git a/.github/workflows/deploy_terraform.yml b/.github/workflows/deploy_terraform.yml index 67f75836..4c9ce44a 100644 --- a/.github/workflows/deploy_terraform.yml +++ b/.github/workflows/deploy_terraform.yml @@ -201,3 +201,44 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.DEV_AWS_SECRET_ACCESS_KEY }} AWS_REGION: ${{ secrets.DEV_AWS_REGION }} + # ============================================================ + # Categorisation image and Push + # ============================================================ + categorisation_image: + needs: [determine_stage, shared_terraform] + uses: ./.github/workflows/_build_image.yml + with: + ecr_repo: categorisation-${{ needs.determine_stage.outputs.stage }} + dockerfile_path: backend/categorisation/handler/Dockerfile + build_context: . + build_args: | + DEV_DB_HOST=$DEV_DB_HOST + DEV_DB_PORT=$DEV_DB_PORT + DEV_DB_NAME=$DEV_DB_NAME + secrets: + AWS_ACCESS_KEY_ID: ${{ secrets.DEV_AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.DEV_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: ${{ secrets.DEV_AWS_REGION }} + DEV_DB_HOST: ${{ secrets.DEV_DB_HOST }} + DEV_DB_PORT: ${{ secrets.DEV_DB_PORT }} + DEV_DB_NAME: ${{ secrets.DEV_DB_NAME }} + + # ============================================================ + # Deploy Categorisation Lambda + # ============================================================ + categorisation_lambda: + needs: [categorisation_image, determine_stage] + uses: ./.github/workflows/_deploy_lambda.yml + with: + lambda_name: categorisation + lambda_path: infrastructure/terraform/lambda/categorisation + stage: ${{ needs.determine_stage.outputs.stage }} + ecr_repo: categorisation-${{ needs.determine_stage.outputs.stage }} + image_digest: ${{ needs.categorisation_image.outputs.image_digest }} + terraform_apply: ${{ needs.determine_stage.outputs.terraform_apply }} + secrets: + AWS_ACCESS_KEY_ID: ${{ secrets.DEV_AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.DEV_AWS_SECRET_ACCESS_KEY }} + AWS_REGION: ${{ secrets.DEV_AWS_REGION }} + + diff --git a/backend/categorisation/handler/Dockerfile b/backend/categorisation/handler/Dockerfile index 46c8d477..5f435afd 100644 --- a/backend/categorisation/handler/Dockerfile +++ b/backend/categorisation/handler/Dockerfile @@ -30,8 +30,13 @@ RUN pip install --no-cache-dir -r requirements.txt # ----------------------------- COPY utils/ utils/ COPY backend/categorisation/ backend/categorisation/ +COPY backend/app/db/functions/ backend/app/db/functions/ +COPY backend/app/db/models/ backend/app/db/models/ +COPY backend/addresses/ backend/addresses +COPY datatypes/ datatypes/ COPY backend/app/db/connection.py backend/app/db/connection.py + COPY backend/app/config.py backend/app/config.py COPY backend/__init__.py backend/__init__.py diff --git a/backend/categorisation/handler/handler.py b/backend/categorisation/handler/handler.py index e74bfeb5..20076613 100644 --- a/backend/categorisation/handler/handler.py +++ b/backend/categorisation/handler/handler.py @@ -1,4 +1,9 @@ +import json from typing import Any, Mapping +from backend.categorisation.categorisation_trigger_request import ( + CategorisationTriggerRequest, +) +from backend.categorisation.processor import process_portfolio from utils.logger import setup_logger @@ -7,4 +12,15 @@ logger = setup_logger() def handler(event: Mapping[str, Any], context: Any) -> None: - pass + for record in event.get("Records", []): + try: + body_dict = json.loads(record["body"]) + logger.debug("Validating request body") + payload = CategorisationTriggerRequest.model_validate(body_dict) + + logger.debug("Successfully validated request body") + + process_portfolio(payload.portfolio_id) + + except Exception as e: + logger.error(f"Failed to process record: {e}") diff --git a/backend/categorisation/handler/requirements.txt b/backend/categorisation/handler/requirements.txt index 48e5b561..e277b094 100644 --- a/backend/categorisation/handler/requirements.txt +++ b/backend/categorisation/handler/requirements.txt @@ -1,3 +1,6 @@ sqlmodel pydantic-settings -psycopg2-binary==2.9.10 \ No newline at end of file +psycopg2-binary==2.9.10 + +# Not used but needed to satisfy imports +pytz==2024.2 \ No newline at end of file diff --git a/infrastructure/terraform/lambda/categorisation/main.tf b/infrastructure/terraform/lambda/categorisation/main.tf index a402a386..6e30dd8e 100644 --- a/infrastructure/terraform/lambda/categorisation/main.tf +++ b/infrastructure/terraform/lambda/categorisation/main.tf @@ -1,3 +1,7 @@ +data "aws_secretsmanager_secret_version" "db_credentials" { + secret_id = "${var.stage}/assessment_model/db_credentials" +} + data "terraform_remote_state" "shared" { backend = "s3" config = { @@ -7,6 +11,10 @@ data "terraform_remote_state" "shared" { } } +locals { + db_credentials = jsondecode(data.aws_secretsmanager_secret_version.db_credentials.secret_string) +} + module "lambda" { source = "../modules/lambda_with_sqs" diff --git a/infrastructure/terraform/lambda/categorisation/provider.tf b/infrastructure/terraform/lambda/categorisation/provider.tf index f983533d..fe497c81 100644 --- a/infrastructure/terraform/lambda/categorisation/provider.tf +++ b/infrastructure/terraform/lambda/categorisation/provider.tf @@ -7,7 +7,7 @@ terraform { } backend "s3" { - bucket = "categorisation" + bucket = "categorisation-terraform-state" key = "terraform.tfstate" region = "eu-west-2" }