diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9ccf1dc..680d9bc 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -56,6 +56,13 @@ updates: open-pull-requests-limit: 3 + - package-ecosystem: pip + directory: /lambdas/oss-index-creator + schedule: + interval: weekly + open-pull-requests-limit: 3 + + - package-ecosystem: github-actions directory: / schedule: diff --git a/README.md b/README.md index d8e9827..47136f5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Monorepo with five primary services: - **.NET 8 API** -- Clean Architecture REST API hosted on Lambda behind API Gateway - **React 19 Web** -- MUI v7 admin/dispatcher workspace served via CloudFront + S3 - **React Native Mobile** -- iOS-first field app for dispatchers (offline-capable) -- **Python Lambdas** -- PDF extraction, PDF generation, library ingestion, AI suggestions +- **Python Lambdas** -- PDF extraction, PDF generation, library ingestion, AI suggestions, AOSS index provisioning - **CDK Infrastructure** -- Three TypeScript stacks managing all AWS resources ## Repository Structure @@ -41,12 +41,12 @@ proposal-system/ ## AWS Resources -All resources are in **us-east-1** (account 328440206208). CDK stacks are defined but not yet deployed to AWS. +All resources are in **us-east-1** (account 328440206208). | CDK Stack | Key Resources | |---|---| | `proposal-system-foundation` | RDS PostgreSQL 15 (t4g.small), S3 buckets, SQS queue + DLQ, Cognito user pool, Secrets Manager | -| `proposal-system-compute` | API Gateway HTTP API, .NET 8 API Lambda, Python Lambdas (pdf-extract, pdf-generate, library-ingest, suggestions), Bedrock KB | +| `proposal-system-compute` | API Gateway HTTP API, .NET 8 API Lambda, Python Lambdas (pdf-extract, pdf-generate, library-ingest, suggestions, oss-index-creator), OpenSearch Serverless collection, Bedrock KB | | `proposal-system-frontend` | CloudFront distribution (S3 OAC) | | Resource Type | Names | diff --git a/lambdas/oss-index-creator/app.py b/lambdas/oss-index-creator/app.py index ec23316..23dc6e8 100644 --- a/lambdas/oss-index-creator/app.py +++ b/lambdas/oss-index-creator/app.py @@ -1,4 +1,3 @@ -import json import time import boto3 from opensearchpy import OpenSearch, RequestsHttpConnection @@ -6,10 +5,7 @@ from requests_aws4auth import AWS4Auth def handler(event, context): - print(f"Event: {json.dumps(event, default=str)}") - if event["RequestType"] == "Delete": - print("Delete request, returning") return {"PhysicalResourceId": event.get("PhysicalResourceId", "none")} props = event["ResourceProperties"] @@ -19,13 +15,9 @@ def handler(event, context): text_field = props["TextField"] metadata_field = props["MetadataField"] - print(f"Endpoint: {endpoint}") - print(f"Index: {index_name}") - session = boto3.Session() credentials = session.get_credentials().get_frozen_credentials() region = session.region_name - print(f"Region: {region}") awsauth = AWS4Auth( credentials.access_key, @@ -67,24 +59,15 @@ def handler(event, context): for attempt in range(30): try: - print(f"Attempt {attempt}: creating index...") - response = client.indices.create(index=index_name, body=index_body) - print(f"Index created successfully: {response}") - # Verify the index exists - exists = client.indices.exists(index=index_name) - print(f"Index exists check: {exists}") + client.indices.create(index=index_name, body=index_body) return {"PhysicalResourceId": index_name} except Exception as e: error_str = str(e) - print(f"Attempt {attempt} error: {error_str}") if "resource_already_exists_exception" in error_str: - print("Index already exists, returning success") return {"PhysicalResourceId": index_name} if "403" in error_str and attempt < 29: - print(f"403 error, retrying in 10s (attempt {attempt}/29)") time.sleep(10) continue - print(f"Fatal error on attempt {attempt}: {error_str}") raise raise Exception("Timeout waiting for AOSS access policy propagation")