From 90ff84e1b2bcc0c42732b295d9b7f47eddfd57f7 Mon Sep 17 00:00:00 2001 From: Sunita Koppar <47020304+skopp002@users.noreply.github.com> Date: Mon, 26 Jan 2026 12:19:00 -0800 Subject: [PATCH] Lakehouse agent - ensures identity propagation from logged in federated user to ensure row level security on data fetched from databases supported by MCP tools on MCP server (#853) * Lakehouse agent which supports role based access control and row level data access protectionat data layer * Updated the auth flow and moved instructions into notebooks * Completed a draft * notebooks added * Fix: Add aws_session_utils.py to MCP server and update import * Debug: Add version print statement to verify deployment * Replace print statements with logging module for OpenTelemetry capture * Update agent JWT config to accept both app and M2M client IDs * End to end testing. Readme updated with screenshots * End to end testing. Readme updated with screenshots * Added streamlit notebook * Removed redundant files * Added Gi and Sunita to CONTRIBUTORS.md * Added alias * Update time needed to test values * added cleanup notebook * Added architecture diagram * Ensured local files are cleaned up which was causing stale state of the MCP server and leading to Auth issues * Ignore errors for optional parameters * Fixed cleanup issues and ensured end to end cleanup and restore * Explanation of oauth and authentication flow from user to MCP * Fixed typo * updated README * Correct README to remove Lake Formation references. Lake Formation does not support dynamic column filters. Reverting to use interceptors only * Added TODO with current limitations of Lakeformation * Added TODO with current limitations of Lakeformation * Cleanup of acct id masking file * Added SSO based credential loading which will default to region of the SSO profile as fallback if no valid credentials are available in .env * Fixing region resolution to be consistent resolution pattern --------- Signed-off-by: Sunita Koppar <47020304+skopp002@users.noreply.github.com> Co-authored-by: Sunita Koppar Co-authored-by: Gi Kim --- 02-use-cases/lakehouse-agent/.gitignore | 60 ++ .../00-prerequisites-setup.ipynb | 369 ++++++++ .../lakehouse-agent/01-deploy-athena.ipynb | 266 ++++++ .../lakehouse-agent/02-deploy-cognito.ipynb | 193 +++++ .../03-deploy-mcp-server.ipynb | 172 ++++ .../lakehouse-agent/04-deploy-gateway.ipynb | 237 ++++++ .../lakehouse-agent/05-deploy-agent.ipynb | 184 ++++ .../06-streamlit-ui-deployment.ipynb | 395 +++++++++ .../lakehouse-agent/07-optional-cleanup.ipynb | 796 ++++++++++++++++++ .../Lakehouse-agent-architecture.png | Bin 0 -> 242393 bytes 02-use-cases/lakehouse-agent/README.md | 754 +++++++++++++++++ .../deployment/athena-setup/create_tables.sql | 79 ++ .../deployment/athena-setup/sample_data.sql | 37 + .../deployment/athena-setup/setup_athena.py | 611 ++++++++++++++ .../cognito-setup/check_m2m_client.py | 166 ++++ .../deployment/cognito-setup/decode_token.py | 131 +++ .../deployment/cognito-setup/setup_cognito.py | 515 +++++++++++ .../deployment/gateway-setup/check_users.py | 122 +++ .../gateway-setup/cleanup_test_users.py | 92 ++ .../gateway-setup/create_gateway.py | 752 +++++++++++++++++ .../gateway-setup/create_lambda_role.py | 92 ++ .../gateway-setup/decode_user_token.py | 237 ++++++ .../gateway-setup/interceptor/.gitignore | 1 + .../gateway-setup/interceptor/deploy.sh | 162 ++++ .../interceptor/lambda_function.py | 426 ++++++++++ .../interceptor/requirements.txt | 2 + .../deployment/gateway-setup/test_gateway.py | 411 +++++++++ .../gateway-setup/update_interceptor_env.py | 103 +++ .../deployment/iam-policies/README.md | 347 ++++++++ .../lakehouse-ssm-admin-policy.json | 56 ++ .../lakehouse-ssm-read-policy.json | 40 + .../deployment/lakehouse-agent/.dockerignore | 72 ++ .../deployment/lakehouse-agent/Dockerfile | 41 + .../lakehouse-agent/deploy_lakehouse_agent.py | 406 +++++++++ .../lakehouse-agent/lakehouse_agent.py | 191 +++++ .../lakehouse-agent/requirements.txt | 4 + .../mcp-lakehouse-server/.dockerignore | 72 ++ .../mcp-lakehouse-server/.gitignore | 1 + .../mcp-lakehouse-server/M2M_TEST_RESULTS.md | 109 +++ .../athena_tools_secure.py | 370 ++++++++ .../mcp-lakehouse-server/check_logs.sh | 48 ++ .../check_runtime_logs.py | 143 ++++ .../deployment/mcp-lakehouse-server/deploy.sh | 56 ++ .../mcp-lakehouse-server/deploy_runtime.py | 494 +++++++++++ .../mcp-lakehouse-server/requirements.txt | 5 + .../deployment/mcp-lakehouse-server/server.py | 361 ++++++++ .../mcp-lakehouse-server/simple_mcp_test.py | 307 +++++++ 02-use-cases/lakehouse-agent/requirements.txt | 26 + .../screenshots/testuser1-lakehouseagent.png | Bin 0 -> 359606 bytes .../screenshots/testuser2-lakehouseagent.png | Bin 0 -> 356777 bytes .../streamlit-ui/requirements.txt | 3 + .../streamlit-ui/streamlit_app.py | 444 ++++++++++ .../test/check_agent_status.py | 243 ++++++ .../lakehouse-agent/test/check_logs.sh | 45 + .../test/test_agent_no_gateway.py | 118 +++ .../lakehouse-agent/test/test_agent_simple.py | 121 +++ .../lakehouse-agent/test/test_e2e_flow.py | 132 +++ .../test/test_e2e_with_user.py | 177 ++++ .../test/test_ssm_validation.py | 628 ++++++++++++++ .../lakehouse-agent/utils/__init__.py | 0 .../utils/aws_session_utils.py | 548 ++++++++++++ .../lakehouse-agent/utils/check_runtime.py | 29 + .../utils/diagnose_auth_issue.py | 211 +++++ .../utils/find_all_runtimes.py | 159 ++++ .../lakehouse-agent/utils/notebook_init.py | 65 ++ CONTRIBUTORS.md | 5 +- 66 files changed, 13441 insertions(+), 1 deletion(-) create mode 100644 02-use-cases/lakehouse-agent/.gitignore create mode 100644 02-use-cases/lakehouse-agent/00-prerequisites-setup.ipynb create mode 100644 02-use-cases/lakehouse-agent/01-deploy-athena.ipynb create mode 100644 02-use-cases/lakehouse-agent/02-deploy-cognito.ipynb create mode 100644 02-use-cases/lakehouse-agent/03-deploy-mcp-server.ipynb create mode 100644 02-use-cases/lakehouse-agent/04-deploy-gateway.ipynb create mode 100644 02-use-cases/lakehouse-agent/05-deploy-agent.ipynb create mode 100644 02-use-cases/lakehouse-agent/06-streamlit-ui-deployment.ipynb create mode 100644 02-use-cases/lakehouse-agent/07-optional-cleanup.ipynb create mode 100644 02-use-cases/lakehouse-agent/Lakehouse-agent-architecture.png create mode 100644 02-use-cases/lakehouse-agent/README.md create mode 100644 02-use-cases/lakehouse-agent/deployment/athena-setup/create_tables.sql create mode 100644 02-use-cases/lakehouse-agent/deployment/athena-setup/sample_data.sql create mode 100644 02-use-cases/lakehouse-agent/deployment/athena-setup/setup_athena.py create mode 100755 02-use-cases/lakehouse-agent/deployment/cognito-setup/check_m2m_client.py create mode 100644 02-use-cases/lakehouse-agent/deployment/cognito-setup/decode_token.py create mode 100644 02-use-cases/lakehouse-agent/deployment/cognito-setup/setup_cognito.py create mode 100755 02-use-cases/lakehouse-agent/deployment/gateway-setup/check_users.py create mode 100755 02-use-cases/lakehouse-agent/deployment/gateway-setup/cleanup_test_users.py create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/create_gateway.py create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/create_lambda_role.py create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/decode_user_token.py create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/.gitignore create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/deploy.sh create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/lambda_function.py create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/requirements.txt create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/test_gateway.py create mode 100644 02-use-cases/lakehouse-agent/deployment/gateway-setup/update_interceptor_env.py create mode 100644 02-use-cases/lakehouse-agent/deployment/iam-policies/README.md create mode 100644 02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-admin-policy.json create mode 100644 02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-read-policy.json create mode 100644 02-use-cases/lakehouse-agent/deployment/lakehouse-agent/.dockerignore create mode 100644 02-use-cases/lakehouse-agent/deployment/lakehouse-agent/Dockerfile create mode 100644 02-use-cases/lakehouse-agent/deployment/lakehouse-agent/deploy_lakehouse_agent.py create mode 100644 02-use-cases/lakehouse-agent/deployment/lakehouse-agent/lakehouse_agent.py create mode 100644 02-use-cases/lakehouse-agent/deployment/lakehouse-agent/requirements.txt create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.dockerignore create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.gitignore create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/M2M_TEST_RESULTS.md create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/athena_tools_secure.py create mode 100755 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_logs.sh create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_runtime_logs.py create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy.sh create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy_runtime.py create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/requirements.txt create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/server.py create mode 100644 02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/simple_mcp_test.py create mode 100644 02-use-cases/lakehouse-agent/requirements.txt create mode 100644 02-use-cases/lakehouse-agent/screenshots/testuser1-lakehouseagent.png create mode 100644 02-use-cases/lakehouse-agent/screenshots/testuser2-lakehouseagent.png create mode 100644 02-use-cases/lakehouse-agent/streamlit-ui/requirements.txt create mode 100644 02-use-cases/lakehouse-agent/streamlit-ui/streamlit_app.py create mode 100644 02-use-cases/lakehouse-agent/test/check_agent_status.py create mode 100755 02-use-cases/lakehouse-agent/test/check_logs.sh create mode 100644 02-use-cases/lakehouse-agent/test/test_agent_no_gateway.py create mode 100644 02-use-cases/lakehouse-agent/test/test_agent_simple.py create mode 100644 02-use-cases/lakehouse-agent/test/test_e2e_flow.py create mode 100644 02-use-cases/lakehouse-agent/test/test_e2e_with_user.py create mode 100644 02-use-cases/lakehouse-agent/test/test_ssm_validation.py create mode 100644 02-use-cases/lakehouse-agent/utils/__init__.py create mode 100644 02-use-cases/lakehouse-agent/utils/aws_session_utils.py create mode 100644 02-use-cases/lakehouse-agent/utils/check_runtime.py create mode 100644 02-use-cases/lakehouse-agent/utils/diagnose_auth_issue.py create mode 100644 02-use-cases/lakehouse-agent/utils/find_all_runtimes.py create mode 100644 02-use-cases/lakehouse-agent/utils/notebook_init.py diff --git a/02-use-cases/lakehouse-agent/.gitignore b/02-use-cases/lakehouse-agent/.gitignore new file mode 100644 index 00000000..70b5369d --- /dev/null +++ b/02-use-cases/lakehouse-agent/.gitignore @@ -0,0 +1,60 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python + +# Virtual environments +venv/ +env/ +ENV/ +.venv/ +.parent_venv/ + +# Jupyter Notebook +.ipynb_checkpoints +*.ipynb_checkpoints/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# AWS +.aws/ +*.pem +.env +.env.local +.env.*.local + +# Logs +*.log +logs/ + +# Distribution / packaging +dist/ +build/ +*.egg-info/ + +# Testing +.pytest_cache/ +.coverage +htmlcov/ + +# Temporary files +*.tmp +*.bak +*.swp + +# AgentCore specific +.bedrock_agentcore/ +.bedrock_agentcore.yaml +.agentcore.yaml +.agentcore.json diff --git a/02-use-cases/lakehouse-agent/00-prerequisites-setup.ipynb b/02-use-cases/lakehouse-agent/00-prerequisites-setup.ipynb new file mode 100644 index 00000000..60443ddb --- /dev/null +++ b/02-use-cases/lakehouse-agent/00-prerequisites-setup.ipynb @@ -0,0 +1,369 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lakehouse Agent - Prerequisites Setup\n", + "\n", + "This notebook helps you set up the initial configuration in AWS Systems Manager (SSM) Parameter Store.\n", + "\n", + "**What this notebook does:**\n", + "- Validates your AWS credentials and region\n", + "- Reads AWS Account credentials from .env current directory\n", + "- Creates S3 bucket for lakehouse data storage\n", + "- Creates initial SSM parameters with the `/app/lakehouse-agent/` prefix\n", + "- Validates the configuration\n", + "\n", + "**Prerequisites:**\n", + "- AWS credentials configured (via AWS CLI or environment variables)\n", + "- Python 3.10 or later\n", + "- boto3 installed: `pip install boto3`\n", + "\n", + "**IAM Permissions Required:**\n", + "- `ssm:PutParameter`\n", + "- `ssm:GetParameter`\n", + "- `sts:GetCallerIdentity`\n", + "- `s3:CreateBucket`\n", + "- `s3:HeadBucket`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "from datetime import datetime\n", + "\n", + "print(\"āœ… Imports successful\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ensure you have .env file in current working directory with the AWS credentials:\n", + "AWS_ACCESS_KEY_ID=\"your aws key\"\n", + "AWS_SECRET_ACCESS_KEY=\"your aws secret\"\n", + "AWS_SESSION_TOKEN=\"session token\"\n", + "AWS_DEFAULT_REGION=\"your preferred region\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load AWS credentials and initialize session\n", + "from utils.notebook_init import init_aws\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, region, account_id = init_aws()\n", + "\n", + "# Initialize AWS clients with the validated session\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "sts_client = session.client('sts', region_name=region)\n", + "\n", + "# Store for later use\n", + "AWS_REGION = region\n", + "AWS_ACCOUNT_ID = account_id\n", + "\n", + "print(f'\\nāœ… Setup complete')\n", + "print(f' Account ID: {account_id}')\n", + "print(f' Region: {region}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Define Initial Configuration\n", + "\n", + "Set your initial configuration values. These will be stored in SSM Parameter Store with the `/app/lakehouse-agent/` prefix.\n", + "\n", + "**Important Notes:**\n", + "- **AWS_REGION and AWS_ACCOUNT_ID** are auto-detected and NOT stored in SSM\n", + "- **S3_BUCKET_NAME**: Provide just the base name (e.g., `lk-agent`)\n", + " - This notebook will create the S3 bucket with full name: `{account_id}-{region}-{base_name}`\n", + " - The full bucket name will be saved to SSM for all subsequent notebooks\n", + " - Example: `XXXXXXXXXXXX-us-east-1-lk-agent`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initial configuration - UPDATE THESE VALUES\n", + "config = {\n", + " # S3 Configuration\n", + " # NOTE: Provide just the base name (e.g., 'lk-agent')\n", + " # The deployment script will create a bucket with the full name:\n", + " # {account_id}-{region}-{base_name}\n", + " # Example: XXXXXXXXXXXX-us-east-1-lk-agent\n", + " 'S3_BUCKET_NAME': 'lk-agent', # CHANGE THIS - use a unique base name\n", + " 'S3_CLAIMS_PREFIX': 'lakehouse-data/claims/',\n", + " 'S3_USERS_PREFIX': 'lakehouse-data/users/',\n", + " 'S3_ATHENA_RESULTS_PREFIX': 'athena-results/',\n", + " \n", + " # Athena Configuration\n", + " 'DATABASE_NAME': 'lakehouse_db',\n", + " 'ATHENA_WORKGROUP': 'primary',\n", + " \n", + " # Security Configuration\n", + " 'SECURITY_MODE': 'lakeformation',\n", + " 'LOCAL_DEVELOPMENT': 'false',\n", + " 'LOG_LEVEL': 'INFO',\n", + " \n", + " # Test Users\n", + " 'TEST_USER_1': 'user001@example.com',\n", + " 'TEST_USER_2': 'user002@example.com',\n", + " 'TEST_USER_3': 'adjuster001@example.com',\n", + " 'TEST_PASSWORD': 'TempPass123!'\n", + "}\n", + "\n", + "print(\"šŸ“‹ Initial Configuration:\")\n", + "for key, value in config.items():\n", + " if key == 'S3_BUCKET_NAME':\n", + " print(f\" {key}: {value}\")\n", + " print(f\" → Full bucket name will be: {account_id}-{region}-{value}\")\n", + " else:\n", + " print(f\" {key}: {value}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Create SSM Parameters\n", + "\n", + "This will create all parameters in SSM Parameter Store with the `/app/lakehouse-agent/` prefix.\n", + "\n", + "**Sensitive parameters** (containing SECRET, PASSWORD, KEY) will be created as SecureString." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def is_sensitive(key):\n", + " \"\"\"Check if parameter should be SecureString\"\"\"\n", + " sensitive_keywords = ['SECRET', 'PASSWORD', 'KEY', 'TOKEN']\n", + " return any(keyword in key.upper() for keyword in sensitive_keywords)\n", + "\n", + "def create_ssm_parameter(key, value, overwrite=False):\n", + " \"\"\"Create or update SSM parameter\"\"\"\n", + " # Convert to SSM parameter name (lowercase with /app/lakehouse-agent/ prefix)\n", + " # Convert underscores to hyphens for consistency\n", + " param_name = f\"/app/lakehouse-agent/{key.lower().replace('_', '-')}\"\n", + " param_type = 'SecureString' if is_sensitive(key) else 'String'\n", + " \n", + " try:\n", + " ssm_client.put_parameter(\n", + " Name=param_name,\n", + " Value=str(value),\n", + " Type=param_type,\n", + " Description=f\"Lakehouse Agent - {key}\",\n", + " Overwrite=overwrite\n", + " )\n", + " return True, param_type\n", + " except ssm_client.exceptions.ParameterAlreadyExists:\n", + " return False, param_type\n", + " except Exception as e:\n", + " print(f\"āŒ Error creating {param_name}: {e}\")\n", + " return None, param_type\n", + "\n", + "# Create parameters\n", + "print(\"šŸ”„ Creating SSM Parameters...\\n\")\n", + "created = 0\n", + "skipped = 0\n", + "failed = 0\n", + "\n", + "for key, value in config.items():\n", + " result, param_type = create_ssm_parameter(key, value, overwrite=False)\n", + " param_name = f\"/app/lakehouse-agent/{key.lower().replace('_', '-')}\"\n", + " \n", + " if result is True:\n", + " print(f\"āœ… Created {param_name} ({param_type})\")\n", + " created += 1\n", + " elif result is False:\n", + " print(f\"ā­ļø Skipped {param_name} (already exists)\")\n", + " skipped += 1\n", + " else:\n", + " failed += 1\n", + "\n", + "print(f\"\\nšŸ“Š Summary:\")\n", + "print(f\" Created: {created}\")\n", + "print(f\" Skipped: {skipped}\")\n", + "print(f\" Failed: {failed}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2.5: Create S3 Bucket\n", + "\n", + "Create the S3 bucket that will be used for all lakehouse data storage. The bucket will be created with the full name format: `{account_id}-{region}-{base_name}` and the full name will be saved to SSM." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create S3 bucket with full name\n", + "bucket_base_name = config['S3_BUCKET_NAME']\n", + "full_bucket_name = f\"{account_id}-{region}-{bucket_base_name}\"\n", + "\n", + "print(f\"šŸ“¦ Creating S3 bucket: {full_bucket_name}\\n\")\n", + "\n", + "# Initialize S3 client\n", + "s3_client = session.client('s3', region_name=region)\n", + "\n", + "try:\n", + " # Check if bucket already exists\n", + " s3_client.head_bucket(Bucket=full_bucket_name)\n", + " print(f\"āœ… Bucket {full_bucket_name} already exists\")\n", + " bucket_existed = True\n", + "except:\n", + " # Bucket doesn't exist, create it\n", + " try:\n", + " if region == 'us-east-1':\n", + " s3_client.create_bucket(Bucket=full_bucket_name)\n", + " else:\n", + " s3_client.create_bucket(\n", + " Bucket=full_bucket_name,\n", + " CreateBucketConfiguration={'LocationConstraint': region}\n", + " )\n", + " print(f\"āœ… Created S3 bucket: {full_bucket_name}\")\n", + " bucket_existed = False\n", + " except Exception as e:\n", + " print(f\"āŒ Error creating bucket: {e}\")\n", + " raise\n", + "\n", + "# Update SSM parameter with the full bucket name\n", + "print(f\"\\nšŸ’¾ Saving full bucket name to SSM...\")\n", + "try:\n", + " ssm_client.put_parameter(\n", + " Name='/app/lakehouse-agent/s3-bucket-name',\n", + " Value=full_bucket_name,\n", + " Type='String',\n", + " Description='S3 bucket name for lakehouse data storage (full name)',\n", + " Overwrite=True\n", + " )\n", + " print(f\"āœ… Updated SSM parameter /app/lakehouse-agent/s3-bucket-name\")\n", + " print(f\" Value: {full_bucket_name}\")\n", + "except Exception as e:\n", + " print(f\"āŒ Error updating SSM parameter: {e}\")\n", + " raise\n", + "\n", + "print(f\"\\nāœ… S3 bucket setup complete!\")\n", + "print(f\" Bucket: s3://{full_bucket_name}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Validate Configuration\n", + "\n", + "Let's verify all parameters were created successfully and the S3 bucket is accessible." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def validate_ssm_parameters():\n", + " \"\"\"Validate all required parameters exist in SSM\"\"\"\n", + " print(\"šŸ” Validating SSM Parameters...\\n\")\n", + " \n", + " missing = []\n", + " found = []\n", + " \n", + " for key in config.keys():\n", + " param_name = f\"/app/lakehouse-agent/{key.lower().replace('_', '-')}\"\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param_name)\n", + " param_type = response['Parameter']['Type']\n", + " \n", + " if param_type == 'SecureString':\n", + " value = '****** (encrypted)'\n", + " else:\n", + " value = response['Parameter']['Value']\n", + " \n", + " print(f\"āœ… {param_name}: {value}\")\n", + " found.append(param_name)\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f\"āŒ {param_name}: NOT FOUND\")\n", + " missing.append(param_name)\n", + " \n", + " print(f\"\\nšŸ“Š Validation Summary:\")\n", + " print(f\" Found: {len(found)}\")\n", + " print(f\" Missing: {len(missing)}\")\n", + " \n", + " if missing:\n", + " print(f\"\\nāš ļø Missing parameters: {', '.join(missing)}\")\n", + " return False\n", + " else:\n", + " print(f\"\\nāœ… All parameters validated successfully!\")\n", + " return True\n", + "\n", + "validate_ssm_parameters()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next Steps\n", + "\n", + "āœ… **Prerequisites Complete!**\n", + "\n", + "Your configuration is ready:\n", + "- āœ… SSM Parameter Store configured\n", + "- āœ… S3 bucket created: `{full_bucket_name}`\n", + "- āœ… All parameters validated\n", + "\n", + "**Next:** Run `01-deploy-athena.ipynb` to create the Athena database and tables.\n", + "\n", + "The Athena deployment will automatically use the S3 bucket created in this notebook." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/01-deploy-athena.ipynb b/02-use-cases/lakehouse-agent/01-deploy-athena.ipynb new file mode 100644 index 00000000..8c8b6470 --- /dev/null +++ b/02-use-cases/lakehouse-agent/01-deploy-athena.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lakehouse Agent - Deploy Athena Database\n", + "\n", + "This notebook deploys the Athena database and tables for the lakehouse data layer.\n", + "\n", + "**What this notebook does:**\n", + "- Uses the S3 bucket created in prerequisites setup\n", + "- Uploads sample claims and users data to S3\n", + "- Creates Athena database: `lakehouse_db`\n", + "- Creates tables: `claims` and `users`\n", + "- Verifies deployment with test queries\n", + "\n", + "**Prerequisites:**\n", + "- āœ… Completed `00-prerequisites-setup.ipynb` (S3 bucket must be created)\n", + "- āœ… SSM parameters configured with `/app/lakehouse-agent/` prefix\n", + "- āœ… AWS credentials with Athena, S3, and Glue permissions\n", + "\n", + "**IAM Permissions Required:**\n", + "- `athena:*`\n", + "- `s3:*`\n", + "- `glue:*`\n", + "- `ssm:GetParameter`\n", + "\n", + "**Duration:** ~10 minutes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# AWS Initialization - Load credentials and create session\n", + "from utils.notebook_init import init_aws\n", + "import subprocess\n", + "from pathlib import Path\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session (env vars take precedence over SSO)\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, region, account_id = init_aws()\n", + "\n", + "print(f\"āœ… Ready to proceed with AWS operations\")\n", + "print(f\" Account ID: {account_id}\")\n", + "print(f\" Region: {region}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Validate Prerequisites\n", + "\n", + "Check that all required SSM parameters from the previous notebook exist." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize AWS clients using the validated session from cell 1\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "\n", + "# Check required parameters with new naming convention\n", + "print(\"šŸ” Validating prerequisites...\\n\")\n", + "\n", + "required_params = [\n", + " '/app/lakehouse-agent/s3-bucket-name',\n", + " '/app/lakehouse-agent/database-name',\n", + " '/app/lakehouse-agent/athena-workgroup'\n", + "]\n", + "\n", + "missing = []\n", + "config_values = {}\n", + "\n", + "for param in required_params:\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param)\n", + " value = response['Parameter']['Value']\n", + " # Extract key name for config_values dict\n", + " key = param.split('/')[-1]\n", + " config_values[key] = value\n", + " print(f\"āœ… {param}: {value}\")\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f\"āŒ {param}: NOT FOUND\")\n", + " missing.append(param)\n", + "\n", + "if missing:\n", + " print(f\"\\nāŒ Missing parameters: {', '.join(missing)}\")\n", + " print(\"Please run 00-prerequisites-setup.ipynb first\")\n", + "else:\n", + " print(\"\\nāœ… All prerequisites validated!\")\n", + " \n", + " # Load configuration from SSM\n", + " BUCKET_NAME = config_values['s3-bucket-name']\n", + " DATABASE_NAME = config_values['database-name']\n", + " WORKGROUP = config_values.get('athena-workgroup', 'primary')\n", + " \n", + " print(f\"\\nšŸ“‹ Configuration:\")\n", + " print(f\" Bucket: {BUCKET_NAME}\")\n", + " print(f\" Database: {DATABASE_NAME}\")\n", + " print(f\" Workgroup: {WORKGROUP}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Deploy Athena Database\n", + "\n", + "Run the Athena setup script to create the database, tables, and upload sample data.\n", + "\n", + "**Note**: The S3 bucket was already created in the prerequisites notebook. This step will use that existing bucket and create Athena tables on top of it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸš€ Running Athena setup...\\n\")\n", + "\n", + "print(f\"šŸ“¦ Using S3 bucket from SSM: {BUCKET_NAME}\")\n", + "print(f\" The setup script will read this from SSM Parameter Store\")\n", + "print()\n", + "\n", + "# Run setup_athena.py WITHOUT --bucket-name argument\n", + "# The script will automatically read the bucket name from SSM Parameter Store\n", + "result = subprocess.run(\n", + " ['python', 'setup_athena.py'],\n", + " cwd='deployment/athena-setup',\n", + " capture_output=True,\n", + " text=True\n", + ")\n", + "\n", + "print(result.stdout)\n", + "\n", + "if result.returncode != 0:\n", + " print(\"āŒ Error during Athena setup:\")\n", + " print(result.stderr)\n", + "else:\n", + " print(\"\\nāœ… Athena setup completed successfully!\")\n", + " print(\"\\nšŸ’¾ Database and tables created using existing S3 bucket\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Validate Deployment\n", + "\n", + "Verify that the database and tables were created successfully." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ” Validating Athena deployment...\\n\")\n", + "\n", + "# Use session from cell 1 to create AWS clients\n", + "athena_client = session.client('athena', region_name=region)\n", + "glue_client = session.client('glue', region_name=region)\n", + "\n", + "# Check database exists\n", + "try:\n", + " response = glue_client.get_database(Name=DATABASE_NAME)\n", + " print(f\"āœ… Database '{DATABASE_NAME}' exists\")\n", + "except glue_client.exceptions.EntityNotFoundException:\n", + " print(f\"āŒ Database '{DATABASE_NAME}' not found\")\n", + "\n", + "# Check tables exist\n", + "try:\n", + " response = glue_client.get_tables(DatabaseName=DATABASE_NAME)\n", + " tables = response['TableList']\n", + " \n", + " print(f\"\\nšŸ“‹ Tables in {DATABASE_NAME}:\")\n", + " for table in tables:\n", + " table_name = table['Name']\n", + " column_count = len(table['StorageDescriptor']['Columns'])\n", + " print(f\" • {table_name} ({column_count} columns)\")\n", + " \n", + " if len(tables) >= 2:\n", + " print(\"\\nāœ… All tables created successfully\")\n", + " else:\n", + " print(f\"\\nāš ļø Expected 2 tables, found {len(tables)}\")\n", + " \n", + "except Exception as e:\n", + " print(f\"āŒ Error checking tables: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next Steps\n", + "\n", + "āœ… **Athena Database Deployment Complete!**\n", + "\n", + "Your Athena database is now set up with:\n", + "- Database: `lakehouse_db`\n", + "- Tables: `claims` (9 sample claims), `users` (3 test users)\n", + "- S3 data location: `s3://{BUCKET_NAME}/lakehouse-data/`\n", + "\n", + "**Next:** Run `02-deploy-cognito.ipynb` to set up authentication.\n", + "\n", + "### Test Queries\n", + "\n", + "You can test the deployment with these queries in the Athena console:\n", + "\n", + "```sql\n", + "-- Count all claims\n", + "SELECT COUNT(*) as total_claims FROM lakehouse_db.claims;\n", + "\n", + "-- View claims for user001\n", + "SELECT claim_id, claim_type, claim_status, claim_amount \n", + "FROM lakehouse_db.claims \n", + "WHERE user_id = 'user001@example.com';\n", + "\n", + "-- View all users\n", + "SELECT * FROM lakehouse_db.users;\n", + "```\n", + "\n", + "### Verify SSM Parameters\n", + "\n", + "The setup script automatically saves configuration to SSM:\n", + "```bash\n", + "aws ssm get-parameter --name /app/lakehouse-agent/s3-bucket-name\n", + "aws ssm get-parameter --name /app/lakehouse-agent/database-name\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/02-deploy-cognito.ipynb b/02-use-cases/lakehouse-agent/02-deploy-cognito.ipynb new file mode 100644 index 00000000..cb25ceb3 --- /dev/null +++ b/02-use-cases/lakehouse-agent/02-deploy-cognito.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploy Cognito\n", + "\n", + "Set up user authentication with AWS Cognito." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- āœ… Run `01-deploy-athena.ipynb` first\n", + "\n", + "## What This Notebook Does\n", + "\n", + "1. Creates Cognito User Pool\n", + "2. Creates App Client with OAuth scopes\n", + "3. Creates test users\n", + "4. Saves configuration to SSM\n", + "\n", + "## Next Notebook\n", + "\n", + "- **03-deploy-mcp-server.ipynb**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# AWS Initialization - Load credentials and create session\n", + "from utils.notebook_init import init_aws\n", + "from pathlib import Path\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session (env vars take precedence over SSO)\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, region, account_id = init_aws()\n", + "\n", + "# Initialize AWS clients\n", + "cognito_client = session.client('cognito-idp', region_name=region)\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "\n", + "print(f\"āœ… Ready to proceed with AWS operations\")\n", + "print(f\" Account ID: {account_id}\")\n", + "print(f\" Region: {region}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Run Cognito Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "\n", + "result = subprocess.run(\n", + " ['python', 'setup_cognito.py', '--region', region],\n", + " cwd='deployment/cognito-setup',\n", + " capture_output=True,\n", + " text=True\n", + ")\n", + "\n", + "print(result.stdout)\n", + "if result.returncode != 0:\n", + " print('āŒ Error:', result.stderr)\n", + "else:\n", + " print('\\nāœ… Cognito setup complete!')\n", + " print('\\nšŸ“‹ Configuration automatically saved to SSM Parameter Store')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Verify Cognito Configuration in SSM\n", + "\n", + "The setup_cognito.py script automatically saves all configuration to SSM Parameter Store.\n", + "Run this cell to verify the parameters were saved correctly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Verify Cognito Configuration in SSM Parameter Store\n", + "\n", + "print(\"Verifying Cognito parameters in SSM Parameter Store...\\n\")\n", + "\n", + "# List of parameters to check\n", + "parameters_to_check = [\n", + " '/app/lakehouse-agent/cognito-user-pool-id',\n", + " '/app/lakehouse-agent/cognito-app-client-id',\n", + " '/app/lakehouse-agent/cognito-domain',\n", + " '/app/lakehouse-agent/cognito-resource-server-id',\n", + "]\n", + "\n", + "# Check each parameter\n", + "all_found = True\n", + "for param_name in parameters_to_check:\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param_name)\n", + " value = response['Parameter']['Value']\n", + " # Mask sensitive values\n", + " display_value = value[:30] + '...' if len(value) > 30 else value\n", + " print(f'āœ… {param_name}')\n", + " print(f' Value: {display_value}')\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f'āŒ {param_name} - NOT FOUND')\n", + " all_found = False\n", + " except Exception as e:\n", + " print(f'āš ļø {param_name} - ERROR: {e}')\n", + " all_found = False\n", + "\n", + "# Check secure parameters (without displaying values)\n", + "secure_params = [\n", + " '/app/lakehouse-agent/cognito-app-client-secret',\n", + "]\n", + "\n", + "for param_name in secure_params:\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param_name, WithDecryption=False)\n", + " print(f'āœ… {param_name} (SecureString)')\n", + " print(f' Value: ***MASKED***')\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f'āŒ {param_name} - NOT FOUND')\n", + " all_found = False\n", + " except Exception as e:\n", + " print(f'āš ļø {param_name} - ERROR: {e}')\n", + "\n", + "if all_found:\n", + " print('\\nāœ… All Cognito parameters verified in SSM Parameter Store!')\n", + "else:\n", + " print('\\nāš ļø Some parameters are missing. Re-run the setup_cognito.py script.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "āœ… **Cognito Deployment Complete!**\n", + "\n", + "**Test Users Created:**\n", + "- user001@example.com / TempPass123!\n", + "- user002@example.com / TempPass123!\n", + "- adjuster001@example.com / TempPass123!\n", + "\n", + "**Next Steps:**\n", + "Run **04-deploy-mcp-server.ipynb**" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/03-deploy-mcp-server.ipynb b/02-use-cases/lakehouse-agent/03-deploy-mcp-server.ipynb new file mode 100644 index 00000000..06d46f8a --- /dev/null +++ b/02-use-cases/lakehouse-agent/03-deploy-mcp-server.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Step 4: Deploy MCP Server\n", + "\n", + "Deploy the MCP Server to AgentCore Runtime." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- āœ… Run `02-deploy-cognito.ipynb` first\n", + "- āœ… Docker installed and running\n", + "\n", + "## What This Notebook Does\n", + "\n", + "1. Deploys MCP Server to AgentCore Runtime\n", + "2. Configures JWT authentication with Cognito\n", + "3. Saves Runtime ARN to SSM\n", + "\n", + "## Next Notebook\n", + "\n", + "- **04-deploy-gateway.ipynb**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# AWS Initialization - Load credentials and create session\n", + "from utils.notebook_init import init_aws\n", + "import os\n", + "from pathlib import Path\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session (env vars take precedence over SSO)\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, region, account_id = init_aws()\n", + "\n", + "# Initialize AWS clients\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "os.environ[\"AWS_DEFAULT_REGION\"] = region\n", + "\n", + "print('āœ… Ready to proceed with AWS operations')\n", + "print(f' Account ID: {account_id}')\n", + "print(f' Region: {region}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Deploy MCP Server\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "\n", + "# Run deploy_runtime.py with --yes flag to skip interactive confirmation\n", + "# This allows the script to run without blocking in the notebook\n", + "result = subprocess.run(\n", + " ['python', 'deploy_runtime.py', '--yes'],\n", + " cwd='deployment/mcp-lakehouse-server',\n", + " capture_output=True,\n", + " text=True\n", + ")\n", + "\n", + "print(result.stdout)\n", + "if result.returncode != 0:\n", + " print('āŒ Error:', result.stderr)\n", + "else:\n", + " print('\\nāœ… MCP Server deployed!')\n", + " print('\\nšŸ“‹ Runtime configuration saved to SSM Parameter Store')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Verify MCP Server Deployment\n", + "\n", + "The deploy_runtime.py script automatically saves the Runtime ARN to SSM.\n", + "Run this cell to verify the deployment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Verify MCP Server Runtime configuration in SSM\n", + "print(\"Verifying MCP Server Runtime in SSM...\\n\")\n", + "\n", + "parameters_to_check = [\n", + " '/app/lakehouse-agent/mcp-server-runtime-arn',\n", + " '/app/lakehouse-agent/mcp-server-runtime-id',\n", + "]\n", + "\n", + "all_found = True\n", + "for param_name in parameters_to_check:\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param_name)\n", + " value = response['Parameter']['Value']\n", + " print(f'āœ… {param_name}')\n", + " print(f' Value: {value}')\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f'āŒ {param_name} - NOT FOUND')\n", + " all_found = False\n", + " except Exception as e:\n", + " print(f'āš ļø {param_name} - ERROR: {e}')\n", + " all_found = False\n", + "\n", + "if all_found:\n", + " print('\\nāœ… MCP Server Runtime configuration verified in SSM!')\n", + "else:\n", + " print('\\nāš ļø MCP Server Runtime parameters missing.')\n", + " print(' The deploy_runtime.py script should have saved these automatically.')\n", + " print(' Check the deployment output for errors.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "āœ… **MCP Server Deployment Complete!**\n", + "\n", + "The MCP Server Runtime has been deployed and configuration saved to SSM Parameter Store.\n", + "\n", + "**Next Steps:**\n", + "Run **04-deploy-gateway.ipynb** to deploy the AgentCore Gateway" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/04-deploy-gateway.ipynb b/02-use-cases/lakehouse-agent/04-deploy-gateway.ipynb new file mode 100644 index 00000000..b3696909 --- /dev/null +++ b/02-use-cases/lakehouse-agent/04-deploy-gateway.ipynb @@ -0,0 +1,237 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploy Gateway & Interceptor\n", + "\n", + "Deploy the AgentCore Gateway and Interceptor Lambda." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- āœ… Run `03-deploy-mcp-server.ipynb` first\n", + "- āœ… MCP Server Runtime ARN saved to SSM\n", + "\n", + "## What This Notebook Does\n", + "\n", + "1. Deploys Gateway Interceptor Lambda\n", + "2. Creates AgentCore Gateway\n", + "3. Configures OAuth token validation\n", + "4. Saves Gateway ARN to SSM\n", + "\n", + "## Next Notebook\n", + "\n", + "- **05-deploy-agent.ipynb**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# AWS Initialization - Load credentials and create session\n", + "from utils.notebook_init import init_aws\n", + "from pathlib import Path\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session (env vars take precedence over SSO)\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, AWS_REGION, AWS_ACCOUNT_ID = init_aws()\n", + "\n", + "# Initialize AWS clients\n", + "lambda_client = session.client('lambda', region_name=AWS_REGION)\n", + "ssm_client = session.client('ssm', region_name=AWS_REGION)\n", + "\n", + "print('āœ… Ready to proceed with AWS operations')\n", + "print(f' Account ID: {AWS_ACCOUNT_ID}')\n", + "print(f' Region: {AWS_REGION}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Deploy Interceptor Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "\n", + "# Run deploy_interceptor.py to deploy Lambda function\n", + "result = subprocess.run(\n", + " ['bash', 'deploy.sh'],\n", + " cwd='deployment/gateway-setup/interceptor',\n", + " capture_output=True,\n", + " text=True\n", + ")\n", + "\n", + "print(result.stdout)\n", + "if result.returncode != 0:\n", + " print('āŒ Error:', result.stderr)\n", + "else:\n", + " print('\\nāœ… Interceptor Lambda deployed!')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Get Required ARNs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get Interceptor Lambda ARN from SSM (saved by deploy_interceptor.py)\n", + "INTERCEPTOR_ARN = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/interceptor-lambda-arn'\n", + ")['Parameter']['Value']\n", + "print(f'āœ… Interceptor ARN: {INTERCEPTOR_ARN}')\n", + "\n", + "# Get MCP Server Runtime ARN from SSM\n", + "MCP_SERVER_RUNTIME_ARN = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/mcp-server-runtime-arn'\n", + ")['Parameter']['Value']\n", + "print(f'āœ… MCP Server ARN: {MCP_SERVER_RUNTIME_ARN}')\n", + "\n", + "# Get Cognito User Pool ARN\n", + "COGNITO_USER_POOL_ID = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/cognito-user-pool-id'\n", + ")['Parameter']['Value']\n", + "COGNITO_USER_POOL_ARN = f'arn:aws:cognito-idp:{AWS_REGION}:{AWS_ACCOUNT_ID}:userpool/{COGNITO_USER_POOL_ID}'\n", + "print(f'āœ… Cognito User Pool ARN: {COGNITO_USER_POOL_ARN}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Create AgentCore Gateway\n", + "\n", + "This will create the gateway and automatically configure it with the MCP server and interceptor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create AgentCore Gateway\n", + "result = subprocess.run([\n", + " 'python', 'create_gateway.py',\n", + " '--yes' # Auto-confirm for notebook execution\n", + "], cwd='deployment/gateway-setup', capture_output=True, text=True)\n", + "\n", + "print(result.stdout)\n", + "if result.returncode != 0:\n", + " print('āŒ Error:', result.stderr)\n", + "else:\n", + " print('\\nāœ… Gateway created!')\n", + " print('\\nšŸ“‹ Gateway ARN saved to SSM Parameter Store')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Verify Gateway Configuration\n", + "\n", + "The create_gateway.py script automatically saves the Gateway ARN to SSM.\n", + "Run this cell to verify the deployment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Verify Gateway configuration in SSM\n", + "print(\"Verifying Gateway configuration in SSM...\\n\")\n", + "\n", + "parameters_to_check = [\n", + " '/app/lakehouse-agent/gateway-arn',\n", + " '/app/lakehouse-agent/gateway-id',\n", + " '/app/lakehouse-agent/gateway-url',\n", + "]\n", + "\n", + "all_found = True\n", + "for param_name in parameters_to_check:\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param_name)\n", + " value = response['Parameter']['Value']\n", + " print(f'āœ… {param_name}')\n", + " print(f' Value: {value}')\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f'āŒ {param_name} - NOT FOUND')\n", + " all_found = False\n", + " except Exception as e:\n", + " print(f'āš ļø {param_name} - ERROR: {e}')\n", + " all_found = False\n", + "\n", + "if all_found:\n", + " print('\\nāœ… Gateway configuration verified in SSM!')\n", + "else:\n", + " print('\\nāš ļø Gateway parameters missing.')\n", + " print(' The create_gateway.py script should have saved these automatically.')\n", + " print(' Check the deployment output for errors.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "āœ… **Gateway & Interceptor Deployment Complete!**\n", + "\n", + "**What was created:**\n", + "- Interceptor Lambda (JWT validation)\n", + "- AgentCore Gateway (routing)\n", + "\n", + "All configuration saved to SSM Parameter Store.\n", + "\n", + "**Next Steps:**\n", + "Run **05-deploy-agent.ipynb**" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/05-deploy-agent.ipynb b/02-use-cases/lakehouse-agent/05-deploy-agent.ipynb new file mode 100644 index 00000000..d02601a7 --- /dev/null +++ b/02-use-cases/lakehouse-agent/05-deploy-agent.ipynb @@ -0,0 +1,184 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploy Lakehouse Agent\n", + "\n", + "Deploy the Lakehouse Agent to AgentCore Runtime." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- āœ… Run `04-deploy-gateway.ipynb` first\n", + "- āœ… Gateway ARN saved to SSM\n", + "- āœ… Docker installed and running\n", + "\n", + "## What This Notebook Does\n", + "\n", + "1. Deploys Lakehouse Agent to AgentCore Runtime\n", + "2. Configures Gateway integration\n", + "3. Saves Agent Runtime ARN to SSM\n", + "\n", + "## Next Notebook\n", + "\n", + "- **06-streamlit-ui-deployment.ipynb**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# AWS Initialization - Load credentials and create session\n", + "from utils.notebook_init import init_aws\n", + "from pathlib import Path\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session (env vars take precedence over SSO)\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, region, account_id = init_aws()\n", + "\n", + "# Initialize AWS clients\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "\n", + "# Load Gateway ARN from SSM\n", + "try:\n", + " gateway_arn = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/gateway-arn'\n", + " )['Parameter']['Value']\n", + " print('āœ… Ready to proceed with AWS operations')\n", + " print(f' Account ID: {account_id}')\n", + " print(f' Region: {region}')\n", + " print(f' Gateway ARN: {gateway_arn}')\n", + "except ssm_client.exceptions.ParameterNotFound:\n", + " print('āœ… Ready to proceed with AWS operations')\n", + " print(f' Account ID: {account_id}')\n", + " print(f' Region: {region}')\n", + " print('āŒ Gateway ARN not found in SSM')\n", + " print(' Please run 04-deploy-gateway.ipynb first')\n", + " gateway_arn = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Deploy Lakehouse Agent" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "\n", + "# Run deploy_lakehouse_agent.py with --yes flag to skip interactive prompts\n", + "result = subprocess.run(\n", + " ['python', 'deploy_lakehouse_agent.py', '--yes'],\n", + " cwd='deployment/lakehouse-agent',\n", + " capture_output=True,\n", + " text=True\n", + ")\n", + "\n", + "print(result.stdout)\n", + "if result.returncode != 0:\n", + " print('āŒ Error:', result.stderr)\n", + "else:\n", + " print('\\nāœ… Lakehouse Agent deployed!')\n", + " print('\\nšŸ“‹ Configuration automatically saved to SSM')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Verify Agent Deployment\n", + "\n", + "The deploy_lakehouse_agent.py script automatically saves the Runtime ARN to SSM.\n", + "Run this cell to verify the deployment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Verify Agent configuration in SSM\n", + "print(\"Verifying Agent Runtime configuration in SSM...\\n\")\n", + "\n", + "parameters_to_check = [\n", + " '/app/lakehouse-agent/agent-runtime-arn',\n", + " '/app/lakehouse-agent/agent-runtime-id',\n", + " '/app/lakehouse-agent/agent-name',\n", + "]\n", + "\n", + "all_found = True\n", + "for param_name in parameters_to_check:\n", + " try:\n", + " response = ssm_client.get_parameter(Name=param_name)\n", + " value = response['Parameter']['Value']\n", + " print(f'āœ… {param_name}')\n", + " print(f' Value: {value}')\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print(f'āš ļø {param_name} - NOT FOUND (optional)')\n", + " if 'agent-runtime-arn' in param_name:\n", + " all_found = False\n", + " except Exception as e:\n", + " print(f'āš ļø {param_name} - ERROR: {e}')\n", + "\n", + "if all_found:\n", + " print('\\nāœ… Agent Runtime configuration verified in SSM!')\n", + "else:\n", + " print('\\nāŒ Agent Runtime ARN missing in SSM.')\n", + " print(' The deploy_lakehouse_agent.py script should have saved this automatically.')\n", + " print(' Check the deployment output for errors.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "āœ… **Lakehouse Agent Deployment Complete!**\n", + "\n", + "The Agent Runtime has been deployed and configuration saved to SSM Parameter Store.\n", + "\n", + "**Next Steps:**\n", + "Run **06-streamlit-ui-deployment.ipynb** to test the complete system" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/06-streamlit-ui-deployment.ipynb b/02-use-cases/lakehouse-agent/06-streamlit-ui-deployment.ipynb new file mode 100644 index 00000000..0750f796 --- /dev/null +++ b/02-use-cases/lakehouse-agent/06-streamlit-ui-deployment.ipynb @@ -0,0 +1,395 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test Deployment and run Streamlit App\n", + "\n", + "Test the complete lakehouse agent system end-to-end." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- āœ… Run `05-deploy-agent.ipynb` first\n", + "- āœ… All components deployed\n", + "\n", + "## What This Notebook Does\n", + "\n", + "1. Tests OAuth token generation from Cognito\n", + "2. Tests agent invocation with bearer token\n", + "3. Validates end-to-end flow (User → Agent → Gateway → MCP)\n", + "4. Verifies agent responses with conversational AI\n", + "5. Launches Streamlit UI for interactive testing\n", + "\n", + "## Important Notes\n", + "\n", + "āš ļø **Run cells in order**: Start with the Setup cell (cell 2) to initialize AWS session and clients before running other cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ============================================================================\n", + "# SETUP CELL - Run this first to initialize AWS session and clients\n", + "# ============================================================================\n", + "\n", + "# AWS Initialization - Load credentials and create session\n", + "from utils.notebook_init import init_aws\n", + "from pathlib import Path\n", + "import json\n", + "import base64\n", + "import requests\n", + "import uuid\n", + "import urllib.parse\n", + "\n", + "# This will:\n", + "# 1. Load credentials from .env file (if it exists)\n", + "# 2. Create and validate AWS session (env vars take precedence over SSO)\n", + "# 3. Return session, region, and account_id for use in this notebook\n", + "session, region, account_id = init_aws()\n", + "\n", + "# Initialize AWS clients\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "\n", + "print('āœ… Ready to proceed with AWS operations')\n", + "print(f' Account ID: {account_id}')\n", + "print(f' Region: {region}')\n", + "print('\\nšŸ“ Architecture: User → Agent Runtime → Gateway → MCP Server')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Get OAuth Token from Cognito" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import base64 # Import here for cell independence\n", + "import requests\n", + "import json\n", + "\n", + "# Get Cognito configuration from SSM\n", + "COGNITO_DOMAIN = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/cognito-domain'\n", + ")['Parameter']['Value']\n", + "\n", + "CLIENT_ID = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/cognito-app-client-id'\n", + ")['Parameter']['Value']\n", + "\n", + "CLIENT_SECRET = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/cognito-app-client-secret',\n", + " WithDecryption=True\n", + ")['Parameter']['Value']\n", + "\n", + "print(f'šŸ” Cognito Configuration:')\n", + "print(f' Domain: {COGNITO_DOMAIN}')\n", + "print(f' Client ID: {CLIENT_ID}')\n", + "\n", + "# Request token\n", + "token_url = f'{COGNITO_DOMAIN}/oauth2/token'\n", + "credentials = f'{CLIENT_ID}:{CLIENT_SECRET}'\n", + "encoded_credentials = base64.b64encode(credentials.encode()).decode()\n", + "\n", + "headers = {\n", + " 'Authorization': f'Basic {encoded_credentials}',\n", + " 'Content-Type': 'application/x-www-form-urlencoded'\n", + "}\n", + "\n", + "data = {\n", + " 'grant_type': 'client_credentials',\n", + " 'scope': 'lakehouse-api/claims.query'\n", + "}\n", + "\n", + "print('\\nšŸ”‘ Requesting OAuth token...')\n", + "response = requests.post(token_url, headers=headers, data=data)\n", + "\n", + "if response.status_code == 200:\n", + " token_data = response.json()\n", + " ACCESS_TOKEN = token_data['access_token']\n", + " print('āœ… OAuth token obtained successfully!')\n", + " print(f' Token type: {token_data.get(\"token_type\")}')\n", + " print(f' Expires in: {token_data.get(\"expires_in\")} seconds')\n", + "else:\n", + " print(f'āŒ Failed to get token: {response.status_code}')\n", + " print(response.text)\n", + " ACCESS_TOKEN = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Test Agent Invocation\n", + "\n", + "**Architecture Flow:**\n", + "1. User → Agent Runtime (OAuth token in Authorization header for JWT validation)\n", + "2. Agent receives token in payload (JWT authorizer consumes header, doesn't pass through)\n", + "3. Agent → Gateway (passes token from payload)\n", + "4. Gateway → MCP Server (with user context)\n", + "\n", + "**Note:** The bearer token must be passed in BOTH the Authorization header (for JWT validation) AND the payload (for the agent code to use when calling Gateway). This is because the JWT authorizer consumes the Authorization header and doesn't pass it through to the agent code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import urllib.parse # Import here for cell independence\n", + "import uuid\n", + "import json\n", + "import requests\n", + "\n", + "if ACCESS_TOKEN:\n", + " # Get Agent Runtime ARN from SSM\n", + " try:\n", + " AGENT_RUNTIME_ARN = ssm_client.get_parameter(\n", + " Name='/app/lakehouse-agent/agent-runtime-arn'\n", + " )['Parameter']['Value']\n", + " \n", + " print(f'šŸ¤– Agent Runtime Configuration:')\n", + " print(f' Runtime ARN: {AGENT_RUNTIME_ARN}')\n", + " print(f' Region: {region}')\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " print('āŒ Agent Runtime ARN not found in SSM')\n", + " print(' Please run 05-deploy-agent.ipynb first')\n", + " AGENT_RUNTIME_ARN = None\n", + " \n", + " if AGENT_RUNTIME_ARN:\n", + " # Construct the AgentCore Runtime invocation URL\n", + " # URL encode the agent ARN\n", + " escaped_agent_arn = urllib.parse.quote(AGENT_RUNTIME_ARN, safe='')\n", + " AGENT_RUNTIME_URL = f\"https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{escaped_agent_arn}/invocations?qualifier=DEFAULT\"\n", + " \n", + " print(f' Runtime URL: {AGENT_RUNTIME_URL}')\n", + " \n", + " # Generate session ID for this invocation\n", + " session_id = f\"test-session-{uuid.uuid4()}\"\n", + " \n", + " # Prepare payload with bearer token for Gateway calls\n", + " # Note: Token must be in BOTH header (for JWT auth) and payload (for agent to use)\n", + " payload = {\n", + " 'prompt': 'Show me all my claims',\n", + " 'bearer_token': ACCESS_TOKEN # Pass token in payload for agent to use with Gateway\n", + " }\n", + " \n", + " # Prepare headers with OAuth token and session ID\n", + " headers = {\n", + " \"Authorization\": f\"Bearer {ACCESS_TOKEN}\",\n", + " \"Content-Type\": \"application/json\",\n", + " \"X-Amzn-Bedrock-AgentCore-Runtime-Session-Id\": session_id\n", + " }\n", + " \n", + " print(f'\\nšŸš€ Invoking Agent Runtime...')\n", + " print(f' Prompt: {payload[\"prompt\"]}')\n", + " print(f' Session ID: {session_id}')\n", + " print(f' Auth: Bearer token in header (for JWT validation) and payload (for Gateway)')\n", + " \n", + " try:\n", + " # Call the agent runtime\n", + " response = requests.post(\n", + " AGENT_RUNTIME_URL,\n", + " headers=headers,\n", + " data=json.dumps(payload),\n", + " timeout=60\n", + " )\n", + " \n", + " print(f'\\nšŸ“Š Response Status: {response.status_code}')\n", + " \n", + " if response.status_code == 200:\n", + " try:\n", + " result = response.json()\n", + " print(f'\\nāœ… Agent Response:')\n", + " print(json.dumps(result, indent=2))\n", + " \n", + " # Display the content if available\n", + " if 'content' in result:\n", + " print(f'\\nšŸ“ Agent Output:')\n", + " print(result['content'])\n", + " \n", + " if 'tool_calls' in result:\n", + " print(f'\\nšŸ”§ Tool Calls: {result[\"tool_calls\"]}')\n", + " \n", + " except json.JSONDecodeError:\n", + " print(f'Response: {response.text[:500]}')\n", + " \n", + " elif response.status_code == 401:\n", + " print(f'āŒ Unauthorized - OAuth token validation failed')\n", + " print(f' Check that:')\n", + " print(f' 1. Agent Runtime has JWT authorizer configured')\n", + " print(f' 2. Client ID matches the allowed clients')\n", + " print(f' 3. Token has not expired')\n", + " print(f'\\n Response: {response.text[:500]}')\n", + " \n", + " elif response.status_code == 403:\n", + " print(f'āŒ Forbidden - User not authorized')\n", + " print(f' Response: {response.text[:500]}')\n", + " \n", + " elif response.status_code == 424:\n", + " print(f'āŒ Failed Dependency - Runtime returned 500 error')\n", + " print(f' Response: {response.text[:500]}')\n", + " print(f'\\n This means the agent code is crashing.')\n", + " print(f' Common causes:')\n", + " print(f' 1. Missing Gateway ARN in SSM (/app/lakehouse-agent/gateway-arn)')\n", + " print(f' 2. Agent runtime IAM role lacks SSM permissions')\n", + " print(f' 3. Agent runtime IAM role lacks bedrock-agentcore-control:GetGateway permission')\n", + " print(f' 4. Bearer token not being passed correctly')\n", + " print(f'\\n šŸ‘‰ Run the cells below to diagnose:')\n", + " print(f' - \"Verify Configuration\" cell to check SSM parameters')\n", + " print(f' - \"Check CloudWatch Logs\" cell to see agent error logs')\n", + " \n", + " else:\n", + " print(f'āŒ Request failed')\n", + " print(f' Response: {response.text[:500]}')\n", + " \n", + " except requests.exceptions.Timeout:\n", + " print(f'\\nāŒ Request timed out after 60 seconds')\n", + " print(f' Check CloudWatch logs:')\n", + " print(f' - Agent Runtime: /aws/bedrock-agentcore/runtime/{AGENT_RUNTIME_ARN.split(\"/\")[-1]}')\n", + " print(f' - Gateway Interceptor: /aws/lambda/lakehouse-gateway-interceptor')\n", + " \n", + " except Exception as e:\n", + " print(f'\\nāŒ Error: {e}')\n", + " import traceback\n", + " traceback.print_exc()\n", + "else:\n", + " print('āš ļø Skipping agent test - no access token')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Launch Streamlit UI\n", + "\n", + "Launch the interactive Streamlit UI for conversational testing with the agent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "import os\n", + "\n", + "print('šŸš€ Launching Streamlit UI...')\n", + "print('\\nšŸ“ Instructions:')\n", + "print(' - Streamlit will open in your browser automatically')\n", + "print(' - Login with: user001@example.com / TempPass123!')\n", + "print(' - Try queries like: \"Show me all claims\" or \"Get claims summary\"')\n", + "print(' - Press Ctrl+C in the terminal to stop Streamlit')\n", + "print('\\nā³ Starting Streamlit server...')\n", + "\n", + "# Change to streamlit-ui directory and run streamlit\n", + "try:\n", + " streamlit_dir = os.path.join(os.getcwd(), 'streamlit-ui')\n", + " subprocess.run(\n", + " ['streamlit', 'run', 'streamlit_app.py'],\n", + " cwd=streamlit_dir,\n", + " check=True\n", + " )\n", + "except KeyboardInterrupt:\n", + " print('\\n\\nāœ… Streamlit stopped')\n", + "except FileNotFoundError:\n", + " print('\\nāŒ streamlit-ui directory or streamlit_app.py not found')\n", + " print(' Make sure you are running this from the lakehouse-agent directory')\n", + "except Exception as e:\n", + " print(f'\\nāŒ Error launching Streamlit: {e}')\n", + " print('\\nšŸ’” Manual launch:')\n", + " print(' cd streamlit-ui')\n", + " print(' streamlit run streamlit_app.py')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "āœ… **Testing Complete!**\n", + "\n", + "**Architecture Validated:**\n", + "```\n", + "User (with OAuth token)\n", + " ↓\n", + "AgentCore Runtime (Lakehouse Agent)\n", + " ā”œā”€ Validates user OAuth token (JWT authorizer)\n", + " ā”œā”€ Extracts token from Authorization header\n", + " ↓\n", + "AgentCore Gateway\n", + " ā”œā”€ Receives bearer token from agent\n", + " ā”œā”€ Interceptor Lambda validates token\n", + " ā”œā”€ Adds user identity (X-User-Principal header)\n", + " ↓\n", + "MCP Athena Server\n", + " └─ Executes queries with user context\n", + "```\n", + "\n", + "**What was tested:**\n", + "- User OAuth token generation from Cognito\n", + "- Agent runtime invocation with bearer token in header\n", + "- Agent → Gateway → MCP Server flow\n", + "- User identity propagation through headers\n", + "- Interactive Streamlit UI for conversational testing\n", + "\n", + "**Additional Testing:**\n", + "\n", + "1. **Test with different users:**\n", + " - user001@example.com / TempPass123!\n", + " - user002@example.com / TempPass123!\n", + "\n", + "2. **Verify User Context:**\n", + " - Check that Gateway interceptor extracts user identity\n", + " - Verify X-User-Principal header is added to MCP requests\n", + " - Confirm user identity appears in CloudWatch logs\n", + "\n", + "**Troubleshooting:**\n", + "- Check CloudWatch logs for:\n", + " - Agent Runtime logs: `/aws/bedrock-agentcore/runtime/`\n", + " - Gateway Interceptor logs: `/aws/lambda/lakehouse-gateway-interceptor`\n", + " - Look for: \"Bearer token extracted\", \"User: \", \"Request authorized\"\n", + "- Verify SSM parameters are set correctly\n", + "- Ensure all components are deployed in correct order" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/07-optional-cleanup.ipynb b/02-use-cases/lakehouse-agent/07-optional-cleanup.ipynb new file mode 100644 index 00000000..0557a745 --- /dev/null +++ b/02-use-cases/lakehouse-agent/07-optional-cleanup.ipynb @@ -0,0 +1,796 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lakehouse Agent - Optional Cleanup\n", + "\n", + "This notebook helps you clean up all AWS resources created by notebooks 00-06.\n", + "\n", + "**āš ļø WARNING: This will delete all resources created during deployment!**\n", + "\n", + "**What this notebook does:**\n", + "- Deletes Agent Runtime (from notebook 05)\n", + "- Deletes Gateway, Targets, OAuth Providers, and IAM Roles (from notebook 04)\n", + "- Deletes Interceptor Lambda (from notebook 04)\n", + "- Deletes MCP Server Runtime (from notebook 03)\n", + "- Deletes Cognito User Pool and users (from notebook 02)\n", + "- Deletes Athena database and tables (from notebook 01)\n", + "- Optionally deletes S3 bucket and data (from notebook 00)\n", + "- Deletes SSM parameters\n", + "- Deletes local configuration files\n", + "\n", + "**Prerequisites:**\n", + "- AWS credentials configured\n", + "- Python 3.10 or later\n", + "- boto3 installed" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "import time\n", + "from datetime import datetime\n", + "\n", + "print(\"āœ… Imports successful\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize AWS Session" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load AWS credentials and initialize session\n", + "from utils.notebook_init import init_aws\n", + "\n", + "session, region, account_id = init_aws()\n", + "\n", + "# Initialize AWS clients\n", + "ssm_client = session.client('ssm', region_name=region)\n", + "s3_client = session.client('s3', region_name=region)\n", + "athena_client = session.client('athena', region_name=region)\n", + "glue_client = session.client('glue', region_name=region)\n", + "cognito_client = session.client('cognito-idp', region_name=region)\n", + "lambda_client = session.client('lambda', region_name=region)\n", + "iam_client = session.client('iam', region_name=region)\n", + "bedrock_agent_client = session.client('bedrock-agentcore-control', region_name=region)\n", + "\n", + "print(f'\\nāœ… AWS Session initialized')\n", + "print(f' Account ID: {account_id}')\n", + "print(f' Region: {region}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Load Configuration from SSM\n", + "\n", + "Load all configuration parameters to identify resources to delete." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_ssm_parameter(name, default=None):\n", + " \"\"\"Get SSM parameter value, return default if not found\"\"\"\n", + " try:\n", + " response = ssm_client.get_parameter(Name=name)\n", + " return response['Parameter']['Value']\n", + " except ssm_client.exceptions.ParameterNotFound:\n", + " return default\n", + " except Exception as e:\n", + " print(f\"āš ļø Error reading {name}: {e}\")\n", + " return default\n", + "\n", + "print(\"šŸ“‹ Loading configuration from SSM Parameter Store...\\n\")\n", + "\n", + "# Load all configuration\n", + "config = {\n", + " 'agent_runtime_arn': get_ssm_parameter('/app/lakehouse-agent/agent-runtime-arn'),\n", + " 'agent_runtime_id': get_ssm_parameter('/app/lakehouse-agent/agent-runtime-id'),\n", + " 'gateway_arn': get_ssm_parameter('/app/lakehouse-agent/gateway-arn'),\n", + " 'gateway_id': get_ssm_parameter('/app/lakehouse-agent/gateway-id'),\n", + " 'interceptor_lambda_arn': get_ssm_parameter('/app/lakehouse-agent/interceptor-lambda-arn'),\n", + " 'mcp_server_runtime_arn': get_ssm_parameter('/app/lakehouse-agent/mcp-server-runtime-arn'),\n", + " 'mcp_server_runtime_id': get_ssm_parameter('/app/lakehouse-agent/mcp-server-runtime-id'),\n", + " 'cognito_user_pool_id': get_ssm_parameter('/app/lakehouse-agent/cognito-user-pool-id'),\n", + " 'cognito_domain': get_ssm_parameter('/app/lakehouse-agent/cognito-domain'),\n", + " 'database_name': get_ssm_parameter('/app/lakehouse-agent/database-name'),\n", + " 's3_bucket_name': get_ssm_parameter('/app/lakehouse-agent/s3-bucket-name'),\n", + "}\n", + "\n", + "# Display configuration\n", + "print(\"Resources found:\")\n", + "for key, value in config.items():\n", + " if value:\n", + " display_value = value[:60] + '...' if len(value) > 60 else value\n", + " print(f\" āœ… {key}: {display_value}\")\n", + " else:\n", + " print(f\" ā­ļø {key}: Not found\")\n", + "\n", + "# Count resources\n", + "resource_count = sum(1 for v in config.values() if v)\n", + "print(f\"\\nšŸ“Š Found {resource_count} resources to clean up\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Delete Agent Runtime (from notebook 05)\n", + "\n", + "Delete the Lakehouse Agent Runtime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting Agent Runtime...\\n\")\n", + "\n", + "if config['agent_runtime_id']:\n", + " try:\n", + " bedrock_agent_client.delete_agent_runtime(\n", + " agentRuntimeId=config['agent_runtime_id']\n", + " )\n", + " print(f\"āœ… Deleted Agent Runtime: {config['agent_runtime_id']}\")\n", + " print(\" Waiting for deletion to complete...\")\n", + " time.sleep(10)\n", + " except bedrock_agent_client.exceptions.ResourceNotFoundException:\n", + " print(f\"ā­ļø Agent Runtime not found (may have been deleted already)\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting Agent Runtime: {e}\")\n", + "else:\n", + " print(\"ā­ļø No Agent Runtime found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Delete Gateway (from notebook 04)\n", + "\n", + "Delete the AgentCore Gateway." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting Gateway...\\n\")\n", + "\n", + "if config['gateway_id']:\n", + " try:\n", + " # First, delete all gateway targets\n", + " print(f\"Listing targets for gateway: {config['gateway_id']}\")\n", + " try:\n", + " list_response = bedrock_agent_client.list_gateway_targets(\n", + " gatewayIdentifier=config['gateway_id']\n", + " )\n", + " \n", + " targets = list_response.get('items', [])\n", + " if targets:\n", + " print(f\" Found {len(targets)} target(s) to delete\\n\")\n", + " for target in targets:\n", + " target_id = target['targetId']\n", + " target_name = target.get('name', 'unnamed')\n", + " try:\n", + " bedrock_agent_client.delete_gateway_target(\n", + " gatewayIdentifier=config['gateway_id'],\n", + " targetId=target_id\n", + " )\n", + " print(f\" āœ… Deleted target: {target_name} ({target_id})\")\n", + " except Exception as e:\n", + " print(f\" āš ļø Could not delete target {target_name}: {e}\")\n", + " else:\n", + " print(\" No targets found\")\n", + " except Exception as e:\n", + " print(f\" āš ļø Could not list targets: {e}\")\n", + "\n", + " # Wait for targets to finish deleting\n", + " if targets:\n", + " print(\"\\nā³ Waiting for targets to finish deleting...\")\n", + " max_attempts = 12 # 12 attempts * 5 seconds = 60 seconds max\n", + " for attempt in range(max_attempts):\n", + " try:\n", + " list_response = bedrock_agent_client.list_gateway_targets(\n", + " gatewayIdentifier=config['gateway_id']\n", + " )\n", + " remaining_targets = list_response.get('items', [])\n", + "\n", + " if not remaining_targets:\n", + " print(\" āœ… All targets deleted successfully\")\n", + " break\n", + "\n", + " print(f\" Still {len(remaining_targets)} target(s) remaining... (attempt {attempt+1}/{max_attempts})\")\n", + " time.sleep(5)\n", + " except bedrock_agent_client.exceptions.ResourceNotFoundException:\n", + " print(\" āœ… Gateway already deleted during target cleanup\")\n", + " break\n", + " except Exception as e:\n", + " print(f\" āš ļø Error checking targets: {e}\")\n", + " break\n", + " else:\n", + " print(\" āš ļø Timeout waiting for targets to delete, proceeding anyway...\")\n", + "\n", + " # Now delete the gateway\n", + " print(f\"\\nDeleting gateway: {config['gateway_id']}\")\n", + " bedrock_agent_client.delete_gateway(\n", + " gatewayIdentifier=config['gateway_id']\n", + " )\n", + " print(f\"āœ… Deleted Gateway: {config['gateway_id']}\")\n", + " print(\" Waiting for deletion to complete...\")\n", + " time.sleep(10)\n", + " except bedrock_agent_client.exceptions.ResourceNotFoundException:\n", + " print(f\"ā­ļø Gateway not found (may have been deleted already)\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting Gateway: {e}\")\n", + "else:\n", + " print(\"ā­ļø No Gateway found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3.5: Delete OAuth2 Credential Providers\n", + "\n", + "Delete OAuth2 credential providers created for Gateway-to-Runtime authentication.\n", + "\n", + "**Important:** These providers store Cognito client credentials and must be deleted to prevent stale credentials from being reused." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting OAuth2 Credential Providers...\\n\")\n", + "\n", + "try:\n", + " # List all OAuth2 credential providers\n", + " response = bedrock_agent_client.list_oauth2_credential_providers()\n", + " \n", + " # Try different possible key names for the list\n", + " providers = response.get('oauth2CredentialProviders', \n", + " response.get('credentialProviders', \n", + " response.get('items', [])))\n", + " \n", + " if providers:\n", + " deleted_count = 0\n", + " for provider in providers:\n", + " provider_name = provider.get('name', 'unknown')\n", + " \n", + " # Only delete lakehouse-related providers\n", + " if 'lakehouse' in provider_name.lower():\n", + " try:\n", + " # Delete using the provider name\n", + " bedrock_agent_client.delete_oauth2_credential_provider(\n", + " name=provider_name\n", + " )\n", + " print(f\" āœ… Deleted OAuth provider: {provider_name}\")\n", + " deleted_count += 1\n", + " except Exception as e:\n", + " print(f\" āš ļø Could not delete provider {provider_name}: {e}\")\n", + " \n", + " if deleted_count > 0:\n", + " print(f\"\\nāœ… Deleted {deleted_count} OAuth2 provider(s)\")\n", + " else:\n", + " print(\"\\nā­ļø No lakehouse-related OAuth providers found\")\n", + " else:\n", + " print(\"ā­ļø No OAuth2 providers found\")\n", + " \n", + "except Exception as e:\n", + " print(f\"āŒ Error listing OAuth2 providers: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3.6: Delete IAM Roles\n", + "\n", + "Delete IAM roles created for the Gateway." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting IAM Roles...\\n\")\n", + "\n", + "# IAM role name for gateway\n", + "role_name = 'agentcore-lakehouse-gateway-role'\n", + "\n", + "try:\n", + " # Check if role exists\n", + " iam_client.get_role(RoleName=role_name)\n", + " \n", + " print(f\"Found IAM role: {role_name}\")\n", + " \n", + " # Delete inline policies\n", + " try:\n", + " policy_names = iam_client.list_role_policies(RoleName=role_name)['PolicyNames']\n", + " for policy_name in policy_names:\n", + " iam_client.delete_role_policy(RoleName=role_name, PolicyName=policy_name)\n", + " print(f\" āœ… Deleted inline policy: {policy_name}\")\n", + " except Exception as e:\n", + " print(f\" āš ļø Error deleting inline policies: {e}\")\n", + " \n", + " # Detach managed policies\n", + " try:\n", + " attached_policies = iam_client.list_attached_role_policies(RoleName=role_name)['AttachedPolicies']\n", + " for policy in attached_policies:\n", + " iam_client.detach_role_policy(RoleName=role_name, PolicyArn=policy['PolicyArn'])\n", + " print(f\" āœ… Detached managed policy: {policy['PolicyName']}\")\n", + " except Exception as e:\n", + " print(f\" āš ļø Error detaching managed policies: {e}\")\n", + " \n", + " # Remove from instance profiles\n", + " try:\n", + " instance_profiles = iam_client.list_instance_profiles_for_role(RoleName=role_name)['InstanceProfiles']\n", + " for profile in instance_profiles:\n", + " iam_client.remove_role_from_instance_profile(\n", + " InstanceProfileName=profile['InstanceProfileName'],\n", + " RoleName=role_name\n", + " )\n", + " print(f\" āœ… Removed from instance profile: {profile['InstanceProfileName']}\")\n", + " except Exception as e:\n", + " print(f\" āš ļø Error removing from instance profiles: {e}\")\n", + " \n", + " # Delete the role\n", + " iam_client.delete_role(RoleName=role_name)\n", + " print(f\"\\nāœ… Deleted IAM role: {role_name}\")\n", + " \n", + "except iam_client.exceptions.NoSuchEntityException:\n", + " print(f\"ā­ļø IAM role not found: {role_name}\")\n", + "except Exception as e:\n", + " print(f\"āŒ Error deleting IAM role: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Delete Interceptor Lambda (from notebook 04)\n", + "\n", + "Delete the Gateway Interceptor Lambda function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting Interceptor Lambda...\\n\")\n", + "\n", + "if config['interceptor_lambda_arn']:\n", + " function_name = config['interceptor_lambda_arn'].split(':')[-1]\n", + " try:\n", + " lambda_client.delete_function(FunctionName=function_name)\n", + " print(f\"āœ… Deleted Lambda function: {function_name}\")\n", + " except lambda_client.exceptions.ResourceNotFoundException:\n", + " print(f\"ā­ļø Lambda function not found (may have been deleted already)\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting Lambda function: {e}\")\n", + "else:\n", + " print(\"ā­ļø No Interceptor Lambda found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 5: Delete MCP Server Runtime (from notebook 03)\n", + "\n", + "Delete the MCP Server Runtime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting MCP Server Runtime...\\n\")\n", + "\n", + "if config['mcp_server_runtime_id']:\n", + " try:\n", + " bedrock_agent_client.delete_agent_runtime(\n", + " agentRuntimeId=config['mcp_server_runtime_id']\n", + " )\n", + " print(f\"āœ… Deleted MCP Server Runtime: {config['mcp_server_runtime_id']}\")\n", + " print(\" Waiting for deletion to complete...\")\n", + " time.sleep(10)\n", + " except bedrock_agent_client.exceptions.ResourceNotFoundException:\n", + " print(f\"ā­ļø MCP Server Runtime not found (may have been deleted already)\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting MCP Server Runtime: {e}\")\n", + "else:\n", + " print(\"ā­ļø No MCP Server Runtime found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 6: Delete Local Configuration Files\n", + "\n", + "Delete `.bedrock_agentcore.yaml` configuration files created during runtime deployment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "print(\"šŸ—‘ļø Deleting local configuration files...\\n\")\n", + "\n", + "# Get notebook directory to build relative paths\n", + "notebook_dir = Path.cwd()\n", + "\n", + "# Files to clean up\n", + "config_files = [\n", + " notebook_dir / \"deployment\" / \"mcp-lakehouse-server\" / \".bedrock_agentcore.yaml\",\n", + " notebook_dir / \"deployment\" / \"lakehouse-agent\" / \".bedrock_agentcore.yaml\"\n", + "]\n", + "\n", + "deleted_count = 0\n", + "for file_path in config_files:\n", + " if file_path.exists():\n", + " try:\n", + " file_path.unlink()\n", + " print(f\"āœ… Deleted: {file_path.relative_to(notebook_dir)}\")\n", + " deleted_count += 1\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting {file_path.relative_to(notebook_dir)}: {e}\")\n", + " else:\n", + " print(f\"ā­ļø Not found: {file_path.relative_to(notebook_dir)}\")\n", + "\n", + "if deleted_count > 0:\n", + " print(f\"\\nāœ… Deleted {deleted_count} configuration file(s)\")\n", + "else:\n", + " print(\"\\nā­ļø No configuration files to delete\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 6: Delete Cognito Resources (from notebook 02)\n", + "\n", + "Delete Cognito User Pool, domain, and all users." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting Cognito resources...\\n\")\n", + "\n", + "if config['cognito_user_pool_id']:\n", + " try:\n", + " # First, try to get the user pool to check if domain exists\n", + " try:\n", + " pool_info = cognito_client.describe_user_pool(\n", + " UserPoolId=config['cognito_user_pool_id']\n", + " )\n", + " pool_domain = pool_info['UserPool'].get('Domain')\n", + " \n", + " # If domain exists in the pool, delete it\n", + " if pool_domain:\n", + " print(f\"Found domain in user pool: {pool_domain}\")\n", + " try:\n", + " cognito_client.delete_user_pool_domain(\n", + " Domain=pool_domain,\n", + " UserPoolId=config['cognito_user_pool_id']\n", + " )\n", + " print(f\"āœ… Deleted Cognito domain: {pool_domain}\")\n", + " time.sleep(5) # Wait for domain deletion to complete\n", + " except cognito_client.exceptions.InvalidParameterException as e:\n", + " if \"No such domain\" in str(e):\n", + " print(f\"ā­ļø Domain already deleted\")\n", + " else:\n", + " print(f\"āš ļø Could not delete domain: {e}\")\n", + " except Exception as e:\n", + " print(f\"āš ļø Could not delete domain: {e}\")\n", + " else:\n", + " print(\"No domain configured for this user pool\")\n", + " except cognito_client.exceptions.ResourceNotFoundException:\n", + " print(f\"ā­ļø User pool not found, skipping domain deletion\")\n", + " \n", + " # Now delete the user pool\n", + " cognito_client.delete_user_pool(\n", + " UserPoolId=config['cognito_user_pool_id']\n", + " )\n", + " print(f\"āœ… Deleted Cognito User Pool: {config['cognito_user_pool_id']}\")\n", + " except cognito_client.exceptions.ResourceNotFoundException:\n", + " print(f\"ā­ļø Cognito User Pool not found (may have been deleted already)\")\n", + " except cognito_client.exceptions.InvalidParameterException as e:\n", + " if \"domain configured\" in str(e):\n", + " print(f\"āŒ User pool still has a domain. Trying to find and delete it...\")\n", + " # Try with the domain from config\n", + " if config.get('cognito_domain'):\n", + " try:\n", + " cognito_client.delete_user_pool_domain(\n", + " Domain=config['cognito_domain'],\n", + " UserPoolId=config['cognito_user_pool_id']\n", + " )\n", + " print(f\"āœ… Deleted domain from config: {config['cognito_domain']}\")\n", + " time.sleep(5)\n", + " # Try deleting user pool again\n", + " cognito_client.delete_user_pool(\n", + " UserPoolId=config['cognito_user_pool_id']\n", + " )\n", + " print(f\"āœ… Deleted Cognito User Pool: {config['cognito_user_pool_id']}\")\n", + " except Exception as e2:\n", + " print(f\"āŒ Still could not delete user pool: {e2}\")\n", + " else:\n", + " print(f\"āŒ Error deleting Cognito User Pool: {e}\")\n", + " else:\n", + " print(f\"āŒ Error deleting Cognito User Pool: {e}\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting Cognito User Pool: {e}\")\n", + "else:\n", + " print(\"ā­ļø No Cognito User Pool found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 7: Delete Athena Database and Tables (from notebook 01)\n", + "\n", + "Delete Athena database and all tables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting Athena database and tables...\\n\")\n", + "\n", + "if config['database_name']:\n", + " try:\n", + " # Get all tables in the database\n", + " response = glue_client.get_tables(DatabaseName=config['database_name'])\n", + " tables = response['TableList']\n", + " \n", + " # Delete each table\n", + " for table in tables:\n", + " table_name = table['Name']\n", + " try:\n", + " glue_client.delete_table(\n", + " DatabaseName=config['database_name'],\n", + " Name=table_name\n", + " )\n", + " print(f\" āœ… Deleted table: {table_name}\")\n", + " except Exception as e:\n", + " print(f\" āš ļø Could not delete table {table_name}: {e}\")\n", + " \n", + " # Delete the database\n", + " glue_client.delete_database(Name=config['database_name'])\n", + " print(f\"\\nāœ… Deleted database: {config['database_name']}\")\n", + " except glue_client.exceptions.EntityNotFoundException:\n", + " print(f\"ā­ļø Database not found (may have been deleted already)\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting database: {e}\")\n", + "else:\n", + " print(\"ā­ļø No Athena database found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 8: Delete S3 Bucket (from notebook 00)\n", + "\n", + "**āš ļø WARNING: This will permanently delete all data in the S3 bucket!**\n", + "\n", + "Set `DELETE_S3_BUCKET = True` to enable S3 bucket deletion." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set to True to delete the S3 bucket and all its contents\n", + "DELETE_S3_BUCKET = False # Change to True to enable deletion\n", + "\n", + "print(\"šŸ—‘ļø S3 Bucket cleanup...\\n\")\n", + "\n", + "if not DELETE_S3_BUCKET:\n", + " print(\"ā­ļø S3 bucket deletion is DISABLED\")\n", + " print(\" Set DELETE_S3_BUCKET = True to enable\")\n", + " print(f\" Bucket: {config['s3_bucket_name']}\")\n", + "elif config['s3_bucket_name']:\n", + " try:\n", + " bucket_name = config['s3_bucket_name']\n", + " \n", + " # List and delete all objects\n", + " print(f\"Deleting all objects in bucket: {bucket_name}\")\n", + " paginator = s3_client.get_paginator('list_objects_v2')\n", + " pages = paginator.paginate(Bucket=bucket_name)\n", + " \n", + " delete_count = 0\n", + " for page in pages:\n", + " if 'Contents' in page:\n", + " objects = [{'Key': obj['Key']} for obj in page['Contents']]\n", + " s3_client.delete_objects(\n", + " Bucket=bucket_name,\n", + " Delete={'Objects': objects}\n", + " )\n", + " delete_count += len(objects)\n", + " \n", + " print(f\" āœ… Deleted {delete_count} objects\")\n", + " \n", + " # Delete the bucket\n", + " s3_client.delete_bucket(Bucket=bucket_name)\n", + " print(f\"\\nāœ… Deleted S3 bucket: {bucket_name}\")\n", + " except s3_client.exceptions.NoSuchBucket:\n", + " print(f\"ā­ļø S3 bucket not found (may have been deleted already)\")\n", + " except Exception as e:\n", + " print(f\"āŒ Error deleting S3 bucket: {e}\")\n", + "else:\n", + " print(\"ā­ļø No S3 bucket found in configuration\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 9: Delete SSM Parameters\n", + "\n", + "Delete all SSM parameters created during deployment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"šŸ—‘ļø Deleting SSM parameters...\\n\")\n", + "\n", + "# Get all parameters with the lakehouse-agent prefix\n", + "try:\n", + " paginator = ssm_client.get_paginator('describe_parameters')\n", + " pages = paginator.paginate(\n", + " ParameterFilters=[\n", + " {\n", + " 'Key': 'Name',\n", + " 'Option': 'BeginsWith',\n", + " 'Values': ['/app/lakehouse-agent/']\n", + " }\n", + " ]\n", + " )\n", + " \n", + " parameters_to_delete = []\n", + " for page in pages:\n", + " for param in page['Parameters']:\n", + " parameters_to_delete.append(param['Name'])\n", + " \n", + " if parameters_to_delete:\n", + " print(f\"Found {len(parameters_to_delete)} parameters to delete:\\n\")\n", + " \n", + " # Delete parameters in batches of 10 (AWS limit)\n", + " for i in range(0, len(parameters_to_delete), 10):\n", + " batch = parameters_to_delete[i:i+10]\n", + " try:\n", + " ssm_client.delete_parameters(Names=batch)\n", + " for param in batch:\n", + " print(f\" āœ… Deleted: {param}\")\n", + " except Exception as e:\n", + " print(f\" āŒ Error deleting batch: {e}\")\n", + " \n", + " print(f\"\\nāœ… Deleted {len(parameters_to_delete)} SSM parameters\")\n", + " else:\n", + " print(\"ā­ļø No SSM parameters found with /app/lakehouse-agent/ prefix\")\n", + " \n", + "except Exception as e:\n", + " print(f\"āŒ Error deleting SSM parameters: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Review the cleanup results above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"\\n\" + \"=\"*70)\n", + "print(\"šŸŽ‰ CLEANUP COMPLETE\")\n", + "print(\"=\"*70)\n", + "\n", + "print(\"\\nāœ… Resources cleaned up:\")\n", + "print(\" • Agent Runtime (notebook 05)\")\n", + "print(\" • Gateway & Targets (notebook 04)\")\n", + "print(\" • OAuth2 Credential Providers\")\n", + "print(\" • IAM Roles (Gateway)\")\n", + "print(\" • Interceptor Lambda (notebook 04)\")\n", + "print(\" • MCP Server Runtime (notebook 03)\")\n", + "print(\" • Local Configuration Files (.bedrock_agentcore.yaml)\")\n", + "print(\" • Cognito User Pool (notebook 02)\")\n", + "print(\" • Athena Database & Tables (notebook 01)\")\n", + "print(\" • SSM Parameters (notebook 00)\")\n", + "\n", + "if DELETE_S3_BUCKET:\n", + " print(\" • S3 Bucket & Data (notebook 00)\")\n", + "else:\n", + " print(\" ā­ļø S3 Bucket (skipped - set DELETE_S3_BUCKET=True to delete)\")\n", + "\n", + "print(\"\\nšŸ“‹ Manual cleanup (if needed):\")\n", + "print(\" • CloudWatch Log Groups: /aws/bedrock-agentcore/runtime/*\")\n", + "print(\" • CloudWatch Log Groups: /aws/lambda/lakehouse-*\")\n", + "print(\" • ECR Repositories (if created)\")\n", + "\n", + "print(\"\\n\" + \"=\"*70)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02-use-cases/lakehouse-agent/Lakehouse-agent-architecture.png b/02-use-cases/lakehouse-agent/Lakehouse-agent-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1483f5043c6e27ec8d5f739e89a4ea4adbf645 GIT binary patch literal 242393 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

EiikfYwd^@)YAXcCNs=~aOZBWbK(#{kV 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 Iq6Pu~2S}|t`2YX_ literal 0 HcmV?d00001 diff --git a/02-use-cases/lakehouse-agent/README.md b/02-use-cases/lakehouse-agent/README.md new file mode 100644 index 00000000..88e4fda6 --- /dev/null +++ b/02-use-cases/lakehouse-agent/README.md @@ -0,0 +1,754 @@ +# Lakehouse Agent with OAuth Authentication + +A lakehouse data processing system demonstrating Amazon Bedrock AgentCore capabilities with end-to-end OAuth authentication, row-level security based on federated user identity, and conversational AI for data queries. + +## Table of Contents + +- [Overview](#overview) +- [Architecture](#architecture) +- [Key Features](#key-features) +- [Prerequisites](#prerequisites) +- [Quick Start](#quick-start) +- [Deployment Steps](#deployment-steps) +- [Testing](#testing) +- [Usage Examples](#usage-examples) +- [Troubleshooting](#troubleshooting) +- [Cost Estimate](#cost-estimate) + +--- + +## Overview + +This system showcases a lakehouse data processing application with: + +- **Streamlit UI** with Cognito OAuth authentication +- **AI-Powered Lakehouse Agent** hosted on AgentCore Runtime using Strands framework +- **AgentCore Gateway** with JWT token validation via interceptor Lambda +- **MCP Server** connecting to AWS Athena for data queries +- **OAuth credentials** propagated through the entire stack (UI → Agent → Gateway → MCP → Athena) +- **Row-Level Security** enforced through federated user identity + +### What Makes This Production-Ready + +āœ… **End-to-End OAuth**: JWT bearer tokens validated at every layer +āœ… **Row-Level Security**: Agentcore lambda interceptors translate user tokens to user identity which is passed on to the MCP server to ensure row-level access control +āœ… **Conversational AI**: Natural language interface for data queries +āœ… **Scalable Architecture**: AgentCore Runtime and Gateway for production workloads +āœ… **Full Audit Trail**: CloudTrail logs all data access with user identity +āœ… **Secure by Design**: Token validation at multiple checkpoints + +--- + +## Architecture + +### High-Level Architecture + +![Lakehouse Agent Architecture](Lakehouse-agent-architecture.png) + + +### Authentication flow +``` +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ User Layer │ +│ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ +│ │ Streamlit UI │ OAuth login via Cognito (USER CREDENTIALS) │ +│ │ + Cognito Auth │ Client: lakehouse-client │ +│ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ Bearer Token (JWT with user identity) + │ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā–¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ AI Agent Layer │ +│ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ +│ │Lakehouse Agent │ Strands-based conversational agent │ +│ │ AgentCore │ Natural language data processing │ +│ │ Runtime │ JWT Authorizer validates USER token │ +│ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ Allowed: lakehouse-client (user auth) │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ Bearer Token + Tool Request + │ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā–¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ Gateway & Policy Layer │ +│ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ +│ │ AgentCore Gateway + Interceptor Lambda │ │ +│ │ - Validates JWT tokens (USER token from agent) │ │ +│ │ - Extracts user identity (email) │ │ +│ │ - Enforces scope-based tool access │ │ +│ │ - Adds user identity to request headers │ │ +│ │ JWT Inbound: lakehouse-client (user auth) │ │ +│ │ │ │ +│ │ OAuth Provider: lakehouse-mcp-m2m-oauth-provider │ │ +│ │ - Gateway obtains M2M token for MCP Runtime │ │ +│ │ - Client: lakehouse-m2m-client (M2M only) │ │ +│ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ M2M Token + User Identity + Tool Request + │ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā–¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ Tool Execution Layer │ +│ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ +│ │ MCP Server (AgentCore Runtime) │ │ +│ │ Athena connector for data queries │ │ +│ │ JWT Authorizer validates M2M token │ │ +│ │ Allowed: lakehouse-m2m-client (M2M only) │ │ +│ │ - Receives user_id from Gateway (X-User-Principal) │ │ +│ │ - Executes Athena queries │ │ +│ │ - Returns query results │ │ +│ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ Athena Query + │ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā–¼ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ Data Layer │ +│ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ +│ │ AWS Athena + Glue Data Catalog │ │ +│ │ • lakehouse_db database │ │ +│ │ • claims table │ │ +│ │ • users table (metadata) │ │ +│ │ • Executes queries and returns results │ │ +│ │ • S3 backend for data storage │ │ +│ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ +``` + +### Data Flow Example: User Query + +``` +1. User Login + Streamlit UI → Cognito → Returns JWT with user identity + JWT contains: { + "email": "user001@example.com", + "scope": "lakehouse-api/claims.query" + } + +2. Query Submission + User: "Show me all claims" + + UI → Agent Runtime + POST /agent-runtime + Headers: + Authorization: Bearer ← Token in header for JWT validation + Body: + { + "prompt": "Show me all claims", + "bearer_token": "" ← Token also in body for agent to use + } + +3. Agent Runtime Processing + a) JWT Authorizer validates token (signature, expiration, audience) + b) Agent code extracts token from payload (JWT authorizer consumes header) + c) Agent creates MCP client to Gateway with bearer token + d) Agent uses AI to decide which tools to call + + Agent → Gateway + POST /gateway + Headers: + Authorization: Bearer ← Same token passed through + Body: + {"jsonrpc": "2.0", "method": "tools/call", "params": {...}} + +4. Gateway Interception + Interceptor Lambda: + - Validates JWT signature āœ“ + - Checks token expiration āœ“ + - Extracts user identity: "user001@example.com" + - Validates scope: "claims.query" āœ“ + - Adds header: X-User-Principal: user001@example.com + + Gateway → MCP Server (with user context) + +5. Tool Execution + MCP Server: + - Extracts user from X-User-Principal header + - Executes Athena query + - Query: SELECT * FROM claims WHERE status = 'pending' + - Returns results + +6. Athena Execution + Athena executes query → Returns results + +7. Response Flow + Athena → MCP → Gateway → Agent → UI + Agent formats results naturally + User sees: "I found 3 pending claims..." + +Key Points: +āœ… Bearer token in Authorization header (for JWT validation at runtime entry) +āœ… Bearer token also in payload (for agent code to use with Gateway) + Note: JWT authorizer consumes Authorization header and doesn't pass it through +āœ… Token validated at agent entry (JWT authorizer) +āœ… Token validated at gateway entry (Interceptor Lambda) +āœ… User identity propagated through entire chain +``` + +--- + +## Key Features + +### Security Features + +- **šŸ”’ End-to-End OAuth**: JWT bearer tokens with multi-layer validation +- **ļæ½ Row-Level Security**: Agentcore Lambda interceptor translates JWT tokens on federated user identity to user principals +- **ļæ½ Fine-Grained Access Control**: JWT scopes determine which tools users can access +- **ļæ½ Token Propagation**: User identity flows through entire system +- **ļæ½ Full AudiIt Trail**: CloudTrail logs all data access with user identity +- **šŸ›”ļø Gateway Interceptor**: Policy-based tool access enforcement + +### Application Features + +- **šŸ„ Health Insurance Operations**: Query claims data conversationally +- **šŸ’¬ Conversational AI**: Natural language interface for data queries +- **ā˜ļø AWS Athena Integration**: Scalable data queries +- **šŸŽÆ Multi-User Support**: User identity tracked throughout request flow + +--- + +## Prerequisites + +### AWS Account Setup + +1. **AWS Account**: + - AWS Account ID (e.g., XXXXXXXXXXXX) + - Region: us-east-1 (configurable) + +2. **AWS Permissions**: + ``` + - BedrockAgentCoreFullAccess + - AmazonBedrockFullAccess + - AmazonAthenaFullAccess + - AmazonS3FullAccess + - AWSLambdaFullAccess + - AmazonCognitoPowerUser + - SSMFullAccess + ``` + +3. **AWS Services**: + - Amazon Bedrock (with Claude Sonnet 4.5 access) + - Amazon Bedrock AgentCore + - AWS Lambda + - Amazon Cognito + - AWS Athena + - AWS Glue + - Amazon S3 + - AWS Systems Manager (SSM Parameter Store) + +### Development Environment + +```bash +# Python 3.10 or later +python --version + +# Create virtual environment +python -m venv .venv + +# Activate virtual environment +# On macOS/Linux: +source .venv/bin/activate +# On Windows: +# .venv\Scripts\activate + +# Install dependencies +pip install -r requirements.txt +``` + + +## Quick Start + +The fastest way to deploy the complete system is through the provided Jupyter notebooks. Run them in sequence: + +### Prerequisites + +Ensure you have AWS credentials configured: + +```bash +# Option 1: Using .env file (Recommended) +# Create a .env file in this directory with your AWS credentials: +# AWS_ACCESS_KEY_ID=your-access-key-id +# AWS_SECRET_ACCESS_KEY=your-secret-access-key +# AWS_SESSION_TOKEN=your-session-token # Optional, for STS credentials +# AWS_DEFAULT_REGION=us-east-1 + +# Option 2: If using SSO +export AWS_PROFILE=your-profile-name +aws sso login --profile your-profile-name + +# Option 3: If using access keys +aws configure +``` + +### Deployment via Notebooks + +Start Jupyter and run the notebooks in order: + +```bash +jupyter notebook +``` + +**Notebook Sequence**: + +1. **00-prerequisites-setup.ipynb** - Configure environment and create S3 bucket +2. **01-deploy-athena.ipynb** - Deploy Athena database with sample data +3. **02-deploy-cognito.ipynb** - Set up OAuth with Cognito user pool +4. **03-deploy-mcp-server.ipynb** - Deploy MCP server on AgentCore Runtime +5. **04-deploy-gateway.ipynb** - Deploy Gateway with JWT interceptor +6. **05-deploy-agent.ipynb** - Deploy conversational AI agent +7. **06-streamlit-ui-deployment.ipynb** - Test end-to-end flow with OAuth +8. **07-optional-cleanup.ipynb** - Clean up all deployed resources (optional) + +**Total deployment time**: ~2-3 hours + +**Credential Loading**: All notebooks use centralized credential loading that automatically detects and uses credentials from your `.env` file, environment variables, or AWS SSO (in that order of priority). No need to configure credentials separately in each notebook. + +Each notebook: +- Explains what it deploys +- Shows progress and outputs +- Saves configuration to SSM Parameter Store +- Can be re-run safely (idempotent where possible) + +### What Gets Deployed + +- **S3 Bucket**: Data storage for Athena +- **Athena Database**: `lakehouse_db` with `claims` and `users` tables +- **Cognito User Pool**: OAuth authentication with test users +- **MCP Server**: Tool execution layer on AgentCore Runtime +- **Gateway**: Request routing with JWT validation +- **Agent**: Conversational AI on AgentCore Runtime +- **Test Users**: user001@example.com, user002@example.com (password: TempPass123!) + +### Cleanup + +To remove all deployed resources, run **07-optional-cleanup.ipynb**. This notebook will: +- Delete all AgentCore Runtimes and Gateways +- Delete Lambda functions +- Delete Cognito User Pool +- Delete Athena database and tables +- Optionally delete S3 bucket and data +- Delete all SSM parameters + +### Quick Test + +After deployment, test with: + +```python +# In notebook 06 or programmatically +Query: "Show me all claims" +Expected: Conversational response with claims data +``` + +### Manual Deployment (Alternative) + +If you prefer command-line deployment instead of notebooks, see the [Deployment Steps](#deployment-steps) section below. + +--- + +## Deployment Steps + +This section provides manual command-line deployment instructions as an alternative to the notebooks. + +### Complete Deployment Roadmap + +| Phase | Component | Command | Duration | +|-------|-----------|---------|----------| +| 1 | Athena Database | `python setup_athena.py` | 5 min | +| 2 | Cognito User Pool | `python setup_cognito.py` | 5 min | +| 3 | MCP Server | `python deploy_runtime.py --yes` | 10 min | +| 4 | Gateway & Interceptor | `python deploy_interceptor.py` + `python create_gateway.py --yes` | 5 min | +| 5 | Lakehouse Agent | `python deploy_lakehouse_agent.py --yes` | 5 min | +| 6 | Streamlit UI | `streamlit run streamlit_app.py` | 5 min | + + +**Total Time**: ~2.5 hours + +### Manual Deployment Commands + +If deploying via command line instead of notebooks: + +```bash +# Step 1: Deploy Athena +cd athena-setup +python setup_athena.py + +# Step 2: Deploy Cognito +cd ../cognito-setup +python setup_cognito.py + +# Step 3: Deploy MCP Server +cd ../mcp-lakehouse-server +python deploy_runtime.py --yes + +# Step 4: Deploy Gateway & Interceptor +cd ../gateway-setup/interceptor +python deploy_interceptor.py +cd .. +python create_gateway.py --yes + +# Step 5: Deploy Agent +cd ../lakehouse-agent +python deploy_lakehouse_agent.py --yes + +# Step 6: Test +cd .. +streamlit run streamlit_app.py +``` + +### Key Configuration Features + +**All scripts use**: +- āœ… **AWS session utility** (`aws_session_utils.py`) for SSO support +- āœ… **SSM Parameter Store** for sharing configuration +- āœ… **Automatic region detection** from AWS credentials +- āœ… **--yes flags** for notebook automation (skip interactive prompts) + +--- + +## Testing +**Test flow**: +1. Get OAuth token from Cognito +2. Call Agent Runtime with bearer token in header +3. Agent processes natural language query +4. Agent calls Gateway tools (validated by interceptor) +5. MCP Server executes Athena query +6. Results returned through chain + +**Expected output**: +``` +āœ… Token obtained: eyJraWQiOiJxxx... +āœ… Agent response received +āœ… Tool calls: 1 +šŸ“ Agent output: "I found 9 claims in the database..." +``` + +### Manual Test via Streamlit + +```bash +cd streamlit-ui +streamlit run streamlit_app.py +``` + +Test queries: +- "Show me all claims" +- "Get claims summary" +- "What claims are pending?" + +### User-Specific Data Access Demo + +The lakehouse agent implements row-level security (RLS) through Agentcore Lambda interceptors, ensuring users only see data they're authorized to access. Based on the logged-in user, you can see how user-specific datasets are shared in the screenshots below: + +#### Test User 1 - Limited Access +![Test User 1 - Lakehouse Agent](screenshots/testuser1-lakehouseagent.png) + +**User**: `testuser1` - Shows limited dataset access based on user permissions. This user can only see claims and data that they are authorized to view through row-level filters. + +#### Test User 2 - Different Data Scope +![Test User 2 - Lakehouse Agent](screenshots/testuser2-lakehouseagent.png) + +**User**: `testuser2` - Shows a different set of data based on their specific permissions. Notice how the same query returns different results depending on the authenticated user's access rights. + +**Key Security Features Demonstrated**: +- āœ… **Row-Level Security**: Each user sees only their authorized data +- āœ… **OAuth Integration**: User identity flows from Cognito through the entire system +- āœ… **Consistent Experience**: Same interface, personalized data based on user context + +--- + +## Usage Examples + +### Example 1: Query All Claims + +``` +User: "Show me all claims" + +Agent Response: +"I found 9 claims in the database: + +1. Claim CLM-001 - Amount: $500, Status: Approved +2. Claim CLM-002 - Amount: $1200, Status: Pending +3. Claim CLM-003 - Amount: $300, Status: Approved +... + +Would you like details on any specific claim?" +``` + +### Example 2: Get Claims Summary + +``` +User: "Give me a summary of all claims" + +Agent Response: +"Here's your claims summary: + +Total Claims: 9 +Total Amount: $8,900 + +By Status: +- Approved: 4 claims ($3,200) +- Pending: 3 claims ($2,700) +- Denied: 2 claims ($3,000) + +By Type: +- Medical: 5 claims ($5,000) +- Prescription: 2 claims ($800) +- Hospital: 2 claims ($3,100)" +``` + +### Example 3: Check Claim Status + +``` +User: "What's the status of claim CLM-001?" + +Agent Response: +"Claim CLM-001 details: + +Status: Approved āœ“ +Amount: $500 +Provider: City Hospital +Type: Medical Visit +Submitted Date: 2024-01-15 +Processed Date: 2024-01-18" +``` + +--- + +## Troubleshooting + +### Common Issues + +| Issue | Cause | Solution | +|-------|-------|----------| +| **AWS credentials not found** | Missing .env file or invalid credentials | Create .env file with valid AWS credentials | +| **Token has expired** | STS credentials expired | Update .env with fresh credentials or use SSO | +| **No credentials** | AWS_PROFILE not set (SSO) | `export AWS_PROFILE=your-profile` | +| **Bearer token required** | No token in request | Ensure token in Authorization header | +| **Invalid token** | Token expired or wrong client | Get new token from Cognito | +| **Gateway timeout** | MCP server slow | Increase Lambda timeout to 300s | +| **Athena permission denied** | Missing IAM permissions | Check execution role has Athena access | + +### Credential Troubleshooting + +#### .env File Issues + +**Error: "AWS credentials not found" or "No credentials configured"** +```bash +# Check if .env file exists +ls -la .env + +# If missing, create it with your credentials: +cat > .env << EOF +AWS_ACCESS_KEY_ID=your-access-key-id +AWS_SECRET_ACCESS_KEY=your-secret-access-key +AWS_SESSION_TOKEN=your-session-token +AWS_DEFAULT_REGION=us-east-1 +EOF +``` + +**Error: "Token has expired" (when using STS credentials)** +```bash +# Get new temporary credentials and update .env file +# Example using assume-role: +aws sts assume-role --role-arn arn:aws:iam::ACCOUNT:role/ROLE --role-session-name session + +# Then update .env with the new credentials +``` + +**Error: "Environment variables not loaded"** +- Restart Jupyter kernel to reload environment variables +- Ensure `.env` file is in the correct directory (`02-use-cases/lakehouse-agent/`) +- Check file permissions: `chmod 600 .env` + +### AWS SSO Troubleshooting + +**Error: "Token has expired and refresh failed"** +```bash +# Solution: Re-login +aws sso logout +aws sso login --profile your-profile-name +``` + +**Error: "Profile not found"** +```bash +# Check profiles +aws configure list-profiles + +# If missing, reconfigure +aws configure sso +``` + +**Error: "You must specify a region"** +```bash +# Set region in profile +aws configure set region us-east-1 --profile your-profile + +# Or environment variable +export AWS_DEFAULT_REGION=us-east-1 +``` + +### Debug Commands + +```bash +# Check configuration in SSM +python test_ssm_validation.py + +# Check agent status +python check_agent_status.py + +# View CloudWatch logs (replace runtime-id) +aws logs tail /aws/bedrock-agentcore/runtime/runtime-id --follow + +# View Gateway interceptor logs +aws logs tail /aws/lambda/lakehouse-gateway-interceptor --follow + +# View MCP server logs +aws logs tail /aws/bedrock-agentcore/runtime/mcp-server-id --follow + +# Test JWT token +python gateway-setup/test_cognito_login.py +``` + +### Logs to Check + +**Agent Runtime logs**: +```bash +aws logs tail /aws/bedrock-agentcore/runtime/ --follow +``` + +Expected: +``` +āœ… Bearer token extracted from Authorization header +āœ… Loaded 5 tools from Gateway +ā³ Processing request... +āœ… Request processed +``` + +**Interceptor Lambda logs**: +```bash +aws logs tail /aws/lambda/lakehouse-gateway-interceptor --follow +``` + +Expected: +``` +INFO Bearer token extracted from MCP gateway request +INFO Token validation successful +INFO User: user001@example.com +``` + +--- + +## File Structure + +``` +lakehouse-agent/ +│ +ā”œā”€ā”€ šŸ“¦ Utilities +│ └── aws_session_utils.py # AWS SSO session management +│ +ā”œā”€ā”€ šŸ—„ļø Data Layer +│ └── athena-setup/ +│ ā”œā”€ā”€ setup_athena.py # Athena database setup +│ ā”œā”€ā”€ create_tables.sql # Table definitions +│ └── sample_data.sql # Sample data +│ +ā”œā”€ā”€ šŸ” Identity Layer +│ └── cognito-setup/ +│ └── setup_cognito.py # Cognito OAuth setup +│ +ā”œā”€ā”€ 🌐 Gateway Layer +│ └── gateway-setup/ +│ ā”œā”€ā”€ create_gateway.py # Gateway creation +│ └── interceptor/ +│ ā”œā”€ā”€ lambda_function.py # JWT validator +│ └── deploy_interceptor.py # Deployment script +│ +ā”œā”€ā”€ šŸ”§ Tool Layer +│ └── mcp-lakehouse-server/ +│ ā”œā”€ā”€ server.py # MCP server +│ ā”œā”€ā”€ athena_tools.py # Athena query tools +│ ā”œā”€ā”€ requirements.txt # Dependencies +│ └── deploy_runtime.py # Deployment script +│ +ā”œā”€ā”€ šŸ¤– Agent Layer +│ └── lakehouse-agent/ +│ ā”œā”€ā”€ lakehouse_agent.py # Strands-based agent +│ ā”œā”€ā”€ requirements.txt # Dependencies +│ └── deploy_lakehouse_agent.py # Deployment script +│ +ā”œā”€ā”€ šŸ–„ļø UI Layer +│ └── streamlit-ui/ +│ ā”œā”€ā”€ streamlit_app.py # Main UI application +│ └── requirements.txt # Dependencies +│ +└── 🧪 Testing + └── tests/ + ā”œā”€ā”€ test_athena.py # Database tests + ā”œā”€ā”€ test_cognito.py # Auth tests + ā”œā”€ā”€ test_gateway.py # Gateway tests + ā”œā”€ā”€ test_agent.py # Agent tests + └── test_end_to_end.py # Integration tests +``` + +--- + +## Cost Estimate + +### Monthly Cost Breakdown (Approximate) + +``` +Component Monthly Cost +───────────────────────────────────────────── +S3 Storage (100GB) $2.30 +Athena (1TB scanned/month) $5.00 +Lambda (1M invocations) $0.20 +Cognito (1000 users) $0.00 (free tier) +AgentCore Runtime (2 runtimes) $50-$100 +Bedrock Claude API Variable (per token) +───────────────────────────────────────────── +Total (excluding Bedrock) ~$60-$110/month +``` + +### Cost Optimization Tips + +- Use Parquet format for S3 data (reduces Athena scan costs by 90%) +- Partition data by date (faster queries, lower costs) +- Cache frequent queries in application layer +- Monitor Bedrock token usage with CloudWatch + +--- + +## OAuth Scopes + +The system uses JWT scopes for fine-grained access control: + +| Scope | Description | Allows | +|-------|-------------|--------| +| `lakehouse-api/claims.query` | Read claims | query_claims, get_claim_details, get_claims_summary | +| `lakehouse-api/claims.submit` | Submit claims | submit_claim | +| `lakehouse-api/claims.update` | Update claims | update_claim_status | + +Scopes are validated in the Gateway interceptor Lambda. + +--- + +## Support & Resources + +### AWS Documentation + +- [Bedrock AgentCore](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) +- [Amazon Athena](https://docs.aws.amazon.com/athena/) +- [Amazon Cognito](https://docs.aws.amazon.com/cognito/) +- [AWS Lambda](https://docs.aws.amazon.com/lambda/) + +### Community + +- AWS Forums: https://forums.aws.amazon.com/ +- Stack Overflow tags: `amazon-bedrock`, `amazon-athena`, `aws-lambda` + +--- + +## License + +This project is licensed under the Apache License 2.0 - see the LICENSE file for details. + +--- + +**Status**: Production-Ready āœ… +**Authentication**: End-to-End OAuth with JWT +**Last Updated**: January 2025 diff --git a/02-use-cases/lakehouse-agent/deployment/athena-setup/create_tables.sql b/02-use-cases/lakehouse-agent/deployment/athena-setup/create_tables.sql new file mode 100644 index 00000000..40bf26e5 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/athena-setup/create_tables.sql @@ -0,0 +1,79 @@ +-- Health Lakehouse Data Processing System - Athena Table Schema +-- This script creates the database and tables for storing health lakehouse data + +-- Create database +CREATE DATABASE IF NOT EXISTS lakehouse_db; + +-- Use the database +-- Note: In Athena, you must explicitly use the database in your queries + +-- Create claims table with row-level access control support +CREATE EXTERNAL TABLE IF NOT EXISTS lakehouse_db.claims ( + claim_id STRING COMMENT 'Unique claim identifier', + user_id STRING COMMENT 'User/patient email for row-level access control', + patient_name STRING COMMENT 'Patient full name', + patient_dob DATE COMMENT 'Patient date of birth', + claim_date DATE COMMENT 'Date when claim occurred', + claim_amount DECIMAL(10,2) COMMENT 'Total claim amount in USD', + claim_type STRING COMMENT 'Type of claim: medical, prescription, hospital, emergency', + claim_status STRING COMMENT 'Current status: pending, approved, denied, in_review, requires_info', + provider_name STRING COMMENT 'Healthcare provider name', + provider_npi STRING COMMENT 'National Provider Identifier', + diagnosis_code STRING COMMENT 'ICD-10 diagnosis code', + procedure_code STRING COMMENT 'CPT procedure code', + submitted_date TIMESTAMP COMMENT 'When claim was submitted', + processed_date TIMESTAMP COMMENT 'When claim was processed', + approved_amount DECIMAL(10,2) COMMENT 'Approved claim amount', + denial_reason STRING COMMENT 'Reason for denial if applicable', + notes STRING COMMENT 'Additional notes or comments', + created_by STRING COMMENT 'User who created the claim', + last_modified_by STRING COMMENT 'User who last modified the claim', + last_modified_date TIMESTAMP COMMENT 'Last modification timestamp' +) +COMMENT 'Health lakehouse data table with row-level access control' +ROW FORMAT DELIMITED +FIELDS TERMINATED BY ',' +STORED AS TEXTFILE +LOCATION 's3://YOUR_BUCKET_NAME/lakehouse-data/claims/' +TBLPROPERTIES ( + 'skip.header.line.count'='1', + 'classification'='csv' +); + +-- Create users table for reference (optional, if you want to store user metadata) +CREATE EXTERNAL TABLE IF NOT EXISTS lakehouse_db.users ( + user_id STRING COMMENT 'User email address', + user_name STRING COMMENT 'User full name', + user_role STRING COMMENT 'User role: patient, adjuster, admin', + department STRING COMMENT 'Department or region', + created_date TIMESTAMP COMMENT 'User creation date' +) +COMMENT 'Users table for reference' +ROW FORMAT DELIMITED +FIELDS TERMINATED BY ',' +STORED AS TEXTFILE +LOCATION 's3://YOUR_BUCKET_NAME/lakehouse-data/users/' +TBLPROPERTIES ( + 'skip.header.line.count'='1', + 'classification'='csv' +); + +-- Create audit log table for tracking access (optional) +CREATE EXTERNAL TABLE IF NOT EXISTS lakehouse_db.audit_log ( + log_id STRING COMMENT 'Unique log identifier', + user_id STRING COMMENT 'User who performed the action', + action STRING COMMENT 'Action performed: query, insert, update, delete', + claim_id STRING COMMENT 'Claim ID affected', + timestamp TIMESTAMP COMMENT 'When action was performed', + ip_address STRING COMMENT 'User IP address', + details STRING COMMENT 'Additional details about the action' +) +COMMENT 'Audit log for compliance and security' +ROW FORMAT DELIMITED +FIELDS TERMINATED BY ',' +STORED AS TEXTFILE +LOCATION 's3://YOUR_BUCKET_NAME/lakehouse-data/audit/' +TBLPROPERTIES ( + 'skip.header.line.count'='1', + 'classification'='csv' +); diff --git a/02-use-cases/lakehouse-agent/deployment/athena-setup/sample_data.sql b/02-use-cases/lakehouse-agent/deployment/athena-setup/sample_data.sql new file mode 100644 index 00000000..27ecb15b --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/athena-setup/sample_data.sql @@ -0,0 +1,37 @@ +-- Sample Health Lakehouse Data Data +-- This file contains realistic sample data for testing row-level access control + +-- Sample data for claims table +-- Format: claim_id, user_id, patient_name, patient_dob, claim_date, claim_amount, claim_type, claim_status, provider_name, provider_npi, diagnosis_code, procedure_code, submitted_date, processed_date, approved_amount, denial_reason, notes, created_by, last_modified_by, last_modified_date + +-- Claims for user001@example.com (Patient: John Doe) +INSERT INTO lakehouse_db.claims VALUES +('CLM-2024-001', 'user001@example.com', 'John Doe', DATE '1985-03-15', DATE '2024-01-10', 1250.00, 'medical', 'approved', 'City Medical Center', '1234567890', 'J06.9', '99213', TIMESTAMP '2024-01-11 09:30:00', TIMESTAMP '2024-01-15 14:20:00', 1000.00, NULL, 'Annual physical examination and lab work', 'user001@example.com', 'adjuster001@example.com', TIMESTAMP '2024-01-15 14:20:00'), +('CLM-2024-002', 'user001@example.com', 'John Doe', DATE '1985-03-15', DATE '2024-02-05', 85.50, 'prescription', 'approved', 'CVS Pharmacy', '9876543210', 'E11.9', '90670', TIMESTAMP '2024-02-05 16:45:00', TIMESTAMP '2024-02-06 10:15:00', 85.50, NULL, 'Diabetes medication - monthly refill', 'user001@example.com', 'adjuster001@example.com', TIMESTAMP '2024-02-06 10:15:00'), +('CLM-2024-003', 'user001@example.com', 'John Doe', DATE '1985-03-15', DATE '2024-02-20', 3500.00, 'hospital', 'in_review', 'General Hospital', '1122334455', 'M54.5', '22612', TIMESTAMP '2024-02-21 08:00:00', NULL, NULL, NULL, 'Emergency room visit for back pain, including X-rays', 'user001@example.com', 'user001@example.com', TIMESTAMP '2024-02-21 08:00:00'), +('CLM-2024-004', 'user001@example.com', 'John Doe', DATE '1985-03-15', DATE '2024-03-10', 450.00, 'medical', 'pending', 'Downtown Dental Clinic', '2233445566', 'K02.9', 'D0150', TIMESTAMP '2024-03-11 11:20:00', NULL, NULL, NULL, 'Dental examination and cleaning', 'user001@example.com', 'user001@example.com', TIMESTAMP '2024-03-11 11:20:00'); + +-- Claims for user002@example.com (Patient: Jane Smith) +INSERT INTO lakehouse_db.claims VALUES +('CLM-2024-005', 'user002@example.com', 'Jane Smith', DATE '1990-07-22', DATE '2024-01-15', 850.00, 'medical', 'approved', 'Women''s Health Center', '5544332211', 'Z00.00', '99395', TIMESTAMP '2024-01-16 10:00:00', TIMESTAMP '2024-01-18 15:30:00', 680.00, NULL, 'Annual gynecological exam and preventive care', 'user002@example.com', 'adjuster001@example.com', TIMESTAMP '2024-01-18 15:30:00'), +('CLM-2024-006', 'user002@example.com', 'Jane Smith', DATE '1990-07-22', DATE '2024-02-10', 125.00, 'prescription', 'approved', 'Walgreens Pharmacy', '6655443322', 'H10.9', '90680', TIMESTAMP '2024-02-10 13:15:00', TIMESTAMP '2024-02-11 09:00:00', 125.00, NULL, 'Antibiotic prescription for eye infection', 'user002@example.com', 'adjuster001@example.com', TIMESTAMP '2024-02-11 09:00:00'), +('CLM-2024-007', 'user002@example.com', 'Jane Smith', DATE '1990-07-22', DATE '2024-02-25', 12500.00, 'hospital', 'approved', 'St. Mary''s Hospital', '7766554433', 'O80', '59400', TIMESTAMP '2024-02-26 07:30:00', TIMESTAMP '2024-03-05 16:00:00', 10000.00, NULL, 'Childbirth and postpartum care', 'user002@example.com', 'adjuster002@example.com', TIMESTAMP '2024-03-05 16:00:00'), +('CLM-2024-008', 'user002@example.com', 'Jane Smith', DATE '1990-07-22', DATE '2024-03-15', 200.00, 'medical', 'denied', 'Cosmetic Surgery Center', '8877665544', 'Z41.1', '15780', TIMESTAMP '2024-03-16 14:00:00', TIMESTAMP '2024-03-20 11:00:00', 0.00, 'Cosmetic procedures not covered by policy', 'Facial cosmetic procedure', 'user002@example.com', 'adjuster002@example.com', TIMESTAMP '2024-03-20 11:00:00'), +('CLM-2024-009', 'user002@example.com', 'Jane Smith', DATE '1990-07-22', DATE '2024-03-25', 75.00, 'prescription', 'pending', 'Target Pharmacy', '9988776655', 'Z79.890', '90715', TIMESTAMP '2024-03-26 09:45:00', NULL, NULL, NULL, 'Vitamin supplements and prenatal care', 'user002@example.com', 'user002@example.com', TIMESTAMP '2024-03-26 09:45:00'); + +-- Claims for adjuster001@example.com (Staff member - testing cross-access) +INSERT INTO lakehouse_db.claims VALUES +('CLM-2024-010', 'adjuster001@example.com', 'Michael Johnson', DATE '1978-11-30', DATE '2024-01-20', 500.00, 'medical', 'approved', 'Quick Care Clinic', '1231231234', 'J20.9', '99214', TIMESTAMP '2024-01-21 08:00:00', TIMESTAMP '2024-01-22 10:00:00', 500.00, NULL, 'Urgent care visit for bronchitis', 'adjuster001@example.com', 'adjuster002@example.com', TIMESTAMP '2024-01-22 10:00:00'), +('CLM-2024-011', 'adjuster001@example.com', 'Michael Johnson', DATE '1978-11-30', DATE '2024-03-01', 2800.00, 'hospital', 'pending', 'Regional Medical Center', '4564564567', 'S52.501A', '25605', TIMESTAMP '2024-03-02 15:30:00', NULL, NULL, NULL, 'Fracture treatment - left wrist, includes casting', 'adjuster001@example.com', 'adjuster001@example.com', TIMESTAMP '2024-03-02 15:30:00'); + +-- Sample data for users table +INSERT INTO lakehouse_db.users VALUES +('user001@example.com', 'John Doe', 'patient', 'Individual', TIMESTAMP '2023-01-15 00:00:00'), +('user002@example.com', 'Jane Smith', 'patient', 'Individual', TIMESTAMP '2023-02-20 00:00:00'), +('adjuster001@example.com', 'Michael Johnson', 'adjuster', 'Claims Department', TIMESTAMP '2022-06-01 00:00:00'), +('adjuster002@example.com', 'Sarah Williams', 'adjuster', 'Claims Department', TIMESTAMP '2022-08-15 00:00:00'), +('admin@example.com', 'Admin User', 'admin', 'IT Department', TIMESTAMP '2022-01-01 00:00:00'); + +-- Note: The actual data insertion for Athena requires CSV files in S3 +-- This SQL is for reference and documentation purposes +-- The setup_athena.py script will create proper CSV files and upload them to S3 diff --git a/02-use-cases/lakehouse-agent/deployment/athena-setup/setup_athena.py b/02-use-cases/lakehouse-agent/deployment/athena-setup/setup_athena.py new file mode 100644 index 00000000..71f16941 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/athena-setup/setup_athena.py @@ -0,0 +1,611 @@ +#!/usr/bin/env python3 +""" +Athena Setup Script for Health Lakehouse Data Processing System + +This script: +1. Creates an S3 bucket for Athena data and query results +2. Uploads sample claims data to S3 +3. Creates Athena database and tables +4. Verifies the setup by running test queries + +Usage: + python setup_athena.py --bucket-name BUCKET_NAME + python setup_athena.py # Reads bucket name from SSM + +Arguments: + --bucket-name: (Optional) Base name for S3 bucket. Will be prefixed with {account_id}-{region_name}- + If not provided, reads from SSM parameter /app/lakehouse-agent/s3-bucket-name + Example: --bucket-name my-lakehouse creates bucket XXXXXXXXXXXX-us-east-1-my-lakehouse +""" + +import boto3 +import csv +import io +import time +import sys +import argparse +from datetime import datetime, date +from decimal import Decimal +from typing import List, Dict, Any + +class AthenaSetup: + def __init__(self, bucket_base_name: str): + """ + Initialize Athena setup with AWS region and S3 bucket name. + + Region is obtained from the boto3 session. + Bucket name is constructed as: {account_id}-{region}-{bucket_base_name} + + Args: + bucket_base_name: Base name for S3 bucket (will be prefixed with account_id and region) + """ + # Get region from boto3 session + session = boto3.Session() + self.region = session.region_name + + # Get account ID from STS + sts_client = boto3.client('sts') + account_id = sts_client.get_caller_identity()['Account'] + + # Construct bucket name with prefix + self.bucket_name = f"{account_id}-{self.region}-{bucket_base_name}" + + self.database_name = 'lakehouse_db' + + # Initialize AWS clients + self.s3_client = boto3.client('s3', region_name=self.region) + self.athena_client = boto3.client('athena', region_name=self.region) + self.ssm_client = boto3.client('ssm', region_name=self.region) + + # S3 locations + self.claims_prefix = 'lakehouse-data/claims/' + self.users_prefix = 'lakehouse-data/users/' + self.query_results_prefix = 'athena-results/' + + def create_s3_bucket(self): + """Create S3 bucket if it doesn't exist.""" + print(f"\nšŸ“¦ Checking S3 bucket: {self.bucket_name}") + + try: + # Check if bucket exists + self.s3_client.head_bucket(Bucket=self.bucket_name) + print(f"āœ… Bucket {self.bucket_name} already exists") + except: + # Bucket doesn't exist, create it + try: + if self.region == 'us-east-1': + self.s3_client.create_bucket(Bucket=self.bucket_name) + else: + self.s3_client.create_bucket( + Bucket=self.bucket_name, + CreateBucketConfiguration={'LocationConstraint': self.region} + ) + print(f"āœ… Created S3 bucket: {self.bucket_name}") + except Exception as e: + print(f"āŒ Error creating bucket: {e}") + sys.exit(1) + + def get_sample_claims_data(self) -> List[Dict[str, Any]]: + """Generate sample claims data.""" + return [ + # Claims for user001@example.com (John Doe) + { + 'claim_id': 'CLM-2024-001', + 'user_id': 'user001@example.com', + 'patient_name': 'John Doe', + 'patient_dob': '1985-03-15', + 'claim_date': '2024-01-10', + 'claim_amount': '1250.00', + 'claim_type': 'medical', + 'claim_status': 'approved', + 'provider_name': 'City Medical Center', + 'provider_npi': '1234567890', + 'diagnosis_code': 'J06.9', + 'procedure_code': '99213', + 'submitted_date': '2024-01-11 09:30:00', + 'processed_date': '2024-01-15 14:20:00', + 'approved_amount': '1000.00', + 'denial_reason': '', + 'notes': 'Annual physical examination and lab work', + 'created_by': 'user001@example.com', + 'last_modified_by': 'adjuster001@example.com', + 'last_modified_date': '2024-01-15 14:20:00' + }, + { + 'claim_id': 'CLM-2024-002', + 'user_id': 'user001@example.com', + 'patient_name': 'John Doe', + 'patient_dob': '1985-03-15', + 'claim_date': '2024-02-05', + 'claim_amount': '85.50', + 'claim_type': 'prescription', + 'claim_status': 'approved', + 'provider_name': 'CVS Pharmacy', + 'provider_npi': '9876543210', + 'diagnosis_code': 'E11.9', + 'procedure_code': '90670', + 'submitted_date': '2024-02-05 16:45:00', + 'processed_date': '2024-02-06 10:15:00', + 'approved_amount': '85.50', + 'denial_reason': '', + 'notes': 'Diabetes medication - monthly refill', + 'created_by': 'user001@example.com', + 'last_modified_by': 'adjuster001@example.com', + 'last_modified_date': '2024-02-06 10:15:00' + }, + { + 'claim_id': 'CLM-2024-003', + 'user_id': 'user001@example.com', + 'patient_name': 'John Doe', + 'patient_dob': '1985-03-15', + 'claim_date': '2024-02-20', + 'claim_amount': '3500.00', + 'claim_type': 'hospital', + 'claim_status': 'in_review', + 'provider_name': 'General Hospital', + 'provider_npi': '1122334455', + 'diagnosis_code': 'M54.5', + 'procedure_code': '22612', + 'submitted_date': '2024-02-21 08:00:00', + 'processed_date': '', + 'approved_amount': '', + 'denial_reason': '', + 'notes': 'Emergency room visit for back pain, including X-rays', + 'created_by': 'user001@example.com', + 'last_modified_by': 'user001@example.com', + 'last_modified_date': '2024-02-21 08:00:00' + }, + { + 'claim_id': 'CLM-2024-004', + 'user_id': 'user001@example.com', + 'patient_name': 'John Doe', + 'patient_dob': '1985-03-15', + 'claim_date': '2024-03-10', + 'claim_amount': '450.00', + 'claim_type': 'medical', + 'claim_status': 'pending', + 'provider_name': 'Downtown Dental Clinic', + 'provider_npi': '2233445566', + 'diagnosis_code': 'K02.9', + 'procedure_code': 'D0150', + 'submitted_date': '2024-03-11 11:20:00', + 'processed_date': '', + 'approved_amount': '', + 'denial_reason': '', + 'notes': 'Dental examination and cleaning', + 'created_by': 'user001@example.com', + 'last_modified_by': 'user001@example.com', + 'last_modified_date': '2024-03-11 11:20:00' + }, + # Claims for user002@example.com (Jane Smith) + { + 'claim_id': 'CLM-2024-005', + 'user_id': 'user002@example.com', + 'patient_name': 'Jane Smith', + 'patient_dob': '1990-07-22', + 'claim_date': '2024-01-15', + 'claim_amount': '850.00', + 'claim_type': 'medical', + 'claim_status': 'approved', + 'provider_name': 'Womens Health Center', + 'provider_npi': '5544332211', + 'diagnosis_code': 'Z00.00', + 'procedure_code': '99395', + 'submitted_date': '2024-01-16 10:00:00', + 'processed_date': '2024-01-18 15:30:00', + 'approved_amount': '680.00', + 'denial_reason': '', + 'notes': 'Annual gynecological exam and preventive care', + 'created_by': 'user002@example.com', + 'last_modified_by': 'adjuster001@example.com', + 'last_modified_date': '2024-01-18 15:30:00' + }, + { + 'claim_id': 'CLM-2024-006', + 'user_id': 'user002@example.com', + 'patient_name': 'Jane Smith', + 'patient_dob': '1990-07-22', + 'claim_date': '2024-02-10', + 'claim_amount': '125.00', + 'claim_type': 'prescription', + 'claim_status': 'approved', + 'provider_name': 'Walgreens Pharmacy', + 'provider_npi': '6655443322', + 'diagnosis_code': 'H10.9', + 'procedure_code': '90680', + 'submitted_date': '2024-02-10 13:15:00', + 'processed_date': '2024-02-11 09:00:00', + 'approved_amount': '125.00', + 'denial_reason': '', + 'notes': 'Antibiotic prescription for eye infection', + 'created_by': 'user002@example.com', + 'last_modified_by': 'adjuster001@example.com', + 'last_modified_date': '2024-02-11 09:00:00' + }, + { + 'claim_id': 'CLM-2024-007', + 'user_id': 'user002@example.com', + 'patient_name': 'Jane Smith', + 'patient_dob': '1990-07-22', + 'claim_date': '2024-02-25', + 'claim_amount': '12500.00', + 'claim_type': 'hospital', + 'claim_status': 'approved', + 'provider_name': 'St. Marys Hospital', + 'provider_npi': '7766554433', + 'diagnosis_code': 'O80', + 'procedure_code': '59400', + 'submitted_date': '2024-02-26 07:30:00', + 'processed_date': '2024-03-05 16:00:00', + 'approved_amount': '10000.00', + 'denial_reason': '', + 'notes': 'Childbirth and postpartum care', + 'created_by': 'user002@example.com', + 'last_modified_by': 'adjuster002@example.com', + 'last_modified_date': '2024-03-05 16:00:00' + }, + { + 'claim_id': 'CLM-2024-008', + 'user_id': 'user002@example.com', + 'patient_name': 'Jane Smith', + 'patient_dob': '1990-07-22', + 'claim_date': '2024-03-15', + 'claim_amount': '2000.00', + 'claim_type': 'medical', + 'claim_status': 'denied', + 'provider_name': 'Cosmetic Surgery Center', + 'provider_npi': '8877665544', + 'diagnosis_code': 'Z41.1', + 'procedure_code': '15780', + 'submitted_date': '2024-03-16 14:00:00', + 'processed_date': '2024-03-20 11:00:00', + 'approved_amount': '0.00', + 'denial_reason': 'Cosmetic procedures not covered by policy', + 'notes': 'Facial cosmetic procedure', + 'created_by': 'user002@example.com', + 'last_modified_by': 'adjuster002@example.com', + 'last_modified_date': '2024-03-20 11:00:00' + }, + # Claims for adjuster001@example.com + { + 'claim_id': 'CLM-2024-009', + 'user_id': 'adjuster001@example.com', + 'patient_name': 'Michael Johnson', + 'patient_dob': '1978-11-30', + 'claim_date': '2024-01-20', + 'claim_amount': '500.00', + 'claim_type': 'medical', + 'claim_status': 'approved', + 'provider_name': 'Quick Care Clinic', + 'provider_npi': '1231231234', + 'diagnosis_code': 'J20.9', + 'procedure_code': '99214', + 'submitted_date': '2024-01-21 08:00:00', + 'processed_date': '2024-01-22 10:00:00', + 'approved_amount': '500.00', + 'denial_reason': '', + 'notes': 'Urgent care visit for bronchitis', + 'created_by': 'adjuster001@example.com', + 'last_modified_by': 'adjuster002@example.com', + 'last_modified_date': '2024-01-22 10:00:00' + } + ] + + def get_sample_users_data(self) -> List[Dict[str, Any]]: + """Generate sample users data.""" + return [ + { + 'user_id': 'user001@example.com', + 'user_name': 'John Doe', + 'user_role': 'patient', + 'department': 'Individual', + 'created_date': '2023-01-15 00:00:00' + }, + { + 'user_id': 'user002@example.com', + 'user_name': 'Jane Smith', + 'user_role': 'patient', + 'department': 'Individual', + 'created_date': '2023-02-20 00:00:00' + }, + { + 'user_id': 'adjuster001@example.com', + 'user_name': 'Michael Johnson', + 'user_role': 'adjuster', + 'department': 'Claims Department', + 'created_date': '2022-06-01 00:00:00' + }, + { + 'user_id': 'adjuster002@example.com', + 'user_name': 'Sarah Williams', + 'user_role': 'adjuster', + 'department': 'Claims Department', + 'created_date': '2022-08-15 00:00:00' + }, + { + 'user_id': 'admin@example.com', + 'user_name': 'Admin User', + 'user_role': 'admin', + 'department': 'IT Department', + 'created_date': '2022-01-01 00:00:00' + } + ] + + def upload_csv_to_s3(self, data: List[Dict[str, Any]], s3_key: str): + """Upload data as CSV to S3.""" + if not data: + print(f"āš ļø No data to upload for {s3_key}") + return + + # Create CSV in memory + output = io.StringIO() + writer = csv.DictWriter(output, fieldnames=data[0].keys()) + writer.writeheader() + writer.writerows(data) + + # Upload to S3 + try: + self.s3_client.put_object( + Bucket=self.bucket_name, + Key=s3_key, + Body=output.getvalue().encode('utf-8') + ) + print(f"āœ… Uploaded {s3_key} to S3") + except Exception as e: + print(f"āŒ Error uploading {s3_key}: {e}") + raise + + def run_athena_query(self, query: str, wait_for_results: bool = True) -> str: + """ + Execute an Athena query and optionally wait for results. + + Args: + query: SQL query to execute + wait_for_results: Whether to wait for query completion + + Returns: + Query execution ID + """ + try: + # Prepare query execution parameters + query_params = { + 'QueryString': query, + 'ResultConfiguration': { + 'OutputLocation': f's3://{self.bucket_name}/{self.query_results_prefix}' + } + } + + # Only add Database context if not creating a database + if 'CREATE DATABASE' not in query.upper(): + query_params['QueryExecutionContext'] = {'Database': self.database_name} + + response = self.athena_client.start_query_execution(**query_params) + + query_execution_id = response['QueryExecutionId'] + + if wait_for_results: + # Wait for query to complete + while True: + status_response = self.athena_client.get_query_execution( + QueryExecutionId=query_execution_id + ) + status = status_response['QueryExecution']['Status']['State'] + + if status in ['SUCCEEDED', 'FAILED', 'CANCELLED']: + if status == 'SUCCEEDED': + return query_execution_id + else: + error = status_response['QueryExecution']['Status'].get('StateChangeReason', 'Unknown error') + raise Exception(f"Query failed: {error}") + + time.sleep(1) + + return query_execution_id + + except Exception as e: + print(f"āŒ Error executing query: {e}") + raise + + def store_parameters_in_ssm(self): + """Store S3 bucket name and database name in SSM Parameter Store.""" + print("\nšŸ’¾ Storing configuration in SSM Parameter Store...") + + parameters = [ + { + 'name': '/app/lakehouse-agent/s3-bucket-name', + 'value': self.bucket_name, + 'description': 'S3 bucket name for lakehouse data storage' + }, + { + 'name': '/app/lakehouse-agent/database-name', + 'value': self.database_name, + 'description': 'Athena/Glue database name for lakehouse' + } + ] + + for param in parameters: + try: + self.ssm_client.put_parameter( + Name=param['name'], + Value=param['value'], + Description=param['description'], + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: {param['name']} = {param['value']}") + except Exception as e: + print(f"āŒ Error storing parameter {param['name']}: {e}") + raise + + def setup(self): + """Run the complete Athena setup.""" + print("\nšŸš€ Starting Athena Setup for Health Lakehouse Data Processing") + print(f" Region: {self.region}") + print(f" S3 Bucket: {self.bucket_name}") + + # Step 1: Create S3 bucket + self.create_s3_bucket() + + # Step 2: Upload sample data + print("\nšŸ“¤ Uploading sample data to S3...") + claims_data = self.get_sample_claims_data() + users_data = self.get_sample_users_data() + + self.upload_csv_to_s3(claims_data, f'{self.claims_prefix}claims.csv') + self.upload_csv_to_s3(users_data, f'{self.users_prefix}users.csv') + + # Step 3: Create Athena database + print("\nšŸ—„ļø Creating Athena database...") + create_db_query = f"CREATE DATABASE IF NOT EXISTS {self.database_name}" + try: + self.run_athena_query(create_db_query) + print(f"āœ… Database {self.database_name} created") + except Exception as e: + print(f"āŒ Error creating database: {e}") + return + + # Step 4: Create claims table + print("\nšŸ“Š Creating claims table...") + create_claims_table_query = f""" + CREATE EXTERNAL TABLE IF NOT EXISTS {self.database_name}.claims ( + claim_id STRING, + user_id STRING, + patient_name STRING, + patient_dob STRING, + claim_date STRING, + claim_amount STRING, + claim_type STRING, + claim_status STRING, + provider_name STRING, + provider_npi STRING, + diagnosis_code STRING, + procedure_code STRING, + submitted_date STRING, + processed_date STRING, + approved_amount STRING, + denial_reason STRING, + notes STRING, + created_by STRING, + last_modified_by STRING, + last_modified_date STRING + ) + ROW FORMAT DELIMITED + FIELDS TERMINATED BY ',' + STORED AS TEXTFILE + LOCATION 's3://{self.bucket_name}/{self.claims_prefix}' + TBLPROPERTIES ('skip.header.line.count'='1') + """ + try: + self.run_athena_query(create_claims_table_query) + print("āœ… Claims table created") + except Exception as e: + print(f"āŒ Error creating claims table: {e}") + return + + # Step 5: Create users table + print("\nšŸ‘„ Creating users table...") + create_users_table_query = f""" + CREATE EXTERNAL TABLE IF NOT EXISTS {self.database_name}.users ( + user_id STRING, + user_name STRING, + user_role STRING, + department STRING, + created_date STRING + ) + ROW FORMAT DELIMITED + FIELDS TERMINATED BY ',' + STORED AS TEXTFILE + LOCATION 's3://{self.bucket_name}/{self.users_prefix}' + TBLPROPERTIES ('skip.header.line.count'='1') + """ + try: + self.run_athena_query(create_users_table_query) + print("āœ… Users table created") + except Exception as e: + print(f"āŒ Error creating users table: {e}") + return + + # Step 6: Verify setup with test query + print("\nšŸ” Verifying setup with test queries...") + try: + # Count claims + count_query = f"SELECT COUNT(*) as total_claims FROM {self.database_name}.claims" + self.run_athena_query(count_query) + print("āœ… Claims table verification successful") + + # Query claims for user001 + user_query = f"SELECT claim_id, claim_type, claim_status FROM {self.database_name}.claims WHERE user_id = 'user001@example.com' LIMIT 5" + self.run_athena_query(user_query) + print("āœ… User-specific query successful") + + except Exception as e: + print(f"āš ļø Verification query failed: {e}") + + # Step 7: Store configuration in SSM Parameter Store + self.store_parameters_in_ssm() + + print("\n✨ Athena setup completed successfully!") + print(f"\nļæ½ Database name: {self.database_name}") + print(f"šŸ“ S3 bucket: s3://{self.bucket_name}") + print(f"šŸ“Š Tables created: claims, users") + print(f"šŸ’¾ SSM Parameters:") + print(f" - /app/lakehouse-agent/s3-bucket-name") + print(f" - /app/lakehouse-agent/database-name") + print(f"\nšŸ” Row-level access control ready:") + print(f" - user001@example.com: {len([c for c in claims_data if c['user_id'] == 'user001@example.com'])} claims") + print(f" - user002@example.com: {len([c for c in claims_data if c['user_id'] == 'user002@example.com'])} claims") + print(f" - adjuster001@example.com: {len([c for c in claims_data if c['user_id'] == 'adjuster001@example.com'])} claims") + +def main(): + parser = argparse.ArgumentParser( + description='Setup Athena database and tables for health lakehouse data processing' + ) + parser.add_argument( + '--bucket-name', + required=False, + default=None, + help='Base name for S3 bucket (will be prefixed with {account_id}-{region_name}-). ' + 'If not provided, reads from SSM parameter /app/lakehouse-agent/s3-bucket-name. ' + 'Example: my-lakehouse' + ) + + args = parser.parse_args() + + bucket_name = args.bucket_name + + # If bucket name not provided, try to read from SSM + if not bucket_name: + print("šŸ“‹ No --bucket-name provided, reading from SSM Parameter Store...") + try: + session = boto3.Session() + ssm = boto3.client('ssm', region_name=session.region_name) + response = ssm.get_parameter(Name='/app/lakehouse-agent/s3-bucket-name') + full_bucket_name = response['Parameter']['Value'] + print(f"āœ… Found bucket name in SSM: {full_bucket_name}") + + # Extract the base name by removing the account-region prefix + # Format is: {account_id}-{region}-{base_name} + sts = boto3.client('sts') + account_id = sts.get_caller_identity()['Account'] + region = session.region_name + prefix = f"{account_id}-{region}-" + + if full_bucket_name.startswith(prefix): + bucket_name = full_bucket_name[len(prefix):] + print(f" Extracted base name: {bucket_name}") + else: + # Use the full bucket name as-is (might be a custom name) + bucket_name = full_bucket_name + print(f" Using full bucket name: {bucket_name}") + + except Exception as e: + print(f"āŒ Error reading bucket name from SSM: {e}") + print(" Please provide --bucket-name argument or set SSM parameter /app/lakehouse-agent/s3-bucket-name") + sys.exit(1) + + # Run setup + setup = AthenaSetup(bucket_base_name=bucket_name) + setup.setup() + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/cognito-setup/check_m2m_client.py b/02-use-cases/lakehouse-agent/deployment/cognito-setup/check_m2m_client.py new file mode 100755 index 00000000..1d9b9981 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/cognito-setup/check_m2m_client.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python3 +""" +Check M2M Client Configuration + +This script checks the M2M client configuration and identifies any issues. + +Usage: + python check_m2m_client.py +""" + +import boto3 +import json +import sys + + +def main(): + session = boto3.Session() + region = session.region_name + cognito = boto3.client('cognito-idp', region_name=region) + ssm = boto3.client('ssm', region_name=region) + + print("=" * 70) + print("Check M2M Client Configuration") + print("=" * 70) + + # Get user pool ID and M2M client ID + try: + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + m2m_client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-id')['Parameter']['Value'] + + print(f"\nāœ… Configuration found:") + print(f" User Pool ID: {user_pool_id}") + print(f" M2M Client ID: {m2m_client_id}") + except Exception as e: + print(f"\nāŒ Error: Could not get configuration: {e}") + sys.exit(1) + + # Get M2M client details + print(f"\nšŸ“‹ M2M Client Configuration:") + print("=" * 70) + + try: + response = cognito.describe_user_pool_client( + UserPoolId=user_pool_id, + ClientId=m2m_client_id + ) + client = response['UserPoolClient'] + + print(f"\nClient Name: {client.get('ClientName', 'N/A')}") + print(f"\nšŸ”‘ Authentication Flows:") + print(f" ExplicitAuthFlows: {client.get('ExplicitAuthFlows', [])}") + print(f" AllowedOAuthFlows: {client.get('AllowedOAuthFlows', [])}") + print(f" AllowedOAuthFlowsUserPoolClient: {client.get('AllowedOAuthFlowsUserPoolClient', False)}") + + print(f"\nšŸ” OAuth Configuration:") + print(f" AllowedOAuthScopes: {client.get('AllowedOAuthScopes', [])}") + print(f" SupportedIdentityProviders: {client.get('SupportedIdentityProviders', [])}") + print(f" CallbackURLs: {client.get('CallbackURLs', [])}") + print(f" LogoutURLs: {client.get('LogoutURLs', [])}") + + print(f"\nšŸ”’ Security:") + print(f" PreventUserExistenceErrors: {client.get('PreventUserExistenceErrors', 'N/A')}") + + # Check for issues + print(f"\nšŸ” Validation:") + issues = [] + + if not client.get('AllowedOAuthFlowsUserPoolClient'): + issues.append("āŒ AllowedOAuthFlowsUserPoolClient is False (must be True)") + else: + print(f" āœ… AllowedOAuthFlowsUserPoolClient is True") + + if 'client_credentials' not in client.get('AllowedOAuthFlows', []): + issues.append("āŒ client_credentials not in AllowedOAuthFlows") + else: + print(f" āœ… client_credentials flow is enabled") + + if not client.get('AllowedOAuthScopes'): + issues.append("āŒ No OAuth scopes configured") + else: + print(f" āœ… OAuth scopes configured: {len(client.get('AllowedOAuthScopes', []))} scopes") + + if client.get('ExplicitAuthFlows'): + issues.append(f"āš ļø ExplicitAuthFlows should be empty for M2M-only client: {client.get('ExplicitAuthFlows')}") + else: + print(f" āœ… ExplicitAuthFlows is empty (M2M only)") + + # Check for callback URLs (some Cognito configs require this) + if not client.get('CallbackURLs'): + issues.append("āš ļø No CallbackURLs configured (may cause invalid_grant error)") + print(f" āš ļø CallbackURLs is empty (may need dummy URL)") + else: + print(f" āœ… CallbackURLs configured") + + if issues: + print(f"\nāŒ Issues Found:") + for issue in issues: + print(f" {issue}") + + print(f"\nšŸ”§ Recommended Fix:") + print(f" Run: python copy_m2m_client.py") + print(f" This will reconfigure the M2M client with correct settings") + else: + print(f"\nāœ… M2M client configuration looks good!") + + # Test token request + print(f"\n🧪 Testing Token Request:") + print("=" * 70) + + try: + domain = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-domain')['Parameter']['Value'] + client_secret = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-secret', WithDecryption=True)['Parameter']['Value'] + + import requests + import base64 + + token_endpoint = f"{domain}/oauth2/token" + credentials = f"{m2m_client_id}:{client_secret}" + encoded_credentials = base64.b64encode(credentials.encode()).decode() + + print(f" Token Endpoint: {token_endpoint}") + print(f" Client ID: {m2m_client_id}") + print(f" Attempting token request...") + + response = requests.post( + token_endpoint, + headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {encoded_credentials}' + }, + data={ + 'grant_type': 'client_credentials', + 'scope': ' '.join(client.get('AllowedOAuthScopes', [])) + } + ) + + if response.status_code == 200: + print(f"\n āœ… Token request successful!") + token_data = response.json() + print(f" Access Token: {token_data['access_token'][:50]}...") + print(f" Token Type: {token_data['token_type']}") + print(f" Expires In: {token_data['expires_in']} seconds") + else: + print(f"\n āŒ Token request failed!") + print(f" Status Code: {response.status_code}") + print(f" Response: {response.text}") + + if response.status_code == 400 and 'invalid_grant' in response.text: + print(f"\n šŸ’” Possible causes of invalid_grant:") + print(f" 1. AllowedOAuthFlowsUserPoolClient not set to True") + print(f" 2. Missing CallbackURLs (add dummy URL)") + print(f" 3. Client not properly configured for client_credentials") + print(f"\n šŸ”§ Fix: python copy_m2m_client.py") + + except Exception as e: + print(f"\n āŒ Error testing token request: {e}") + + except Exception as e: + print(f"\nāŒ Error: Could not get client details: {e}") + sys.exit(1) + + print("\n" + "=" * 70) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/cognito-setup/decode_token.py b/02-use-cases/lakehouse-agent/deployment/cognito-setup/decode_token.py new file mode 100644 index 00000000..a89ae7eb --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/cognito-setup/decode_token.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +""" +Decode JWT Token to inspect claims + +This script gets a token from the M2M client and decodes it to see what's inside. +""" + +import boto3 +import json +import base64 +import requests + + +def decode_jwt(token): + """Decode JWT token without verification (for inspection only).""" + parts = token.split('.') + if len(parts) != 3: + print("Invalid JWT token format") + return None + + # Decode header + header = json.loads(base64.urlsafe_b64decode(parts[0] + '==')) + + # Decode payload + payload = json.loads(base64.urlsafe_b64decode(parts[1] + '==')) + + return header, payload + + +def main(): + session = boto3.Session() + region = session.region_name + ssm = boto3.client('ssm', region_name=region) + + print("=" * 70) + print("Decode M2M JWT Token") + print("=" * 70) + + # Get M2M client credentials + try: + client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-id')['Parameter']['Value'] + client_secret = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-secret', WithDecryption=True)['Parameter']['Value'] + domain = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-domain')['Parameter']['Value'] + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + + print(f"\nāœ… Configuration loaded:") + print(f" Client ID: {client_id}") + print(f" Domain: {domain}") + print(f" User Pool ID: {user_pool_id}") + except Exception as e: + print(f"\nāŒ Error: {e}") + return + + # Get token + print(f"\nšŸ” Requesting token...") + token_endpoint = f"{domain}/oauth2/token" + credentials = f"{client_id}:{client_secret}" + encoded_credentials = base64.b64encode(credentials.encode()).decode() + + # Get the configured scopes + cognito = boto3.client('cognito-idp', region_name=region) + client_details = cognito.describe_user_pool_client( + UserPoolId=user_pool_id, + ClientId=client_id + ) + allowed_scopes = client_details['UserPoolClient'].get('AllowedOAuthScopes', []) + scope_string = ' '.join(allowed_scopes) + + response = requests.post( + token_endpoint, + headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {encoded_credentials}' + }, + data={ + 'grant_type': 'client_credentials', + 'scope': scope_string + } + ) + + if response.status_code != 200: + print(f"āŒ Token request failed: {response.status_code}") + print(f" Response: {response.text}") + return + + token_data = response.json() + access_token = token_data['access_token'] + + print(f"āœ… Token received") + + # Decode token + print(f"\nšŸ“‹ Decoding JWT Token...") + header, payload = decode_jwt(access_token) + + print(f"\nšŸ”‘ JWT Header:") + print(json.dumps(header, indent=2)) + + print(f"\nšŸ“¦ JWT Payload:") + print(json.dumps(payload, indent=2)) + + # Check important claims + print(f"\nšŸ” Important Claims:") + print(f" Issuer (iss): {payload.get('iss', 'N/A')}") + print(f" Client ID (client_id): {payload.get('client_id', 'N/A')}") + print(f" Audience (aud): {payload.get('aud', 'N/A')}") + print(f" Scope: {payload.get('scope', 'N/A')}") + print(f" Token Use: {payload.get('token_use', 'N/A')}") + print(f" Expires (exp): {payload.get('exp', 'N/A')}") + + # Check if issuer matches expected format + expected_issuer = f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" + if payload.get('iss') == expected_issuer: + print(f"\n āœ… Issuer matches expected format") + else: + print(f"\n āš ļø Issuer mismatch!") + print(f" Expected: {expected_issuer}") + print(f" Got: {payload.get('iss')}") + + # Check client_id + if payload.get('client_id') == client_id: + print(f" āœ… Client ID matches") + else: + print(f" āš ļø Client ID mismatch!") + print(f" Expected: {client_id}") + print(f" Got: {payload.get('client_id')}") + + print("\n" + "=" * 70) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/cognito-setup/setup_cognito.py b/02-use-cases/lakehouse-agent/deployment/cognito-setup/setup_cognito.py new file mode 100644 index 00000000..3928d5c0 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/cognito-setup/setup_cognito.py @@ -0,0 +1,515 @@ +#!/usr/bin/env python3 +""" +Cognito Setup for Health Lakehouse Data +Creates User Pool, App Client, Resource Server, and test users with OAuth scopes +Writes configuration to SSM Parameter Store + +Usage: + python setup_cognito.py +""" +import boto3 +import json +import os +import re +from pathlib import Path +from typing import Dict, Optional + +class CognitoSetup: + def __init__(self): + """Initialize Cognito setup with region from boto3 session.""" + # Get region from boto3 session + session = boto3.Session() + self.region = session.region_name + + self.cognito = boto3.client('cognito-idp', region_name=self.region) + self.ssm = boto3.client('ssm', region_name=self.region) + self.sts = boto3.client('sts', region_name=self.region) + self.env_file = Path(__file__).parent.parent / '.env' + + print(f"Initialized Cognito setup for region: {self.region}") + + def find_existing_user_pool(self, pool_name: str) -> Optional[str]: + """Find existing user pool by name.""" + try: + paginator = self.cognito.get_paginator('list_user_pools') + for page in paginator.paginate(MaxResults=60): + for pool in page.get('UserPools', []): + if pool['Name'] == pool_name: + print(f"ā„¹ļø Found existing User Pool: {pool['Id']}") + return pool['Id'] + except Exception as e: + print(f"āš ļø Error searching for user pool: {e}") + return None + + def get_user_pool_client(self, user_pool_id: str, client_name: str) -> Optional[Dict]: + """Get existing app client by name.""" + try: + paginator = self.cognito.get_paginator('list_user_pool_clients') + for page in paginator.paginate(UserPoolId=user_pool_id, MaxResults=60): + for client in page.get('UserPoolClients', []): + if client['ClientName'] == client_name: + # Get full client details including secret + full_client = self.cognito.describe_user_pool_client( + UserPoolId=user_pool_id, + ClientId=client['ClientId'] + ) + print(f"ā„¹ļø Found existing App Client: {client['ClientId']}") + return full_client['UserPoolClient'] + except Exception as e: + print(f"āš ļø Error searching for app client: {e}") + return None + + def get_user_pool_domain(self, user_pool_id: str) -> Optional[str]: + """Get existing domain for user pool.""" + try: + response = self.cognito.describe_user_pool(UserPoolId=user_pool_id) + domain = response['UserPool'].get('Domain') + if domain: + domain_url = f'https://{domain}.auth.{self.region}.amazoncognito.com' + print(f"ā„¹ļø Found existing domain: {domain_url}") + return domain_url + except Exception as e: + print(f"āš ļø Error getting domain: {e}") + return None + + def store_parameters_in_ssm(self, config: Dict): + """ + Store Cognito configuration in SSM Parameter Store. + + Args: + config: Dictionary with user_pool_id, client_id, domain, m2m_client_id, m2m_client_secret, and optionally client_secret + """ + print("\nšŸ’¾ Storing configuration in SSM Parameter Store...") + + # Get account ID for constructing ARN + account_id = self.sts.get_caller_identity()['Account'] + user_pool_arn = f"arn:aws:cognito-idp:{self.region}:{account_id}:userpool/{config['user_pool_id']}" + + parameters = [ + { + 'name': '/app/lakehouse-agent/cognito-user-pool-id', + 'value': config['user_pool_id'], + 'description': 'Cognito User Pool ID for authentication' + }, + { + 'name': '/app/lakehouse-agent/cognito-user-pool-arn', + 'value': user_pool_arn, + 'description': 'Cognito User Pool ARN' + }, + { + 'name': '/app/lakehouse-agent/cognito-app-client-id', + 'value': config['client_id'], + 'description': 'Cognito App Client ID (supports user auth and M2M)' + }, + { + 'name': '/app/lakehouse-agent/cognito-domain', + 'value': config['domain'], + 'description': 'Cognito domain URL for OAuth' + }, + { + 'name': '/app/lakehouse-agent/cognito-resource-server-id', + 'value': 'lakehouse-api', + 'description': 'Cognito Resource Server identifier' + }, + { + 'name': '/app/lakehouse-agent/cognito-region', + 'value': self.region, + 'description': 'AWS region for Cognito' + }, + { + 'name': '/app/lakehouse-agent/cognito-m2m-client-id', + 'value': config['m2m_client_id'], + 'description': 'Cognito M2M-only App Client ID (client_credentials only)' + } + ] + + # Store client secret as SecureString if available + if 'client_secret' in config and config['client_secret']: + try: + self.ssm.put_parameter( + Name='/app/lakehouse-agent/cognito-app-client-secret', + Value=config['client_secret'], + Description='Cognito App Client Secret (SecureString)', + Type='SecureString', + Overwrite=True + ) + print(f"āœ… Stored parameter (SecureString): /app/lakehouse-agent/cognito-app-client-secret") + except Exception as e: + print(f"āŒ Error storing client secret: {e}") + raise + + # Store M2M client secret as SecureString + if 'm2m_client_secret' in config and config['m2m_client_secret']: + try: + self.ssm.put_parameter( + Name='/app/lakehouse-agent/cognito-m2m-client-secret', + Value=config['m2m_client_secret'], + Description='Cognito M2M App Client Secret (SecureString)', + Type='SecureString', + Overwrite=True + ) + print(f"āœ… Stored parameter (SecureString): /app/lakehouse-agent/cognito-m2m-client-secret") + except Exception as e: + print(f"āŒ Error storing M2M client secret: {e}") + raise + + # Store other parameters as String type + for param in parameters: + try: + self.ssm.put_parameter( + Name=param['name'], + Value=param['value'], + Description=param['description'], + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: {param['name']} = {param['value']}") + except Exception as e: + print(f"āŒ Error storing parameter {param['name']}: {e}") + raise + + def write_to_env(self, config: Dict): + """ + Write configuration to .env file. + + Note: This function is deprecated and will be removed in a future version. + Configuration should be managed through SSM Parameter Store. + This is kept temporarily for backward compatibility during migration. + """ + print(f"āš ļø Warning: .env file updates are deprecated. Please migrate to SSM Parameter Store.") + print(f" Run: python ../ssm_migrate.py --migrate") + + try: + # Read existing .env file + env_content = {} + if self.env_file.exists(): + with open(self.env_file, 'r') as f: + for line in f: + line = line.strip() + if line and not line.startswith('#') and '=' in line: + key, value = line.split('=', 1) + env_content[key.strip()] = value.strip() + + # Update with new values + env_content['COGNITO_USER_POOL_ID'] = config['user_pool_id'] + env_content['COGNITO_APP_CLIENT_ID'] = config['client_id'] + if 'client_secret' in config: + env_content['COGNITO_APP_CLIENT_SECRET'] = config['client_secret'] + env_content['COGNITO_DOMAIN'] = config['domain'] + env_content['COGNITO_RESOURCE_SERVER_ID'] = 'lakehouse-api' + + # Construct User Pool ARN + user_pool_arn = f"arn:aws:cognito-idp:{self.region}:{self.sts.get_caller_identity()['Account']}:userpool/{config['user_pool_id']}" + env_content['COGNITO_USER_POOL_ARN'] = user_pool_arn + + # Write back to .env file + with open(self.env_file, 'w') as f: + for key, value in sorted(env_content.items()): + f.write(f"{key}={value}\n") + + print(f"\nāœ… Configuration written to {self.env_file} (for backward compatibility)") + + except Exception as e: + print(f"āŒ Error writing to .env file: {e}") + raise + + def setup(self, pool_name: str = 'lakehouse-pool') -> Dict: + # Check for existing User Pool + user_pool_id = self.find_existing_user_pool(pool_name) + + if not user_pool_id: + # Create User Pool with username-password authentication enabled + # NOTE: NOT using UsernameAttributes to allow email to be the actual username + pool_response = self.cognito.create_user_pool( + PoolName=pool_name, + Policies={ + 'PasswordPolicy': { + 'MinimumLength': 8, + 'RequireUppercase': True, + 'RequireLowercase': True, + 'RequireNumbers': True, + 'RequireSymbols': True + } + }, + AutoVerifiedAttributes=['email'], + # NOT setting UsernameAttributes - this allows email to be used as username directly + Schema=[ + { + 'Name': 'email', + 'Required': True, + 'Mutable': True + } + ], + AdminCreateUserConfig={ + 'AllowAdminCreateUserOnly': False # Allow users to sign up + } + ) + user_pool_id = pool_response['UserPool']['Id'] + print(f"āœ… User Pool created: {user_pool_id}") + print(f" Note: Email will be used as username (not as alias)") + else: + print(f"āœ… Using existing User Pool: {user_pool_id}") + print(f" āš ļø Warning: If this pool was created with UsernameAttributes=['email'],") + print(f" users will have UUID usernames. Delete the pool and recreate, or") + print(f" run cleanup_test_users.py to delete old users.") + + # Create Resource Server with scopes (if not exists) + # Note: Scope names cannot contain '/' - using '.' instead + try: + resource_server = self.cognito.create_resource_server( + UserPoolId=user_pool_id, + Identifier='lakehouse-api', + Name='Lakehouse Data API', + Scopes=[ + {'ScopeName': 'claims.query', 'ScopeDescription': 'Query claims'}, + {'ScopeName': 'claims.submit', 'ScopeDescription': 'Submit claims'}, + {'ScopeName': 'claims.update', 'ScopeDescription': 'Update claims'}, + {'ScopeName': 'claims.approve', 'ScopeDescription': 'Approve/deny claims'} + ] + ) + print("āœ… Resource Server created with scopes") + except self.cognito.exceptions.ResourceNotFoundException: + print("ā„¹ļø Resource Server already exists") + except Exception as e: + if 'already exists' in str(e).lower(): + print("ā„¹ļø Resource Server already exists") + else: + raise + + # Check for existing App Client + existing_client = self.get_user_pool_client(user_pool_id, 'lakehouse-client') + + if existing_client: + client_id = existing_client['ClientId'] + client_secret = existing_client.get('ClientSecret') + print(f"ā„¹ļø App Client exists: {client_id}") + print(f" Updating to support both client_credentials and user authentication...") + + # Update existing client to support both flows + self.cognito.update_user_pool_client( + UserPoolId=user_pool_id, + ClientId=client_id, + ClientName='lakehouse-client', + ExplicitAuthFlows=[ + 'ALLOW_USER_SRP_AUTH', # Secure Remote Password (SRP) auth + 'ALLOW_ADMIN_USER_PASSWORD_AUTH', # Admin user password auth (for testing) + 'ALLOW_REFRESH_TOKEN_AUTH' # Refresh token auth + ], + AllowedOAuthFlows=['client_credentials'], # Machine-to-machine authentication + AllowedOAuthScopes=[ + 'lakehouse-api/claims.query', + 'lakehouse-api/claims.submit', + 'lakehouse-api/claims.update', + 'lakehouse-api/claims.approve' + ], + AllowedOAuthFlowsUserPoolClient=True, + PreventUserExistenceErrors='ENABLED' # Security best practice + ) + print(f"āœ… App Client updated to support user authentication and client_credentials") + else: + # Create App Client supporting both user auth and client credentials + client_response = self.cognito.create_user_pool_client( + UserPoolId=user_pool_id, + ClientName='lakehouse-client', + GenerateSecret=True, + ExplicitAuthFlows=[ + 'ALLOW_USER_SRP_AUTH', # Secure Remote Password (SRP) auth + 'ALLOW_ADMIN_USER_PASSWORD_AUTH', # Admin user password auth (for testing) + 'ALLOW_REFRESH_TOKEN_AUTH' # Refresh token auth + ], + AllowedOAuthFlows=['client_credentials'], # Machine-to-machine authentication + AllowedOAuthScopes=[ + 'lakehouse-api/claims.query', + 'lakehouse-api/claims.submit', + 'lakehouse-api/claims.update', + 'lakehouse-api/claims.approve' + ], + AllowedOAuthFlowsUserPoolClient=True, + PreventUserExistenceErrors='ENABLED' # Security best practice + ) + client_id = client_response['UserPoolClient']['ClientId'] + client_secret = client_response['UserPoolClient'].get('ClientSecret') + print(f"āœ… App Client created: {client_id}") + + # Check for existing domain or create new one + domain_url = self.get_user_pool_domain(user_pool_id) + + if not domain_url: + # Create domain + # Domain names can only contain lowercase letters, numbers, and hyphens + # Extract only alphanumeric characters from pool ID and convert to lowercase + pool_id_clean = re.sub(r'[^a-zA-Z0-9]', '', user_pool_id).lower()[:8] + domain_name = f'lakehouse-{pool_id_clean}' + + try: + self.cognito.create_user_pool_domain(Domain=domain_name, UserPoolId=user_pool_id) + domain_url = f'https://{domain_name}.auth.{self.region}.amazoncognito.com' + print(f"āœ… Domain created: {domain_url}") + except Exception as e: + if 'already exists' in str(e).lower() or 'domain' in str(e).lower(): + domain_url = f'https://{domain_name}.auth.{self.region}.amazoncognito.com' + print(f"ā„¹ļø Domain already exists: {domain_url}") + else: + raise + else: + print(f"āœ… Using existing domain: {domain_url}") + + # Create test users with email as username (skip if already exist) + test_users = [ + {'email': 'user001@example.com', 'name': 'User 001'}, + {'email': 'user002@example.com', 'name': 'User 002'}, + {'email': 'adjuster001@example.com', 'name': 'Adjuster 001'} + ] + + for user in test_users: + email = user['email'] + try: + # Create user with email as username + self.cognito.admin_create_user( + UserPoolId=user_pool_id, + Username=email, # Username is the email address + UserAttributes=[ + {'Name': 'email', 'Value': email}, + {'Name': 'email_verified', 'Value': 'true'} + ], + TemporaryPassword='TempPass123!', + MessageAction='SUPPRESS' # Don't send welcome email + ) + print(f"āœ… Test user created: {email} (username: {email})") + except self.cognito.exceptions.UsernameExistsException: + print(f"ā„¹ļø Test user already exists: {email}") + except Exception as e: + if 'already exists' in str(e).lower(): + print(f"ā„¹ļø Test user already exists: {email}") + else: + print(f"āš ļø Error creating user {email}: {e}") + + result = { + 'user_pool_id': user_pool_id, + 'client_id': client_id, + 'domain': domain_url + } + + if 'client_secret' in locals() and client_secret: + result['client_secret'] = client_secret + + # Create M2M-only app client + m2m_client = self.create_m2m_client(user_pool_id) + result['m2m_client_id'] = m2m_client['client_id'] + result['m2m_client_secret'] = m2m_client['client_secret'] + + # Store configuration in SSM Parameter Store + self.store_parameters_in_ssm(result) + + # Write to .env file (deprecated, for backward compatibility) + self.write_to_env(result) + + return result + + def create_m2m_client(self, user_pool_id: str) -> Dict: + """ + Create M2M-only app client with client_credentials OAuth flow. + + Args: + user_pool_id: Cognito User Pool ID + + Returns: + Dictionary with client_id and client_secret + """ + print(f"\nšŸ¤– Creating M2M-only app client...") + + # Check for existing M2M client + existing_m2m_client = self.get_user_pool_client(user_pool_id, 'lakehouse-m2m-client') + + # M2M client configuration (client_credentials flow only) + client_config = { + 'UserPoolId': user_pool_id, + 'ClientName': 'lakehouse-m2m-client', + 'GenerateSecret': True, + 'ExplicitAuthFlows': [], # No user auth flows for M2M + 'AllowedOAuthFlows': ['client_credentials'], # Only client_credentials + 'AllowedOAuthScopes': [ + 'lakehouse-api/claims.query', + 'lakehouse-api/claims.submit', + 'lakehouse-api/claims.update', + 'lakehouse-api/claims.approve' + ], + 'AllowedOAuthFlowsUserPoolClient': True, + 'SupportedIdentityProviders': [], # No identity providers for M2M + 'CallbackURLs': ['https://localhost'], # Dummy URL for M2M + 'PreventUserExistenceErrors': 'ENABLED' + } + + if existing_m2m_client: + client_id = existing_m2m_client['ClientId'] + print(f"ā„¹ļø M2M App Client exists: {client_id}") + print(f" Updating configuration...") + + # Update with M2M configuration + # Remove GenerateSecret as it's not valid for update_user_pool_client + update_config = {k: v for k, v in client_config.items() if k != 'GenerateSecret'} + update_config['ClientId'] = client_id + self.cognito.update_user_pool_client(**update_config) + + # Get updated client to retrieve secret + updated_client = self.cognito.describe_user_pool_client( + UserPoolId=user_pool_id, + ClientId=client_id + ) + client_secret = updated_client['UserPoolClient'].get('ClientSecret') + print(f"āœ… M2M App Client updated with client_credentials flow") + else: + # Create with M2M configuration + client_response = self.cognito.create_user_pool_client(**client_config) + client_id = client_response['UserPoolClient']['ClientId'] + client_secret = client_response['UserPoolClient'].get('ClientSecret') + print(f"āœ… M2M App Client created: {client_id}") + print(f" Configuration: client_credentials flow only") + + return { + 'client_id': client_id, + 'client_secret': client_secret + } + +if __name__ == '__main__': + setup = CognitoSetup() + result = setup.setup() + + print(f"\nšŸ“ Configuration:\n{json.dumps({k: v for k, v in result.items() if 'secret' not in k}, indent=2)}") + if 'client_secret' in result: + print(f"\nšŸ” User App Client Secret: {result['client_secret']}") + print(f" (Also stored securely in SSM Parameter Store)") + if 'm2m_client_secret' in result: + print(f"\nšŸ¤– M2M App Client Secret: {result['m2m_client_secret']}") + print(f" (Also stored securely in SSM Parameter Store)") + + print(f"\nšŸ’¾ SSM Parameters Stored:") + print(f" • /app/lakehouse-agent/cognito-user-pool-id") + print(f" • /app/lakehouse-agent/cognito-user-pool-arn") + print(f" • /app/lakehouse-agent/cognito-app-client-id (user auth + M2M)") + print(f" • /app/lakehouse-agent/cognito-app-client-secret (SecureString)") + print(f" • /app/lakehouse-agent/cognito-m2m-client-id (M2M only)") + print(f" • /app/lakehouse-agent/cognito-m2m-client-secret (SecureString)") + print(f" • /app/lakehouse-agent/cognito-domain") + print(f" • /app/lakehouse-agent/cognito-resource-server-id") + print(f" • /app/lakehouse-agent/cognito-region") + + print(f"\nšŸ‘„ Test Users Created:") + print(f" • user001@example.com (username: user001@example.com)") + print(f" • user002@example.com (username: user002@example.com)") + print(f" • adjuster001@example.com (username: adjuster001@example.com)") + print(f" Default password: TempPass123!") + print(f" Note: Users will be prompted to change password on first login") + + print(f"\nšŸ”‘ App Clients:") + print(f" 1. lakehouse-client (ID: {result['client_id']})") + print(f" - Supports: User authentication (SRP, Admin Password) + M2M") + print(f" - Use for: Streamlit UI, user-facing applications") + print(f" 2. lakehouse-m2m-client (ID: {result['m2m_client_id']})") + print(f" - Supports: M2M only (client_credentials)") + print(f" - Use for: Gateway-to-Runtime, service-to-service, test scripts") + + print(f"\nāš ļø If you see UUID usernames instead of emails:") + print(f" 1. Run: python cleanup_test_users.py") + print(f" 2. Delete the User Pool from AWS Console") + print(f" 3. Run this script again to recreate with correct settings") diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/check_users.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/check_users.py new file mode 100755 index 00000000..4fe788f9 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/check_users.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +""" +Check Cognito Users + +Quick script to check user status and usernames. + +Usage: + python check_users.py +""" +import boto3 +import sys + +def check_users(): + """Check Cognito users.""" + # Get region and SSM client + session = boto3.Session() + region = session.region_name + + ssm = boto3.client('ssm', region_name=region) + cognito = boto3.client('cognito-idp', region_name=region) + + print("=" * 70) + print("Cognito Users Check") + print("=" * 70) + + # Get User Pool ID from SSM + try: + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + print(f"\nāœ… User Pool ID: {user_pool_id}") + except Exception as e: + print(f"āŒ Error loading User Pool ID from SSM: {e}") + sys.exit(1) + + # Check User Pool configuration + print(f"\nšŸ“‹ User Pool Configuration:") + try: + pool_response = cognito.describe_user_pool(UserPoolId=user_pool_id) + pool = pool_response['UserPool'] + + username_attrs = pool.get('UsernameAttributes', []) + alias_attrs = pool.get('AliasAttributes', []) + + print(f" Username Attributes: {username_attrs if username_attrs else 'None (email can be username)'}") + print(f" Alias Attributes: {alias_attrs if alias_attrs else 'None'}") + + if username_attrs and 'email' in username_attrs: + print(f"\n āš ļø WARNING: UsernameAttributes includes 'email'") + print(f" This means users have UUID usernames, not email addresses!") + print(f" You need to delete the User Pool and recreate it without UsernameAttributes") + except Exception as e: + print(f"āŒ Error describing User Pool: {e}") + + # List users + print(f"\nšŸ‘„ Users in User Pool:") + try: + response = cognito.list_users(UserPoolId=user_pool_id, Limit=20) + users = response.get('Users', []) + + if not users: + print(f" No users found") + print(f"\n Run setup_cognito.py to create test users") + else: + for i, user in enumerate(users, 1): + username = user['Username'] + status = user['UserStatus'] + enabled = user.get('Enabled', True) + + email = None + email_verified = None + for attr in user.get('Attributes', []): + if attr['Name'] == 'email': + email = attr['Value'] + elif attr['Name'] == 'email_verified': + email_verified = attr['Value'] + + print(f"\n User {i}:") + print(f" ā”œā”€ Username: {username}") + print(f" ā”œā”€ Email: {email}") + print(f" ā”œā”€ Status: {status}") + print(f" ā”œā”€ Enabled: {enabled}") + print(f" └─ Email Verified: {email_verified}") + + # Check if username is UUID (indicates UsernameAttributes was set) + if len(username) == 36 and username.count('-') == 4: + print(f" āš ļø Username is UUID - User Pool has UsernameAttributes=['email']") + print(f" āš ļø Login with email won't work!") + + if status == 'FORCE_CHANGE_PASSWORD': + print(f" āš ļø User must change temporary password on first login") + + except Exception as e: + print(f"āŒ Error listing users: {e}") + + print("\n" + "=" * 70) + print("Recommendations:") + print("=" * 70) + + # Check if any user has UUID username + try: + response = cognito.list_users(UserPoolId=user_pool_id, Limit=1) + if response.get('Users'): + username = response['Users'][0]['Username'] + if len(username) == 36 and username.count('-') == 4: + print("\nāŒ ISSUE FOUND: Users have UUID usernames") + print("\n Solution:") + print(" 1. Run: python cleanup_test_users.py") + print(" 2. Delete the User Pool from AWS Console") + print(" 3. Run: python setup_cognito.py") + print("\n This will create a new User Pool where email IS the username") + else: + print("\nāœ… Users have email as username - configuration is correct") + print("\n If login still fails:") + print(" 1. Run: python test_cognito_login.py") + print(" 2. Try the default password: TempPass123!") + print(" 3. You may need to change password on first login") + except: + pass + + print() + +if __name__ == '__main__': + check_users() diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/cleanup_test_users.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/cleanup_test_users.py new file mode 100755 index 00000000..52a80104 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/cleanup_test_users.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +""" +Cleanup Test Users in Cognito User Pool + +This script deletes existing test users so they can be recreated with proper usernames. + +Usage: + python cleanup_test_users.py +""" +import boto3 +import sys + +def cleanup_users(): + """Delete test users from Cognito User Pool.""" + # Get region and SSM client + session = boto3.Session() + region = session.region_name + + ssm = boto3.client('ssm', region_name=region) + cognito = boto3.client('cognito-idp', region_name=region) + + # Get User Pool ID from SSM + try: + response = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id') + user_pool_id = response['Parameter']['Value'] + print(f"āœ… Found User Pool ID: {user_pool_id}") + except Exception as e: + print(f"āŒ Error: Could not find User Pool ID in SSM: {e}") + print(" Please run setup_cognito.py first") + sys.exit(1) + + # Test user emails to clean up + test_emails = [ + 'user001@example.com', + 'user002@example.com', + 'adjuster001@example.com' + ] + + print(f"\nšŸ” Searching for test users in User Pool...") + + # List all users and find test users + deleted_count = 0 + try: + paginator = cognito.get_paginator('list_users') + for page in paginator.paginate(UserPoolId=user_pool_id): + for user in page.get('Users', []): + username = user['Username'] + + # Check if user has one of the test emails + user_email = None + for attr in user.get('Attributes', []): + if attr['Name'] == 'email': + user_email = attr['Value'] + break + + if user_email in test_emails: + print(f" Found test user: {user_email} (username: {username})") + + # Delete the user + try: + cognito.admin_delete_user( + UserPoolId=user_pool_id, + Username=username + ) + print(f" āœ… Deleted user: {username}") + deleted_count += 1 + except Exception as e: + print(f" āŒ Error deleting user {username}: {e}") + + if deleted_count == 0: + print(" ā„¹ļø No test users found to delete") + else: + print(f"\nāœ… Deleted {deleted_count} test user(s)") + print(f"\nšŸ“ Next step: Run setup_cognito.py to recreate users with proper usernames") + print(f" cd gateway-setup") + print(f" python setup_cognito.py") + + except Exception as e: + print(f"āŒ Error listing users: {e}") + sys.exit(1) + +if __name__ == '__main__': + print("=" * 70) + print("Cognito Test Users Cleanup") + print("=" * 70) + + response = input("\nāš ļø This will delete test users. Continue? (yes/no): ") + if response.lower() not in ['yes', 'y']: + print("Cleanup cancelled") + sys.exit(0) + + cleanup_users() diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/create_gateway.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/create_gateway.py new file mode 100644 index 00000000..bded8294 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/create_gateway.py @@ -0,0 +1,752 @@ +#!/usr/bin/env python3 +""" +Create AgentCore Gateway for Health Lakehouse Data + +This script creates and configures an AgentCore Gateway that: +1. Connects to the MCP Athena server (running on AgentCore Runtime) +2. Uses the Gateway interceptor for JWT validation +3. Enforces fine-grained access control +4. Propagates user identity to the MCP server + +Prerequisites: +- MCP server deployed to AgentCore Runtime +- Interceptor Lambda function deployed +- Cognito User Pool configured +- Configuration in SSM Parameter Store + +Usage: + python create_gateway.py +""" + +import boto3 +import sys +import json +from typing import Dict, Any + + +class SSMConfig: + """Load configuration from SSM Parameter Store.""" + + def __init__(self): + """Initialize and load configuration from SSM.""" + # Get region from boto3 session + session = boto3.Session() + self.region = session.region_name + + self.ssm = boto3.client('ssm', region_name=self.region) + self.sts = boto3.client('sts', region_name=self.region) + + # Get account ID + self.account_id = self.sts.get_caller_identity()['Account'] + + print(f"āœ… Using AWS configuration") + print(f" Region: {self.region}") + print(f" Account: {self.account_id}") + + # Load configuration from SSM + print(f"\nšŸ” Loading configuration from SSM Parameter Store...") + self.mcp_server_runtime_arn = self._get_parameter('/app/lakehouse-agent/mcp-server-runtime-arn') + self.interceptor_lambda_arn = self._get_parameter('/app/lakehouse-agent/interceptor-lambda-arn') + self.cognito_user_pool_arn = self._get_parameter('/app/lakehouse-agent/cognito-user-pool-arn') + self.cognito_app_client_id = self._get_parameter('/app/lakehouse-agent/cognito-app-client-id') + self.cognito_app_client_secret = self._get_parameter('/app/lakehouse-agent/cognito-app-client-secret', secure=True) + self.cognito_domain = self._get_parameter('/app/lakehouse-agent/cognito-domain') + + # Load M2M client credentials for Gateway-to-Runtime authentication + try: + self.cognito_m2m_client_id = self._get_parameter('/app/lakehouse-agent/cognito-m2m-client-id') + self.cognito_m2m_client_secret = self._get_parameter('/app/lakehouse-agent/cognito-m2m-client-secret', secure=True) + print(f" āœ… M2M Client ID: {self.cognito_m2m_client_id}") + print(f" āœ… M2M Client Secret: ****** (loaded)") + self.has_m2m_client = True + except: + print(f" āš ļø M2M client not found, will use hybrid client for Gateway-to-Runtime auth") + self.cognito_m2m_client_id = self.cognito_app_client_id + self.cognito_m2m_client_secret = self.cognito_app_client_secret + self.has_m2m_client = False + + print(f" āœ… MCP Server Runtime ARN: {self.mcp_server_runtime_arn}") + print(f" āœ… Interceptor Lambda ARN: {self.interceptor_lambda_arn}") + print(f" āœ… Cognito User Pool ARN: {self.cognito_user_pool_arn}") + print(f" āœ… Cognito App Client ID: {self.cognito_app_client_id}") + print(f" āœ… Cognito Client Secret: ****** (loaded)") + print(f" āœ… Cognito Domain: {self.cognito_domain}") + + def _get_parameter(self, parameter_name: str, secure: bool = False) -> str: + """Get parameter value from SSM Parameter Store.""" + try: + response = self.ssm.get_parameter(Name=parameter_name, WithDecryption=secure) + return response['Parameter']['Value'] + except self.ssm.exceptions.ParameterNotFound: + print(f"āŒ SSM parameter {parameter_name} not found") + print(f" Please run the setup scripts first") + sys.exit(1) + except Exception as e: + print(f"āŒ Error retrieving parameter {parameter_name}: {e}") + sys.exit(1) + + def store_gateway_parameters(self, gateway_id: str, gateway_arn: str, gateway_url: str, gateway_name: str): + """Store Gateway information in SSM Parameter Store.""" + print("\nšŸ’¾ Storing gateway configuration in SSM Parameter Store...") + + parameters = [ + { + 'name': '/app/lakehouse-agent/gateway-id', + 'value': gateway_id, + 'description': 'AgentCore Gateway ID' + }, + { + 'name': '/app/lakehouse-agent/gateway-arn', + 'value': gateway_arn, + 'description': 'AgentCore Gateway ARN' + }, + { + 'name': '/app/lakehouse-agent/gateway-url', + 'value': gateway_url, + 'description': 'AgentCore Gateway URL' + }, + { + 'name': '/app/lakehouse-agent/gateway-name', + 'value': gateway_name, + 'description': 'AgentCore Gateway Name' + } + ] + + for param in parameters: + try: + self.ssm.put_parameter( + Name=param['name'], + Value=param['value'], + Description=param['description'], + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: {param['name']} = {param['value']}") + except Exception as e: + print(f"āŒ Error storing parameter {param['name']}: {e}") + raise + + +class GatewaySetup: + def __init__(self, config: SSMConfig): + """ + Initialize Gateway setup. + + Args: + config: SSM configuration object + """ + self.config = config + self.client = boto3.client('bedrock-agentcore-control', region_name=config.region) + + def create_gateway_role(self, gateway_name: str) -> str: + """ + Create IAM role for Gateway. + + Args: + gateway_name: Name for the gateway + + Returns: + Role ARN + """ + iam = boto3.client('iam', region_name=self.config.region) + + role_name = f'agentcore-{gateway_name}-role' + + # Trust policy for AgentCore Gateway + trust_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "bedrock-agentcore.amazonaws.com" + }, + "Action": "sts:AssumeRole" + } + ] + } + + # Policy document with all required permissions + policy_document = { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "InvokeRuntimeTarget", + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:InvokeAgentRuntime", + "bedrock-agentcore:InvokeAgentRuntimeForUser", + "bedrock-agentcore:InvokeGateway" + ], + "Resource": "*" + }, + { + "Sid": "InvokeLambda", + "Effect": "Allow", + "Action": [ + "lambda:InvokeFunction" + ], + "Resource": f"arn:aws:lambda:{self.config.region}:{self.config.account_id}:function:*" + }, + { + "Sid": "WorkloadIdentity", + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:GetWorkloadAccessToken", + "bedrock-agentcore:GetWorkloadAccessTokenForJWT", + "bedrock-agentcore:GetWorkloadAccessTokenForUserId", + "bedrock-agentcore:CreateWorkloadIdentity" + ], + "Resource": [ + f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:workload-identity-directory/default", + f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:workload-identity-directory/default/workload-identity/*" + ] + }, + { + "Sid": "OAuth2Credentials", + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:GetResourceOauth2Token" + ], + "Resource": [ + f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:token-vault/default", + f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:token-vault/*/oauth2credentialprovider/*", + f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:workload-identity-directory/default", + f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:workload-identity-directory/default/workload-identity/*" + ] + }, + { + "Sid": "SecretsManagerAccess", + "Effect": "Allow", + "Action": [ + "secretsmanager:GetSecretValue" + ], + "Resource": f"arn:aws:secretsmanager:{self.config.region}:{self.config.account_id}:secret:*" + } + ] + } + + try: + print(f"šŸ”‘ Creating IAM role: {role_name}") + response = iam.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + Description='IAM role for AgentCore Gateway' + ) + role_arn = response['Role']['Arn'] + print(f"āœ… Created IAM role: {role_arn}") + + # Attach policy + iam.put_role_policy( + RoleName=role_name, + PolicyName='GatewayExecutionPolicy', + PolicyDocument=json.dumps(policy_document) + ) + print(f"āœ… Attached execution policy to role") + + return role_arn + + except iam.exceptions.EntityAlreadyExistsException: + print(f"ā„¹ļø Role {role_name} already exists, deleting and recreating...") + + # Delete inline policies + try: + policy_names = iam.list_role_policies(RoleName=role_name)['PolicyNames'] + for policy_name in policy_names: + print(f" Deleting inline policy: {policy_name}") + iam.delete_role_policy(RoleName=role_name, PolicyName=policy_name) + except Exception as e: + print(f" āš ļø Error deleting inline policies: {e}") + + # Detach managed policies + try: + attached_policies = iam.list_attached_role_policies(RoleName=role_name)['AttachedPolicies'] + for policy in attached_policies: + print(f" Detaching managed policy: {policy['PolicyArn']}") + iam.detach_role_policy(RoleName=role_name, PolicyArn=policy['PolicyArn']) + except Exception as e: + print(f" āš ļø Error detaching managed policies: {e}") + + # Remove from instance profiles + try: + instance_profiles = iam.list_instance_profiles_for_role(RoleName=role_name)['InstanceProfiles'] + for profile in instance_profiles: + print(f" Removing from instance profile: {profile['InstanceProfileName']}") + iam.remove_role_from_instance_profile( + InstanceProfileName=profile['InstanceProfileName'], + RoleName=role_name + ) + except Exception as e: + print(f" āš ļø Error removing from instance profiles: {e}") + + # Delete the role + try: + iam.delete_role(RoleName=role_name) + print(f" āœ… Deleted existing role") + except Exception as e: + print(f" āŒ Error deleting role: {e}") + raise + + # Wait for IAM propagation + import time + time.sleep(2) + + # Recreate the role + print(f" Creating new role: {role_name}") + response = iam.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + Description='IAM role for AgentCore Gateway' + ) + role_arn = response['Role']['Arn'] + + # Attach policy + iam.put_role_policy( + RoleName=role_name, + PolicyName='GatewayExecutionPolicy', + PolicyDocument=json.dumps(policy_document) + ) + + print(f"āœ… Recreated IAM role: {role_arn}") + return role_arn + + except Exception as e: + print(f"āŒ Error creating role: {e}") + raise + + def create_gateway(self, gateway_name: str = 'lakehouse-gateway') -> Dict[str, Any]: + """ + Create an AgentCore Gateway with JWT authentication. + + Args: + gateway_name: Name for the gateway + + Returns: + Gateway creation response + """ + try: + print(f"\nšŸ”§ Creating AgentCore Gateway: {gateway_name}") + + # Create IAM role for gateway + role_arn = self.create_gateway_role(gateway_name) + + # Extract user pool ID from ARN + user_pool_id = self.config.cognito_user_pool_arn.split('/')[-1] + issuer = f'https://cognito-idp.{self.config.region}.amazonaws.com/{user_pool_id}' + + # JWT authorizer configuration + # Cognito OIDC discovery URL + discovery_url = f'{issuer}/.well-known/openid-configuration' + + auth_config = { + "customJWTAuthorizer": { + "discoveryUrl": discovery_url, + "allowedClients": [self.config.cognito_app_client_id] + # Note: Not using allowedAudience because Cognito access tokens + # don't include 'aud' claim. We validate via client_id instead. + } + } + + # Interceptor configuration for request processing + interceptor_config = [ + { + "interceptor": { + "lambda": { + "arn": self.config.interceptor_lambda_arn + } + }, + "interceptionPoints": ["REQUEST"], + "inputConfiguration": { + "passRequestHeaders": True + } + } + ] + + # Create gateway + response = self.client.create_gateway( + name=gateway_name, + roleArn=role_arn, + protocolType='MCP', + protocolConfiguration={ + 'mcp': { + 'supportedVersions': ['2025-03-26', '2025-06-18'], + 'searchType': 'SEMANTIC' + } + }, + authorizerType='CUSTOM_JWT', + authorizerConfiguration=auth_config, + interceptorConfigurations=interceptor_config, + description='Gateway for Lakehouse Data MCP Server with OAuth-based access control' + ) + + gateway_id = response['gatewayId'] + gateway_url = response['gatewayUrl'] + gateway_arn = f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:gateway/{gateway_id}" + + print(f"āœ… Gateway created successfully!") + print(f" Gateway ID: {gateway_id}") + print(f" Gateway URL: {gateway_url}") + print(f" Gateway ARN: {gateway_arn}") + + return { + 'gatewayId': gateway_id, + 'gatewayUrl': gateway_url, + 'gatewayArn': gateway_arn, + 'gatewayName': gateway_name + } + + except Exception as e: + if "already exists" in str(e): + print(f"ā„¹ļø Gateway {gateway_name} already exists, retrieving details...") + response = self.client.list_gateways() + for gateway in response.get('items', []): + if gateway['name'] == gateway_name: + gateway_id = gateway['gatewayId'] + response = self.client.get_gateway(gatewayIdentifier=gateway_id) + gateway_url = response['gatewayUrl'] + gateway_arn = f"arn:aws:bedrock-agentcore:{self.config.region}:{self.config.account_id}:gateway/{gateway_id}" + print(f"āœ… Using existing gateway: {gateway_id}") + return { + 'gatewayId': gateway_id, + 'gatewayUrl': gateway_url, + 'gatewayArn': gateway_arn, + 'gatewayName': gateway_name + } + print(f"āŒ Error creating gateway: {str(e)}") + raise + + def create_oauth_provider( + self, + provider_name: str, + cognito_client_id: str, + cognito_client_secret: str, + cognito_token_endpoint: str, + cognito_issuer: str + ) -> str: + """ + Create an OAuth2 credential provider in AgentCore Identity for Cognito. + + This provider is used by the Gateway to authenticate to the MCP server on Runtime. + The Gateway uses client_credentials flow (M2M) to obtain tokens from Cognito, + then includes those tokens when invoking the MCP server. + + Authentication Flow: + 1. User → Gateway: User's JWT token (from Cognito user authentication) + 2. Gateway validates user's token with JWT authorizer + 3. Gateway → Cognito: Request M2M token using client_credentials + 4. Cognito → Gateway: M2M access token + 5. Gateway → MCP Runtime: MCP request with M2M token in Authorization header + 6. MCP Runtime validates M2M token with its JWT authorizer + 7. MCP Runtime → Gateway: MCP response + + Args: + provider_name: Name for the OAuth provider + cognito_client_id: Cognito App Client ID (M2M client preferred) + cognito_client_secret: Cognito App Client Secret + cognito_token_endpoint: Cognito token endpoint URL + cognito_issuer: Cognito issuer URL + + Returns: + OAuth provider ARN + """ + try: + print(f"\nšŸ” Creating OAuth2 credential provider: {provider_name}") + + # For Cognito, we use CustomOauth2 vendor with authorization server metadata + # Cognito doesn't have a .well-known/openid-configuration endpoint for token endpoint + # so we provide the metadata directly + response = self.client.create_oauth2_credential_provider( + name=provider_name, + credentialProviderVendor='CustomOauth2', + oauth2ProviderConfigInput={ + 'customOauth2ProviderConfig': { + 'oauthDiscovery': { + 'authorizationServerMetadata': { + 'issuer': cognito_issuer, + 'authorizationEndpoint': f"{cognito_issuer}/oauth2/authorize", + 'tokenEndpoint': cognito_token_endpoint, + 'tokenEndpointAuthMethods': ['client_secret_post'] + } + }, + 'clientId': cognito_client_id, + 'clientSecret': cognito_client_secret + } + } + ) + + # Debug: print response to see actual structure + print(f" Debug - Response keys: {list(response.keys())}") + + # Try different possible key names + if 'oauth2CredentialProviderArn' in response: + provider_arn = response['oauth2CredentialProviderArn'] + elif 'arn' in response: + provider_arn = response['arn'] + elif 'credentialProviderArn' in response: + provider_arn = response['credentialProviderArn'] + else: + print(f" Debug - Full response: {response}") + raise KeyError(f"Could not find ARN in response. Available keys: {list(response.keys())}") + + print(f"āœ… OAuth2 provider created: {provider_arn}") + return provider_arn + + except Exception as e: + if "already exists" in str(e).lower() or "AlreadyExistsException" in str(e): + print(f"ā„¹ļø OAuth2 provider {provider_name} already exists, retrieving ARN...") + try: + # List providers and find the one with matching name + response = self.client.list_oauth2_credential_providers() + print(f" Debug - List response keys: {list(response.keys())}") + + # Try different possible key names for the list + providers = response.get('oauth2CredentialProviders', + response.get('credentialProviders', + response.get('items', []))) + + for provider in providers: + if provider.get('name') == provider_name: + # Try different possible ARN key names + provider_arn = (provider.get('oauth2CredentialProviderArn') or + provider.get('arn') or + provider.get('credentialProviderArn')) + if provider_arn: + print(f"āœ… Using existing provider: {provider_arn}") + return provider_arn + + print(f" āš ļø Provider {provider_name} not found in list") + except Exception as list_error: + print(f"āŒ Error listing providers: {list_error}") + + print(f"āŒ Error creating OAuth2 provider: {e}") + raise + + def create_gateway_target( + self, + gateway_id: str, + target_name: str, + mcp_server_url: str, + oauth_provider_arn: str + ) -> Dict[str, Any]: + """ + Create a gateway target pointing to the MCP server runtime with OAuth authentication. + + Args: + gateway_id: Gateway ID + target_name: Name for the target + mcp_server_url: URL of the MCP server runtime + oauth_provider_arn: ARN of the OAuth credential provider + + Returns: + Target creation response + """ + try: + print(f"\nšŸŽÆ Creating gateway target: {target_name}") + print(f" MCP Server URL: {mcp_server_url}") + print(f" Authentication: OAuth2 Client Credentials") + print(f" Provider ARN: {oauth_provider_arn}") + + response = self.client.create_gateway_target( + name=target_name, + gatewayIdentifier=gateway_id, + targetConfiguration={ + 'mcp': { + 'mcpServer': { + 'endpoint': mcp_server_url + } + } + }, + credentialProviderConfigurations=[ + { + 'credentialProviderType': 'OAUTH', + 'credentialProvider': { + 'oauthCredentialProvider': { + 'providerArn': oauth_provider_arn, + 'scopes': [] # Empty scopes for Client Credentials flow + } + } + } + ] + ) + + print(f"āœ… Gateway target created successfully with OAuth2 authentication!") + return response + + except Exception as e: + if "already exists" in str(e): + print(f"ā„¹ļø Target {target_name} already exists") + return {} + print(f"āŒ Error creating gateway target: {str(e)}") + raise + + def wait_for_gateway_active(self, gateway_id: str, max_wait_seconds: int = 300) -> bool: + """ + Wait for gateway to be in ACTIVE or READY status. + + Args: + gateway_id: Gateway ID + max_wait_seconds: Maximum time to wait in seconds + + Returns: + True if gateway is active/ready, False if timeout + """ + import time + + print(f"\nā³ Checking gateway status...") + start_time = time.time() + + while time.time() - start_time < max_wait_seconds: + try: + response = self.client.get_gateway(gatewayIdentifier=gateway_id) + status = response.get('status', 'UNKNOWN').strip().upper() + + print(f" Status: {status}") + + if status in ['ACTIVE', 'READY']: + print(f"āœ… Gateway is ready (status: {status})!") + return True + elif status in ['FAILED', 'DELETING', 'DELETED']: + print(f"āŒ Gateway is in {status} status") + return False + + print(f" Waiting for gateway to be ready...") + time.sleep(10) + + except Exception as e: + print(f"āš ļø Error checking gateway status: {e}") + time.sleep(10) + + print(f"āš ļø Timeout waiting for gateway to be active") + return False + + +def get_runtime_mcp_url(runtime_arn: str, region: str) -> str: + """ + Get the MCP endpoint URL for an AgentCore Runtime. + + For MCP servers deployed on AgentCore Runtime, the endpoint is: + https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{encoded-arn}/invocations?qualifier=DEFAULT + + Args: + runtime_arn: Runtime ARN + region: AWS region + + Returns: + MCP endpoint URL + """ + try: + # Encode the runtime ARN (replace : with %3A and / with %2F) + encoded_arn = runtime_arn.replace(':', '%3A').replace('/', '%2F') + + # Construct the MCP endpoint URL + mcp_url = f"https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{encoded_arn}/invocations?qualifier=DEFAULT" + + print(f"āœ… MCP Endpoint URL: {mcp_url}") + return mcp_url + + except Exception as e: + print(f"āŒ Error constructing MCP URL: {e}") + return '' + + +def main(): + """Main gateway creation function.""" + print("=" * 70) + print("AgentCore Gateway Setup") + print("=" * 70) + + # Load configuration from SSM + config = SSMConfig() + + # Create gateway setup instance + setup = GatewaySetup(config) + + # Gateway name + gateway_name = 'lakehouse-gateway' + + print(f"\nšŸ“‹ Configuration:") + print(f" Gateway Name: {gateway_name}") + print(f" MCP Server: {config.mcp_server_runtime_arn}") + print(f" Interceptor: {config.interceptor_lambda_arn}") + print(f" Cognito User Pool: {config.cognito_user_pool_arn}") + print(f" Client ID: {config.cognito_app_client_id}") + + try: + # Create gateway + gateway_response = setup.create_gateway(gateway_name=gateway_name) + + # Wait for gateway to be active before creating target + if setup.wait_for_gateway_active(gateway_response['gatewayId']): + # Get MCP endpoint URL for the runtime + mcp_url = get_runtime_mcp_url(config.mcp_server_runtime_arn, config.region) + + # Build Cognito endpoints + user_pool_id = config.cognito_user_pool_arn.split('/')[-1] + cognito_issuer = f"https://cognito-idp.{config.region}.amazonaws.com/{user_pool_id}" + cognito_token_endpoint = f"{config.cognito_domain}/oauth2/token" + + # Determine which client to use for Gateway-to-Runtime authentication + if config.has_m2m_client: + print(f"\nšŸ” Using M2M client for Gateway-to-Runtime authentication") + auth_client_id = config.cognito_m2m_client_id + auth_client_secret = config.cognito_m2m_client_secret + provider_name = 'lakehouse-mcp-m2m-oauth-provider' + else: + print(f"\nšŸ” Using hybrid client for Gateway-to-Runtime authentication") + auth_client_id = config.cognito_app_client_id + auth_client_secret = config.cognito_app_client_secret + provider_name = 'lakehouse-mcp-oauth-provider' + + # Create OAuth credential provider + oauth_provider_arn = setup.create_oauth_provider( + provider_name=provider_name, + cognito_client_id=auth_client_id, + cognito_client_secret=auth_client_secret, + cognito_token_endpoint=cognito_token_endpoint, + cognito_issuer=cognito_issuer + ) + + # Create gateway target with OAuth authentication + if mcp_url and oauth_provider_arn: + setup.create_gateway_target( + gateway_id=gateway_response['gatewayId'], + target_name='lakehouse-mcp-target', + mcp_server_url=mcp_url, + oauth_provider_arn=oauth_provider_arn + ) + else: + print(f"\nāš ļø Gateway not active yet. You can create the target later.") + + # Store gateway configuration in SSM + config.store_gateway_parameters( + gateway_response['gatewayId'], + gateway_response['gatewayArn'], + gateway_response['gatewayUrl'], + gateway_response['gatewayName'] + ) + + print(f"\n" + "=" * 70) + print("Gateway Setup Complete!") + print("=" * 70) + + print(f"\nāœ… Gateway configuration stored in SSM Parameter Store:") + print(f" /app/lakehouse-agent/gateway-id") + print(f" /app/lakehouse-agent/gateway-arn") + print(f" /app/lakehouse-agent/gateway-url") + print(f" /app/lakehouse-agent/gateway-name") + + print(f"\nšŸ“‹ Next Steps:") + print(f" 1. Deploy the Lakehouse Agent (Step 8)") + print(f" 2. Test the system end-to-end") + + print("\n" + "=" * 70) + + except Exception as e: + print(f"\nāŒ Gateway creation failed: {str(e)}") + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/create_lambda_role.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/create_lambda_role.py new file mode 100644 index 00000000..35970584 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/create_lambda_role.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +""" +Create IAM role for Gateway Interceptor Lambda +""" +import boto3 +import json +import sys + +def create_lambda_role(): + """Create IAM role for Lambda execution.""" + session = boto3.Session() + region = session.region_name + + iam = boto3.client('iam', region_name=region) + sts = boto3.client('sts', region_name=region) + ssm = boto3.client('ssm', region_name=region) + + account_id = sts.get_caller_identity()['Account'] + role_name = 'InsuranceClaimsGatewayInterceptorRole' + + # Trust policy for Lambda + trust_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + }, + "Action": "sts:AssumeRole" + } + ] + } + + try: + # Create role + print(f"Creating IAM role: {role_name}") + response = iam.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + Description='Lambda execution role for Gateway Interceptor' + ) + role_arn = response['Role']['Arn'] + print(f"āœ… Created IAM role: {role_arn}") + + # Attach basic Lambda execution policy + iam.attach_role_policy( + RoleName=role_name, + PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' + ) + print(f"āœ… Attached AWSLambdaBasicExecutionRole policy") + + # Store role ARN in SSM Parameter Store + print(f"šŸ’¾ Storing role ARN in SSM Parameter Store...") + ssm.put_parameter( + Name='/app/lakehouse-agent/interceptor-lambda-role-arn', + Value=role_arn, + Description='IAM role ARN for Gateway Interceptor Lambda', + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: /app/lakehouse-agent/interceptor-lambda-role-arn") + + return role_arn + + except iam.exceptions.EntityAlreadyExistsException: + print(f"ā„¹ļø Role {role_name} already exists, retrieving ARN") + response = iam.get_role(RoleName=role_name) + role_arn = response['Role']['Arn'] + print(f"āœ… Using existing role: {role_arn}") + + # Store role ARN in SSM Parameter Store + print(f"šŸ’¾ Storing role ARN in SSM Parameter Store...") + ssm.put_parameter( + Name='/app/lakehouse-agent/interceptor-lambda-role-arn', + Value=role_arn, + Description='IAM role ARN for Gateway Interceptor Lambda', + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: /app/lakehouse-agent/interceptor-lambda-role-arn") + + return role_arn + except Exception as e: + print(f"āŒ Error creating role: {e}") + sys.exit(1) + +if __name__ == '__main__': + role_arn = create_lambda_role() + print(f"\nāœ… Lambda Role ARN stored in SSM Parameter Store") + print(f" /app/lakehouse-agent/interceptor-lambda-role-arn = {role_arn}") + diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/decode_user_token.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/decode_user_token.py new file mode 100644 index 00000000..ad55b29e --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/decode_user_token.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +""" +Decode User JWT Token and Check Gateway Configuration + +This script: +1. Authenticates a user and gets their JWT token +2. Decodes and displays all token claims +3. Checks Gateway JWT authorizer configuration +4. Compares token claims with Gateway expectations + +Usage: + python decode_user_token.py --username --password +""" + +import boto3 +import json +import base64 +import argparse +import sys + + +def decode_jwt(token): + """Decode JWT token without verification.""" + parts = token.split('.') + if len(parts) != 3: + return None, None + + # Decode header + header = json.loads(base64.urlsafe_b64decode(parts[0] + '==')) + + # Decode payload + payload = json.loads(base64.urlsafe_b64decode(parts[1] + '==')) + + return header, payload + + +def get_user_tokens(username, password): + """Get user tokens from Cognito.""" + session = boto3.Session() + region = session.region_name + ssm = boto3.client('ssm', region_name=region) + cognito = boto3.client('cognito-idp', region_name=region) + + print("=" * 70) + print("Step 1: Authenticate User and Get Tokens") + print("=" * 70) + + # Get Cognito configuration + print("\nšŸ“‹ Loading Cognito configuration...") + client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-id')['Parameter']['Value'] + client_secret = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-secret', WithDecryption=True)['Parameter']['Value'] + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + + print(f" Client ID: {client_id}") + print(f" User Pool: {user_pool_id}") + + # Authenticate user + print(f"\nšŸ” Authenticating user: {username}") + + import hmac + import hashlib + message = username + client_id + secret_hash = base64.b64encode( + hmac.new(client_secret.encode(), message.encode(), hashlib.sha256).digest() + ).decode() + + try: + response = cognito.admin_initiate_auth( + UserPoolId=user_pool_id, + ClientId=client_id, + AuthFlow='ADMIN_USER_PASSWORD_AUTH', + AuthParameters={ + 'USERNAME': username, + 'PASSWORD': password, + 'SECRET_HASH': secret_hash + } + ) + + access_token = response['AuthenticationResult']['AccessToken'] + id_token = response['AuthenticationResult']['IdToken'] + + print(f"āœ… User authenticated successfully!") + + return access_token, id_token, region, client_id, user_pool_id + + except Exception as e: + print(f"āŒ Authentication failed: {e}") + return None, None, None, None, None + + +def check_gateway_config(region): + """Check Gateway JWT authorizer configuration.""" + print("\n" + "=" * 70) + print("Step 2: Check Gateway JWT Authorizer Configuration") + print("=" * 70) + + ssm = boto3.client('ssm', region_name=region) + agentcore = boto3.client('bedrock-agentcore-control', region_name=region) + + try: + gateway_id = ssm.get_parameter(Name='/app/lakehouse-agent/gateway-id')['Parameter']['Value'] + print(f"\nšŸ“¦ Gateway ID: {gateway_id}") + + gateway_details = agentcore.get_gateway(gatewayIdentifier=gateway_id) + auth_config = gateway_details.get('authorizerConfiguration', {}) + + if 'customJWTAuthorizer' in auth_config: + jwt_config = auth_config['customJWTAuthorizer'] + print(f"\nšŸ” JWT Authorizer Configuration:") + print(f" Discovery URL: {jwt_config.get('discoveryUrl', 'N/A')}") + print(f" Allowed Audience: {jwt_config.get('allowedAudience', [])}") + print(f" Allowed Clients: {jwt_config.get('allowedClients', [])}") + return jwt_config + else: + print(f"\nāš ļø No JWT authorizer configured") + return None + + except Exception as e: + print(f"\nāš ļø Could not get Gateway configuration: {e}") + return None + + +def main(): + parser = argparse.ArgumentParser(description='Decode user JWT token and check Gateway config') + parser.add_argument('--username', required=True, help='Cognito username') + parser.add_argument('--password', required=True, help='User password') + args = parser.parse_args() + + # Get user tokens + access_token, id_token, region, client_id, user_pool_id = get_user_tokens(args.username, args.password) + + if not access_token: + sys.exit(1) + + # Decode tokens + print("\n" + "=" * 70) + print("Step 3: Decode and Inspect Tokens") + print("=" * 70) + + print("\nšŸ“„ ID TOKEN:") + print("=" * 70) + id_header, id_payload = decode_jwt(id_token) + print(json.dumps(id_payload, indent=2)) + + print("\nšŸ“„ ACCESS TOKEN:") + print("=" * 70) + access_header, access_payload = decode_jwt(access_token) + print(json.dumps(access_payload, indent=2)) + + # Check Gateway configuration + gateway_config = check_gateway_config(region) + + # Compare token with Gateway expectations + print("\n" + "=" * 70) + print("Step 4: Validate Token Against Gateway Configuration") + print("=" * 70) + + if gateway_config: + print("\nšŸ” Checking token compatibility...") + + # Check issuer + expected_issuer = f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" + token_issuer = access_payload.get('iss', '') + + print(f"\n1. Issuer (iss):") + print(f" Expected: {expected_issuer}") + print(f" Token: {token_issuer}") + if token_issuer == expected_issuer: + print(f" āœ… Match") + else: + print(f" āŒ Mismatch") + + # Check client_id + allowed_clients = gateway_config.get('allowedClients', []) + token_client_id = access_payload.get('client_id', '') + + print(f"\n2. Client ID:") + print(f" Allowed: {allowed_clients}") + print(f" Token: {token_client_id}") + if token_client_id in allowed_clients: + print(f" āœ… Match") + else: + print(f" āŒ Not in allowed clients") + + # Check audience (if configured) + allowed_audience = gateway_config.get('allowedAudience', []) + token_aud = access_payload.get('aud', '') + + print(f"\n3. Audience (aud):") + print(f" Allowed: {allowed_audience}") + print(f" Token: {token_aud}") + if not allowed_audience: + print(f" ā„¹ļø No audience restriction configured") + elif token_aud in allowed_audience: + print(f" āœ… Match") + else: + print(f" āŒ Not in allowed audience") + + # Check token_use + token_use = access_payload.get('token_use', '') + print(f"\n4. Token Use:") + print(f" Token: {token_use}") + if token_use == 'access': + print(f" āœ… Correct (should be 'access' for API calls)") + else: + print(f" āš ļø Unexpected token_use value") + + # Summary + print("\n" + "=" * 70) + print("Summary") + print("=" * 70) + + issues = [] + if token_issuer != expected_issuer: + issues.append("āŒ Issuer mismatch") + if token_client_id not in allowed_clients: + issues.append("āŒ Client ID not in allowed clients") + if allowed_audience and token_aud not in allowed_audience: + issues.append("āŒ Audience not in allowed audience") + + if issues: + print("\nāŒ Token validation issues found:") + for issue in issues: + print(f" {issue}") + print("\nšŸ’” Possible solutions:") + print(" 1. Redeploy Gateway with correct client ID in allowedClients") + print(" 2. Check that user authenticated with correct Cognito client") + print(" 3. Verify Gateway JWT authorizer configuration") + else: + print("\nāœ… Token should be accepted by Gateway!") + print(" All claims match Gateway configuration") + + print("\n" + "=" * 70) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/.gitignore b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/.gitignore new file mode 100644 index 00000000..dd5c8249 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/.gitignore @@ -0,0 +1 @@ +interceptor-lambda.zip \ No newline at end of file diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/deploy.sh b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/deploy.sh new file mode 100644 index 00000000..f1f028b2 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/deploy.sh @@ -0,0 +1,162 @@ +#!/bin/bash +# Deploy Gateway Interceptor Lambda Function + +set -e + +echo "šŸš€ Deploying Gateway Interceptor Lambda" + +# Get AWS region from default configuration +AWS_REGION=$(aws configure get region) +if [ -z "$AWS_REGION" ]; then + echo "āŒ Error: AWS region not configured" + echo " Please run: aws configure set region " + exit 1 +fi + +echo " Region: $AWS_REGION" + +# Read configuration from SSM Parameter Store +echo "" +echo "šŸ” Loading configuration from SSM Parameter Store..." + +# Temporarily disable exit on error to capture SSM errors +set +e +COGNITO_USER_POOL_ID=$(aws ssm get-parameter --name /app/lakehouse-agent/cognito-user-pool-id --query 'Parameter.Value' --output text 2>&1) +COGNITO_RESULT=$? + +COGNITO_APP_CLIENT_ID=$(aws ssm get-parameter --name /app/lakehouse-agent/cognito-app-client-id --query 'Parameter.Value' --output text 2>&1) +CLIENT_RESULT=$? +set -e + +if [ $COGNITO_RESULT -ne 0 ] || [ $CLIENT_RESULT -ne 0 ]; then + echo "āŒ Error: Required SSM parameters not found" + echo "" + if [ $COGNITO_RESULT -ne 0 ]; then + echo " Missing: /app/lakehouse-agent/cognito-user-pool-id" + echo " Error: $COGNITO_USER_POOL_ID" + fi + if [ $CLIENT_RESULT -ne 0 ]; then + echo " Missing: /app/lakehouse-agent/cognito-app-client-id" + echo " Error: $COGNITO_APP_CLIENT_ID" + fi + echo "" + echo " Please run setup_cognito.py first:" + echo " cd gateway-setup" + echo " python setup_cognito.py" + exit 1 +fi + +echo "āœ… Configuration loaded from SSM" +echo " Cognito User Pool ID: $COGNITO_USER_POOL_ID" +echo " Cognito App Client ID: $COGNITO_APP_CLIENT_ID" + +# Package Lambda function +echo "" +echo "šŸ“¦ Packaging Lambda function..." + +mkdir -p dist +pip install -r requirements.txt -t dist/ --platform manylinux2014_x86_64 --only-binary=:all: +cp lambda_function.py dist/ + +cd dist +zip -r ../interceptor-lambda.zip . +cd .. + +echo "āœ… Package created: interceptor-lambda.zip" + +# Create Lambda role using Python script +echo "" +echo "šŸ”‘ Creating Lambda execution role..." +cd .. +python create_lambda_role.py +cd interceptor + +# Get the role ARN from SSM Parameter Store (stored by create_lambda_role.py) +LAMBDA_ROLE_ARN=$(aws ssm get-parameter --name /app/lakehouse-agent/interceptor-lambda-role-arn --query 'Parameter.Value' --output text 2>/dev/null) + +# Fallback to direct IAM query if not in SSM yet +if [ -z "$LAMBDA_ROLE_ARN" ]; then + echo " Retrieving role ARN from IAM..." + LAMBDA_ROLE_ARN=$(aws iam get-role --role-name InsuranceClaimsGatewayInterceptorRole --query 'Role.Arn' --output text 2>/dev/null) +fi + +if [ -z "$LAMBDA_ROLE_ARN" ]; then + echo "āŒ Failed to retrieve Lambda role ARN" + exit 1 +fi + +echo "āœ… Lambda role ready: $LAMBDA_ROLE_ARN" + +# Wait for IAM role to propagate (required for new roles) +echo "ā³ Waiting for IAM role to propagate (10 seconds)..." +sleep 10 + +# Check if Lambda function already exists +echo "" +echo "šŸ” Checking if Lambda function exists..." +if aws lambda get-function --function-name lakehouse-gateway-interceptor --region $AWS_REGION 2>/dev/null; then + echo "šŸ“ Updating existing Lambda function..." + aws lambda update-function-code \ + --function-name lakehouse-gateway-interceptor \ + --zip-file fileb://interceptor-lambda.zip \ + --region $AWS_REGION + + echo "āš™ļø Updating Lambda configuration..." + aws lambda update-function-configuration \ + --function-name lakehouse-gateway-interceptor \ + --environment "Variables={COGNITO_REGION=$AWS_REGION,COGNITO_USER_POOL_ID=$COGNITO_USER_POOL_ID,COGNITO_APP_CLIENT_ID=$COGNITO_APP_CLIENT_ID}" \ + --region $AWS_REGION + + echo "āœ… Lambda function updated!" +else + echo "šŸ“ Creating new Lambda function..." + + # Retry logic for role propagation + MAX_RETRIES=3 + RETRY_COUNT=0 + + while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do + if aws lambda create-function \ + --function-name lakehouse-gateway-interceptor \ + --runtime python3.11 \ + --role $LAMBDA_ROLE_ARN \ + --handler lambda_function.lambda_handler \ + --zip-file fileb://interceptor-lambda.zip \ + --timeout 30 \ + --memory-size 256 \ + --environment "Variables={COGNITO_REGION=$AWS_REGION,COGNITO_USER_POOL_ID=$COGNITO_USER_POOL_ID,COGNITO_APP_CLIENT_ID=$COGNITO_APP_CLIENT_ID}" \ + --region $AWS_REGION 2>/dev/null; then + echo "āœ… Lambda function created!" + break + else + RETRY_COUNT=$((RETRY_COUNT + 1)) + if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then + echo "ā³ Role not ready yet, waiting 5 seconds (attempt $RETRY_COUNT/$MAX_RETRIES)..." + sleep 5 + else + echo "āŒ Failed to create Lambda function after $MAX_RETRIES attempts" + echo " The IAM role may need more time to propagate" + exit 1 + fi + fi + done +fi + +# Store Lambda function ARN in SSM Parameter Store +echo "" +echo "šŸ’¾ Storing Lambda function ARN in SSM Parameter Store..." +LAMBDA_FUNCTION_ARN=$(aws lambda get-function --function-name lakehouse-gateway-interceptor --region $AWS_REGION --query 'Configuration.FunctionArn' --output text) + +aws ssm put-parameter \ + --name /app/lakehouse-agent/interceptor-lambda-arn \ + --value "$LAMBDA_FUNCTION_ARN" \ + --type String \ + --overwrite \ + --region $AWS_REGION + +echo "āœ… Stored parameter: /app/lakehouse-agent/interceptor-lambda-arn" + +echo "" +echo "✨ Deployment complete!" +echo "" +echo "šŸ“ Lambda Function ARN: $LAMBDA_FUNCTION_ARN" diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/lambda_function.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/lambda_function.py new file mode 100644 index 00000000..e6a95178 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/lambda_function.py @@ -0,0 +1,426 @@ +""" +AgentCore Gateway Interceptor for Health Lakehouse Data + +This Lambda function acts as a Gateway Interceptor following the AgentCore MCP protocol: +1. Extracts JWT bearer tokens from MCP gateway request structure +2. Validates JWT tokens against Cognito +3. Extracts user principal (email/username) from JWT claims +4. Adds user identity to request headers for downstream MCP server +5. Returns responses in proper MCP interceptor format + +Reference: https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/02-AgentCore-gateway/14-token-exchange-at-request-interceptor/ + +OAuth Flow: + Streamlit → lakehouse-agent → Gateway (this interceptor) → MCP server + +The interceptor extracts the principal from the JWT token and passes it to the MCP server +for Lake Formation row-level security enforcement. +""" + +import json +import logging +import os +import boto3 +from typing import Dict, Any, Optional +import urllib.request +import base64 +from jose import jwt, JWTError + +# Configure logging +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +# Cache for configuration and keys +_config = None +_jwks = None + + +def get_config() -> Dict[str, str]: + """ + Get Cognito configuration from environment variables or SSM. + + Returns: + Dictionary with Cognito configuration + """ + global _config + + if _config is not None: + return _config + + # First try environment variables + region = os.environ.get('COGNITO_REGION') or os.environ.get('AWS_REGION', 'us-west-2') + user_pool_id = os.environ.get('COGNITO_USER_POOL_ID', '') + app_client_id = os.environ.get('COGNITO_APP_CLIENT_ID', '') + + # If not set, try SSM Parameter Store + if not user_pool_id or not app_client_id: + logger.info("Loading Cognito configuration from SSM Parameter Store...") + try: + ssm = boto3.client('ssm', region_name=region) + + if not user_pool_id: + response = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id') + user_pool_id = response['Parameter']['Value'] + logger.info(f"Loaded user_pool_id from SSM: {user_pool_id}") + + if not app_client_id: + response = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-id') + app_client_id = response['Parameter']['Value'] + logger.info(f"Loaded app_client_id from SSM: {app_client_id}") + + except Exception as e: + logger.error(f"Error loading configuration from SSM: {e}") + raise + + _config = { + 'region': region, + 'user_pool_id': user_pool_id, + 'app_client_id': app_client_id, + 'issuer': f'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}' + } + + logger.info(f"Cognito configuration loaded: region={region}, user_pool_id={user_pool_id}") + return _config + + +def get_cognito_public_keys() -> Dict[str, Any]: + """ + Fetch Cognito public keys for JWT validation. + + Returns: + Dictionary of public keys + """ + global _jwks + + if _jwks is not None: + return _jwks + + try: + config = get_config() + jwks_url = f"{config['issuer']}/.well-known/jwks.json" + logger.info(f"Fetching JWKS from: {jwks_url}") + + with urllib.request.urlopen(jwks_url) as response: + _jwks = json.loads(response.read()) + logger.info("Successfully fetched Cognito public keys") + return _jwks + except Exception as e: + logger.error(f"Error fetching Cognito public keys: {str(e)}") + raise + + +def validate_and_decode_jwt(token: str) -> Optional[Dict[str, Any]]: + """ + Validate JWT token and decode claims. + + Args: + token: JWT bearer token + + Returns: + Decoded JWT claims or None if invalid + """ + try: + config = get_config() + + # Get Cognito public keys + jwks = get_cognito_public_keys() + + # Decode token header to get key ID + unverified_headers = jwt.get_unverified_header(token) + kid = unverified_headers.get('kid') + + # Find the correct public key + key = None + for k in jwks.get('keys', []): + if k.get('kid') == kid: + key = k + break + + if not key: + logger.error("Public key not found for token") + return None + + # Validate and decode JWT + # Note: For access tokens, we don't validate audience since Cognito + # access tokens don't have 'aud' claim. We validate client_id instead. + try: + claims = jwt.decode( + token, + key, + algorithms=['RS256'], + audience=config['app_client_id'], + issuer=config['issuer'] + ) + except JWTError as e: + # If audience validation fails, try without audience (for access tokens) + if 'audience' in str(e).lower() or 'aud' in str(e).lower(): + logger.info("Retrying JWT validation without audience check (access token)") + claims = jwt.decode( + token, + key, + algorithms=['RS256'], + issuer=config['issuer'], + options={'verify_aud': False} + ) + # Manually verify client_id for access tokens + if claims.get('client_id') != config['app_client_id']: + logger.error(f"Client ID mismatch: {claims.get('client_id')} != {config['app_client_id']}") + return None + else: + raise + + logger.info(f"Successfully validated JWT for user: {claims.get('username', claims.get('sub'))}") + return claims + + except JWTError as e: + logger.error(f"JWT validation error: {str(e)}") + return None + except Exception as e: + logger.error(f"Error validating JWT: {str(e)}") + return None + + +def extract_bearer_token_from_mcp(event: Dict[str, Any]) -> Optional[str]: + """ + Extract bearer token from MCP gateway request structure. + + Following AgentCore Gateway MCP protocol, the event structure is: + { + "mcp": { + "gatewayRequest": { + "headers": {"Authorization": "Bearer "}, + "body": {...} + } + } + } + + Args: + event: Lambda event with MCP structure + + Returns: + Bearer token (without 'Bearer ' prefix) or None if not found + """ + try: + # Extract from MCP structure + mcp_data = event.get('mcp', {}) + gateway_request = mcp_data.get('gatewayRequest', {}) + headers = gateway_request.get('headers', {}) + + # Check Authorization header (case-insensitive) + auth_header = headers.get('Authorization') or headers.get('authorization') + + if auth_header: + # Remove 'Bearer ' prefix if present + if auth_header.startswith('Bearer '): + token = auth_header.replace('Bearer ', '', 1) + elif auth_header.startswith('bearer '): + token = auth_header.replace('bearer ', '', 1) + else: + token = auth_header + + logger.info(f"āœ… Bearer token extracted from MCP gateway request") + return token + + logger.warning("āš ļø Bearer token not found in MCP gateway request headers") + return None + + except Exception as e: + logger.error(f"āŒ Error extracting bearer token from MCP structure: {str(e)}") + return None + + +def extract_user_principal(claims: Dict[str, Any]) -> Optional[str]: + """ + Extract user principal (identity) from JWT claims. + + The principal is used for Lake Formation row-level security. + Priority order: + 1. email (preferred for user identification) + 2. username + 3. cognito:username + 4. sub (user ID as fallback) + + Args: + claims: Decoded JWT claims + + Returns: + User principal (email/username) or None + """ + # Try multiple claim fields in priority order + principal = ( + claims.get('email') or + claims.get('username') or + claims.get('cognito:username') or + claims.get('sub') + ) + + if principal: + logger.info(f"āœ… Extracted user principal: {principal}") + return principal + + logger.warning("āš ļø User principal not found in JWT claims") + return None + + +def get_user_scopes(claims: Dict[str, Any]) -> list: + """ + Extract OAuth scopes from JWT claims for logging and context. + + Args: + claims: Decoded JWT claims + + Returns: + List of scopes + """ + # Scopes can be in 'scope' claim (space-separated) or 'cognito:groups' + scope_string = claims.get('scope', '') + scopes = scope_string.split() if scope_string else [] + + # Add groups as scopes + groups = claims.get('cognito:groups', []) + if isinstance(groups, list): + scopes.extend(groups) + + return scopes + + +def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]: + """ + Main Lambda handler for AgentCore Gateway interceptor. + + Follows the MCP protocol for request interception: + 1. Extracts JWT token from MCP gateway request structure + 2. Validates JWT and extracts user principal + 3. Adds user identity to request for downstream MCP server + 4. Returns transformed request in MCP format + + Event Structure (Input): + { + "mcp": { + "gatewayRequest": { + "headers": {"Authorization": "Bearer "}, + "body": {...} + } + } + } + + Response Structure (Output): + { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": { + "headers": {...}, + "body": {...} + } + } + } + + Args: + event: Lambda event with MCP structure + context: Lambda context + + Returns: + Transformed request in MCP format or error response + """ + logger.info("šŸ” Gateway interceptor invoked") + logger.info(f"šŸ“¦ Event structure: {json.dumps(event, default=str)[:500]}...") + + try: + # Extract MCP gateway request + mcp_data = event.get('mcp', {}) + gateway_request = mcp_data.get('gatewayRequest', {}) + headers = gateway_request.get('headers', {}) + body = gateway_request.get('body', {}) + + logger.info(f"šŸ“‹ Headers present: {list(headers.keys())}") + logger.info(f"šŸ“‹ Body keys: {list(body.keys())}") + + # Extract bearer token from MCP structure + token = extract_bearer_token_from_mcp(event) + + if not token: + logger.error("āŒ No bearer token found in request") + return { + 'statusCode': 401, + 'body': json.dumps({ + 'error': 'Unauthorized', + 'message': 'Bearer token required in Authorization header' + }) + } + + # Validate and decode JWT + claims = validate_and_decode_jwt(token) + + if not claims: + logger.error("āŒ JWT validation failed") + return { + 'statusCode': 401, + 'body': json.dumps({ + 'error': 'Unauthorized', + 'message': 'Invalid or expired JWT token' + }) + } + + # Extract user principal from JWT claims + user_principal = extract_user_principal(claims) + + if not user_principal: + logger.error("āŒ User principal not found in JWT claims") + return { + 'statusCode': 401, + 'body': json.dumps({ + 'error': 'Unauthorized', + 'message': 'User principal not found in token claims' + }) + } + + # Get user scopes for logging + scopes = get_user_scopes(claims) + logger.info(f"šŸ‘¤ User: {user_principal}, Scopes: {scopes}") + + # Add user identity to headers for downstream MCP server + # The MCP server will use X-User-Identity for Lake Formation RLS + transformed_headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'X-User-Identity': user_principal, + 'X-User-Scopes': ','.join(scopes) if scopes else '' + } + + # Also add user context to body if it has params/arguments + # This ensures the MCP server can access user identity + transformed_body = body.copy() + if 'params' in transformed_body and 'arguments' in transformed_body['params']: + if 'context' not in transformed_body['params']['arguments']: + transformed_body['params']['arguments']['context'] = {} + transformed_body['params']['arguments']['context']['user_id'] = user_principal + transformed_body['params']['arguments']['context']['scopes'] = scopes + + # Return transformed request in MCP format + response = { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": { + "headers": transformed_headers, + "body": transformed_body + } + } + } + + logger.info(f"āœ… Request authorized for user: {user_principal}") + logger.info(f"šŸ“¤ Returning transformed request") + + return response + + except Exception as e: + logger.error(f"āŒ Error in gateway interceptor: {str(e)}") + import traceback + logger.error(f"Stack trace: {traceback.format_exc()}") + + return { + 'statusCode': 500, + 'body': json.dumps({ + 'error': 'Internal Server Error', + 'message': f'Error processing request: {str(e)}' + }) + } diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/requirements.txt b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/requirements.txt new file mode 100644 index 00000000..3f87a25a --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/interceptor/requirements.txt @@ -0,0 +1,2 @@ +python-jose[cryptography]>=3.4.0 +cryptography>=41.0.0 diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/test_gateway.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/test_gateway.py new file mode 100644 index 00000000..e26c0e36 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/test_gateway.py @@ -0,0 +1,411 @@ +#!/usr/bin/env python3 +""" +Test AgentCore Gateway with User Authentication + +This script tests the complete authentication flow: +1. User authenticates with Cognito (gets user JWT token) +2. User sends request to Gateway with JWT token +3. Gateway validates user JWT token +4. Gateway gets M2M token from Cognito (automatic via OAuth provider) +5. Gateway forwards request to MCP Runtime with M2M token +6. Runtime validates M2M token and processes request +7. Gateway returns response to user + +Usage: + python test_gateway.py --username --password + python test_gateway.py --username testuser --password TestPass123! +""" + +import boto3 +import requests +import json +import base64 +import argparse +import sys + + +def get_user_token(username: str, password: str): + """ + Authenticate user with Cognito and get JWT token. + + Args: + username: Cognito username + password: User password + + Returns: + Tuple of (access_token, id_token, region) + """ + print("=" * 70) + print("Step 1: User Authentication with Cognito") + print("=" * 70) + + session = boto3.Session() + region = session.region_name + ssm = boto3.client('ssm', region_name=region) + cognito = boto3.client('cognito-idp', region_name=region) + + # Get Cognito configuration + print("\nšŸ“‹ Loading Cognito configuration...") + try: + client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-id')['Parameter']['Value'] + client_secret = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-secret', WithDecryption=True)['Parameter']['Value'] + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + + print(f" Client ID: {client_id}") + print(f" User Pool: {user_pool_id}") + except Exception as e: + print(f"āŒ Error loading configuration: {e}") + return None, None, region + + # Authenticate user using ADMIN_USER_PASSWORD_AUTH + # This flow doesn't require USER_PASSWORD_AUTH to be enabled on the client + print(f"\nšŸ” Authenticating user: {username}") + try: + # Calculate SECRET_HASH + import hmac + import hashlib + message = username + client_id + secret_hash = base64.b64encode( + hmac.new( + client_secret.encode(), + message.encode(), + hashlib.sha256 + ).digest() + ).decode() + + response = cognito.admin_initiate_auth( + UserPoolId=user_pool_id, + ClientId=client_id, + AuthFlow='ADMIN_USER_PASSWORD_AUTH', + AuthParameters={ + 'USERNAME': username, + 'PASSWORD': password, + 'SECRET_HASH': secret_hash + } + ) + + access_token = response['AuthenticationResult']['AccessToken'] + id_token = response['AuthenticationResult']['IdToken'] + + print(f"āœ… User authenticated successfully!") + print(f" Token type: Bearer") + print(f" Expires in: {response['AuthenticationResult']['ExpiresIn']} seconds") + print("Access Token", access_token) + print("ID Token", id_token) + + # Decode and print token claims + print(f"\nšŸ“„ User Token Claims:") + parts = id_token.split('.') + if len(parts) == 3: + payload = json.loads(base64.urlsafe_b64decode(parts[1] + '==')) + print(f" Username: {payload.get('cognito:username', 'N/A')}") + print(f" Email: {payload.get('email', 'N/A')}") + print(f" Token Use: {payload.get('token_use', 'N/A')}") + print(f" Audience (aud): {payload.get('aud', 'N/A')}") + print(f" Issuer (iss): {payload.get('iss', 'N/A')}") + + # Also decode access token to see its claims + print(f"\nšŸ“„ Access Token Claims:") + parts = access_token.split('.') + if len(parts) == 3: + payload = json.loads(base64.urlsafe_b64decode(parts[1] + '==')) + print(f" Client ID: {payload.get('client_id', 'N/A')}") + print(f" Token Use: {payload.get('token_use', 'N/A')}") + print(f" Scope: {payload.get('scope', 'N/A')}") + print(f" Username: {payload.get('username', 'N/A')}") + print(f" Issuer (iss): {payload.get('iss', 'N/A')}") + + print(f"\nšŸ”‘ Access Token (first 100 chars):") + print(f" {access_token[:100]}...") + + return access_token, id_token, region + + except cognito.exceptions.NotAuthorizedException: + print(f"āŒ Authentication failed: Invalid username or password") + return None, None, region + except cognito.exceptions.UserNotFoundException: + print(f"āŒ User not found: {username}") + return None, None, region + except Exception as e: + print(f"āŒ Authentication error: {e}") + return None, None, region + + +def test_gateway(access_token: str, region: str): + """ + Test Gateway by sending MCP requests with user token. + + Args: + access_token: User's access token from Cognito + region: AWS region + """ + print("\n" + "=" * 70) + print("Step 2: Test Gateway with User Token") + print("=" * 70) + + ssm = boto3.client('ssm', region_name=region) + + # Get Gateway URL + print("\nšŸ“¦ Loading Gateway configuration...") + try: + gateway_url = ssm.get_parameter(Name='/app/lakehouse-agent/gateway-url')['Parameter']['Value'] + gateway_id = ssm.get_parameter(Name='/app/lakehouse-agent/gateway-id')['Parameter']['Value'] + print(f" Gateway URL: {gateway_url}") + print(f" Gateway ID: {gateway_id}") + + # Get Gateway configuration to check JWT authorizer settings + print(f"\nšŸ” Checking Gateway JWT authorizer configuration...") + agentcore = boto3.client('bedrock-agentcore-control', region_name=region) + try: + gateway_details = agentcore.get_gateway(gatewayIdentifier=gateway_id) + auth_config = gateway_details.get('authorizerConfiguration', {}) + if 'customJWTAuthorizer' in auth_config: + jwt_config = auth_config['customJWTAuthorizer'] + print(f" Discovery URL: {jwt_config.get('discoveryUrl', 'N/A')}") + print(f" Allowed Audience: {jwt_config.get('allowedAudience', [])}") + print(f" Allowed Clients: {jwt_config.get('allowedClients', [])}") + except Exception as e: + print(f" āš ļø Could not get Gateway details: {e}") + + except ssm.exceptions.ParameterNotFound: + print(f" āŒ Gateway URL not found in SSM") + print(f" Please deploy the Gateway first:") + print(f" cd gateway-setup && python create_gateway.py") + return + except Exception as e: + print(f" āŒ Error loading Gateway URL: {e}") + return + + # Prepare headers with user token + headers = { + "Authorization": f"Bearer {access_token}", + "Content-Type": "application/json", + "Accept": "application/json, text/event-stream" + } + + # Test 1: Initialize MCP session + print("\nšŸ“¤ Test 1: Initialize MCP session through Gateway") + init_request = { + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "gateway-test-client", + "version": "1.0.0" + } + } + } + + try: + response = requests.post(gateway_url, headers=headers, json=init_request, timeout=30) + print(f" Status: {response.status_code}") + print(f" Response length: {len(response.text)} bytes") + print(f" Content-Type: {response.headers.get('Content-Type', 'N/A')}") + + if response.status_code == 200: + if response.text: + # Parse SSE format + if response.headers.get('Content-Type') == 'text/event-stream': + print(f" āœ… Received SSE response") + lines = response.text.split('\n') + for line in lines: + if line.startswith('data: '): + json_str = line[6:] + try: + data = json.loads(json_str) + print(f" āœ… Initialize successful!") + if 'result' in data: + server_info = data['result'].get('serverInfo', {}) + print(f" Server Name: {server_info.get('name', 'N/A')}") + print(f" Server Version: {server_info.get('version', 'N/A')}") + print(f" Protocol Version: {data['result'].get('protocolVersion', 'N/A')}") + break + except json.JSONDecodeError: + continue + else: + try: + data = response.json() + print(f" āœ… Initialize successful!") + if 'result' in data: + server_info = data['result'].get('serverInfo', {}) + print(f" Server Name: {server_info.get('name', 'N/A')}") + print(f" Server Version: {server_info.get('version', 'N/A')}") + except json.JSONDecodeError: + print(f" āš ļø Response is not valid JSON") + print(f" Raw response: {response.text[:200]}") + else: + print(f" āš ļø Response body is empty") + return + elif response.status_code == 401: + print(f" āŒ Unauthorized - User token validation failed") + print(f" Response: {response.text[:500]}") + return + elif response.status_code == 403: + print(f" āŒ Forbidden - User not authorized") + print(f" Response: {response.text[:500]}") + return + else: + print(f" āŒ Initialize failed") + print(f" Response: {response.text[:500]}") + return + + except requests.exceptions.Timeout: + print(f" āŒ Request timed out") + print(f" This may indicate Gateway-to-Runtime authentication issues") + return + except Exception as e: + print(f" āŒ Error: {e}") + return + + # Test 2: Get tool list + print("\nšŸ“¤ Test 2: Get tool list through Gateway") + tools_request = { + "jsonrpc": "2.0", + "id": 2, + "method": "tools/list", + "params": {} + } + + try: + response = requests.post(gateway_url, headers=headers, json=tools_request, timeout=30) + print(f" Status: {response.status_code}") + print(f" Response length: {len(response.text)} bytes") + + if response.status_code == 200: + if response.text: + # Parse SSE format + if response.headers.get('Content-Type') == 'text/event-stream': + print(f" āœ… Received SSE response") + lines = response.text.split('\n') + for line in lines: + if line.startswith('data: '): + json_str = line[6:] + try: + data = json.loads(json_str) + print(f" āœ… Tool list retrieved!") + + if 'result' in data and 'tools' in data['result']: + tools = data['result']['tools'] + print(f"\n šŸ“‹ Available Tools ({len(tools)}):") + print(" " + "=" * 66) + for i, tool in enumerate(tools, 1): + print(f"\n {i}. {tool.get('name', 'N/A')}") + print(f" Description: {tool.get('description', 'N/A')}") + if 'inputSchema' in tool and 'properties' in tool['inputSchema']: + props = tool['inputSchema']['properties'] + if props: + print(f" Parameters: {', '.join(props.keys())}") + break + except json.JSONDecodeError: + continue + else: + try: + data = response.json() + print(f" āœ… Tool list retrieved!") + if 'result' in data and 'tools' in data['result']: + tools = data['result']['tools'] + print(f"\n šŸ“‹ Available Tools ({len(tools)}):") + for i, tool in enumerate(tools, 1): + print(f" {i}. {tool.get('name', 'N/A')}") + except json.JSONDecodeError: + print(f" āš ļø Response is not valid JSON") + else: + print(f" āš ļø Response body is empty") + else: + print(f" āŒ Tool list failed") + print(f" Response: {response.text[:500]}") + + except requests.exceptions.Timeout: + print(f" āŒ Request timed out") + except Exception as e: + print(f" āŒ Error: {e}") + + # Test 3: Query claims (if available) + print("\nšŸ“¤ Test 3: Query claims (user-specific data)") + query_request = { + "jsonrpc": "2.0", + "id": 3, + "method": "tools/call", + "params": { + "name": "get_claims_summary", + "arguments": {} + } + } + + try: + response = requests.post(gateway_url, headers=headers, json=query_request, timeout=30) + print(f" Status: {response.status_code}") + + if response.status_code == 200: + if response.text: + # Parse SSE format + if response.headers.get('Content-Type') == 'text/event-stream': + lines = response.text.split('\n') + for line in lines: + if line.startswith('data: '): + json_str = line[6:] + try: + data = json.loads(json_str) + if 'result' in data: + print(f" āœ… Query successful!") + # Try to parse the content + if 'content' in data['result']: + for content in data['result']['content']: + if content.get('type') == 'text': + try: + result_data = json.loads(content['text']) + if result_data.get('success'): + summary = result_data.get('summary', {}) + print(f" Total Claims: {summary.get('total_claims', 0)}") + print(f" Total Amount: ${summary.get('total_amount', 0):,.2f}") + except: + print(f" Response: {content['text'][:200]}") + break + except json.JSONDecodeError: + continue + else: + print(f" āš ļø Query failed or tool not available") + + except Exception as e: + print(f" āš ļø Query test skipped: {e}") + + +def main(): + parser = argparse.ArgumentParser(description='Test AgentCore Gateway with user authentication') + parser.add_argument('--username', required=True, help='Cognito username') + parser.add_argument('--password', required=True, help='User password') + args = parser.parse_args() + + print("\n" + "=" * 70) + print("AgentCore Gateway Test with User Authentication") + print("=" * 70 + "\n") + + # Step 1: Authenticate user and get token + access_token, id_token, region = get_user_token(args.username, args.password) + + if not access_token: + print("\nāŒ Failed to authenticate user. Exiting.") + sys.exit(1) + + # Step 2: Test Gateway with user token + test_gateway(access_token, region) + + print("\n" + "=" * 70) + print("Test Complete") + print("=" * 70) + print("\nāœ… Authentication Flow Validated:") + print(" 1. User authenticated with Cognito āœ“") + print(" 2. User token sent to Gateway āœ“") + print(" 3. Gateway validated user token āœ“") + print(" 4. Gateway obtained M2M token (automatic) āœ“") + print(" 5. Gateway forwarded request to Runtime āœ“") + print(" 6. Runtime validated M2M token āœ“") + print(" 7. Response returned to user āœ“") + print("\n" + "=" * 70 + "\n") + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/gateway-setup/update_interceptor_env.py b/02-use-cases/lakehouse-agent/deployment/gateway-setup/update_interceptor_env.py new file mode 100644 index 00000000..e51516cf --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/gateway-setup/update_interceptor_env.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +""" +Update Interceptor Lambda Environment Variables + +This script updates the interceptor Lambda function's environment variables +to use the correct Cognito configuration from SSM Parameter Store. + +Usage: + python update_interceptor_env.py +""" + +import boto3 +import sys + + +def main(): + print("=" * 70) + print("Update Interceptor Lambda Environment Variables") + print("=" * 70) + + session = boto3.Session() + region = session.region_name + ssm = boto3.client('ssm', region_name=region) + lambda_client = boto3.client('lambda', region_name=region) + + # Get correct Cognito configuration from SSM + print("\nšŸ“‹ Loading correct Cognito configuration from SSM...") + try: + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + app_client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-id')['Parameter']['Value'] + + print(f" User Pool ID: {user_pool_id}") + print(f" App Client ID: {app_client_id}") + print(f" Region: {region}") + except Exception as e: + print(f"āŒ Error loading Cognito configuration: {e}") + sys.exit(1) + + # Get interceptor Lambda ARN + print("\nšŸ” Finding interceptor Lambda function...") + try: + interceptor_arn = ssm.get_parameter(Name='/app/lakehouse-agent/interceptor-lambda-arn')['Parameter']['Value'] + # Extract function name from ARN + function_name = interceptor_arn.split(':')[-1] + print(f" Lambda ARN: {interceptor_arn}") + print(f" Function Name: {function_name}") + except ssm.exceptions.ParameterNotFound: + print(" āš ļø Interceptor Lambda ARN not found in SSM") + print(" Please enter the Lambda function name manually:") + function_name = input(" Lambda function name: ").strip() + if not function_name: + print("āŒ No function name provided") + sys.exit(1) + except Exception as e: + print(f"āŒ Error: {e}") + sys.exit(1) + + # Get current Lambda configuration + print(f"\nšŸ” Getting current Lambda configuration...") + try: + response = lambda_client.get_function_configuration(FunctionName=function_name) + current_env = response.get('Environment', {}).get('Variables', {}) + + print(f" Current environment variables:") + for key, value in current_env.items(): + print(f" {key}: {value}") + except Exception as e: + print(f"āŒ Error getting Lambda configuration: {e}") + sys.exit(1) + + # Update environment variables + print(f"\nšŸ”§ Updating Lambda environment variables...") + new_env = current_env.copy() + new_env['COGNITO_REGION'] = region + new_env['COGNITO_USER_POOL_ID'] = user_pool_id + new_env['COGNITO_APP_CLIENT_ID'] = app_client_id + + try: + lambda_client.update_function_configuration( + FunctionName=function_name, + Environment={'Variables': new_env} + ) + + print(f"āœ… Lambda environment variables updated!") + print(f" New configuration:") + print(f" COGNITO_REGION: {region}") + print(f" COGNITO_USER_POOL_ID: {user_pool_id}") + print(f" COGNITO_APP_CLIENT_ID: {app_client_id}") + + except Exception as e: + print(f"āŒ Error updating Lambda: {e}") + sys.exit(1) + + print("\n" + "=" * 70) + print("āœ… Update Complete") + print("=" * 70) + print("\nYou can now test the Gateway:") + print(" python test_gateway.py --username --password ") + print("\n" + "=" * 70) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/iam-policies/README.md b/02-use-cases/lakehouse-agent/deployment/iam-policies/README.md new file mode 100644 index 00000000..30498ff6 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/iam-policies/README.md @@ -0,0 +1,347 @@ +# IAM Policy Templates for SSM Parameter Store Access + +This directory contains IAM policy templates for managing access to lakehouse-agent SSM parameters. + +## Policy Files + +### 1. lakehouse-ssm-read-policy.json + +**Purpose**: Read-only access to SSM parameters for application runtime + +**Use Cases**: +- Lambda function execution roles +- ECS task execution roles +- EC2 instance profiles +- AgentCore Runtime roles +- Any service that needs to read configuration + +**Permissions Granted**: +- `ssm:GetParameter` - Read individual parameters +- `ssm:GetParametersByPath` - Bulk read parameters with lh_ prefix +- `kms:Decrypt` - Decrypt SecureString parameters +- `sts:GetCallerIdentity` - Get AWS account ID for auto-detection + +**Security Features**: +- Restricted to `lh_*` parameters only +- KMS decrypt only via SSM service +- Region-restricted (uses ${AWS_REGION} placeholder) + +### 2. lakehouse-ssm-admin-policy.json + +**Purpose**: Full management access for DevOps and migration operations + +**Use Cases**: +- DevOps engineers managing configuration +- CI/CD pipelines deploying infrastructure +- Migration utility execution +- Parameter backup and restore operations + +**Permissions Granted**: +- All read permissions from read-only policy +- `ssm:PutParameter` - Create/update parameters +- `ssm:DeleteParameter` - Remove parameters +- `ssm:GetParameterHistory` - View parameter versions +- `ssm:AddTagsToResource` - Tag parameters +- `ssm:DescribeParameters` - List all parameters + +**Security Features**: +- Restricted to `lh_*` parameters only +- Region-restricted (uses ${AWS_REGION} placeholder) +- Includes tagging permissions for organization + +## Usage Instructions + +### Creating Policies in AWS + +**Option 1: Using AWS CLI** + +```bash +# Set your AWS region +export AWS_REGION=us-east-1 + +# Create read-only policy +aws iam create-policy \ + --policy-name LakehouseSSMReadPolicy \ + --policy-document file://lakehouse-ssm-read-policy.json \ + --description "Read-only access to lakehouse-agent SSM parameters" + +# Create admin policy +aws iam create-policy \ + --policy-name LakehouseSSMAdminPolicy \ + --policy-document file://lakehouse-ssm-admin-policy.json \ + --description "Full management access to lakehouse-agent SSM parameters" +``` + +**Option 2: Using AWS Console** + +1. Navigate to IAM → Policies → Create policy +2. Click "JSON" tab +3. Copy contents of policy file +4. Replace `${AWS_REGION}` with your region (e.g., `us-east-1`) +5. Click "Next: Tags" +6. Add tags (optional): + - Key: `Application`, Value: `lakehouse-agent` + - Key: `Environment`, Value: `production` +7. Click "Next: Review" +8. Enter policy name and description +9. Click "Create policy" + +### Attaching Policies to Roles + +**Attach to Lambda Execution Role**: +```bash +# For application runtime (read-only) +aws iam attach-role-policy \ + --role-name lakehouse-mcp-server-role \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMReadPolicy + +# For migration utility (admin) +aws iam attach-role-policy \ + --role-name lakehouse-admin-role \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMAdminPolicy +``` + +**Attach to IAM User**: +```bash +# For DevOps engineer +aws iam attach-user-policy \ + --user-name devops-engineer \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMAdminPolicy +``` + +**Attach to IAM Group**: +```bash +# Create group for lakehouse admins +aws iam create-group --group-name lakehouse-admins + +# Attach policy to group +aws iam attach-group-policy \ + --group-name lakehouse-admins \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMAdminPolicy + +# Add users to group +aws iam add-user-to-group \ + --group-name lakehouse-admins \ + --user-name devops-engineer +``` + +### Verifying Policy Attachment + +```bash +# List policies attached to a role +aws iam list-attached-role-policies --role-name lakehouse-mcp-server-role + +# List policies attached to a user +aws iam list-attached-user-policies --user-name devops-engineer + +# Get policy details +aws iam get-policy \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMReadPolicy + +# Get policy version (to see actual permissions) +aws iam get-policy-version \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMReadPolicy \ + --version-id v1 +``` + +## Policy Customization + +### Restricting to Specific Region + +Replace `${AWS_REGION}` placeholder with your specific region: + +```json +"Condition": { + "StringEquals": { + "aws:RequestedRegion": "us-east-1" + } +} +``` + +### Adding MFA Requirement + +Add MFA requirement for admin operations: + +```json +{ + "Sid": "SSMParameterManagement", + "Effect": "Allow", + "Action": ["ssm:PutParameter", "ssm:DeleteParameter"], + "Resource": "arn:aws:ssm:*:*:parameter/lh_*", + "Condition": { + "Bool": { + "aws:MultiFactorAuthPresent": "true" + } + } +} +``` + +### Restricting by Environment Tag + +Allow access only to parameters tagged with specific environment: + +```json +{ + "Sid": "SSMParameterRead", + "Effect": "Allow", + "Action": ["ssm:GetParameter"], + "Resource": "arn:aws:ssm:*:*:parameter/lh_*", + "Condition": { + "StringEquals": { + "ssm:ResourceTag/Environment": "production" + } + } +} +``` + +### Time-Based Access + +Restrict access to business hours: + +```json +{ + "Sid": "SSMParameterManagement", + "Effect": "Allow", + "Action": ["ssm:PutParameter"], + "Resource": "arn:aws:ssm:*:*:parameter/lh_*", + "Condition": { + "DateGreaterThan": {"aws:CurrentTime": "2024-01-01T09:00:00Z"}, + "DateLessThan": {"aws:CurrentTime": "2024-12-31T17:00:00Z"} + } +} +``` + +## Testing Policies + +### Test Read Access + +```bash +# Assume role with read-only policy +aws sts assume-role \ + --role-arn arn:aws:iam::XXXXXXXXXXXX:role/lakehouse-mcp-server-role \ + --role-session-name test-session + +# Export credentials +export AWS_ACCESS_KEY_ID=... +export AWS_SECRET_ACCESS_KEY=... +export AWS_SESSION_TOKEN=... + +# Test reading parameter +aws ssm get-parameter --name lh_s3_bucket_name + +# Test reading all parameters +aws ssm get-parameters-by-path --path /lh_ --recursive + +# Test writing (should fail) +aws ssm put-parameter \ + --name lh_test \ + --value "test" \ + --type String +# Expected: AccessDeniedException +``` + +### Test Admin Access + +```bash +# Assume role with admin policy +aws sts assume-role \ + --role-arn arn:aws:iam::XXXXXXXXXXXX:role/lakehouse-admin-role \ + --role-session-name admin-session + +# Test creating parameter +aws ssm put-parameter \ + --name lh_test_param \ + --value "test-value" \ + --type String + +# Test updating parameter +aws ssm put-parameter \ + --name lh_test_param \ + --value "updated-value" \ + --type String \ + --overwrite + +# Test deleting parameter +aws ssm delete-parameter --name lh_test_param +``` + +## Troubleshooting + +### AccessDeniedException + +**Error**: `User: arn:aws:iam::XXXXXXXXXXXX:role/MyRole is not authorized to perform: ssm:GetParameter` + +**Solutions**: +1. Verify policy is attached to role: + ```bash + aws iam list-attached-role-policies --role-name MyRole + ``` + +2. Check policy document has correct permissions: + ```bash + aws iam get-policy-version \ + --policy-arn arn:aws:iam::XXXXXXXXXXXX:policy/LakehouseSSMReadPolicy \ + --version-id v1 + ``` + +3. Verify parameter name starts with `lh_`: + ```bash + aws ssm describe-parameters --filters "Key=Name,Values=lh_" + ``` + +### KMS Decrypt Error + +**Error**: `User is not authorized to perform: kms:Decrypt` + +**Solutions**: +1. Verify KMS permission in policy includes condition: + ```json + "Condition": { + "StringEquals": { + "kms:ViaService": "ssm.*.amazonaws.com" + } + } + ``` + +2. Check KMS key policy allows your role: + ```bash + aws kms get-key-policy \ + --key-id alias/aws/ssm \ + --policy-name default + ``` + +### Region Mismatch + +**Error**: Parameters not found or access denied + +**Solutions**: +1. Verify you're in the correct region: + ```bash + aws configure get region + ``` + +2. Check parameter exists in that region: + ```bash + aws ssm get-parameter --name lh_s3_bucket_name --region us-east-1 + ``` + +## Best Practices + +1. **Use Read-Only Policy by Default**: Grant admin access only when necessary +2. **Implement Least Privilege**: Start with minimal permissions and add as needed +3. **Use IAM Groups**: Manage permissions via groups, not individual users +4. **Enable MFA**: Require MFA for admin operations +5. **Regular Audits**: Review policy attachments quarterly +6. **Tag Resources**: Use tags for organization and conditional access +7. **Monitor Access**: Set up CloudWatch alarms for unauthorized access +8. **Document Changes**: Keep change log for policy modifications +9. **Test Policies**: Always test in non-production first +10. **Version Control**: Store policy files in git for change tracking + +## Related Documentation + +- [SSM Configuration Guide](../README.md#configuration-management-with-aws-systems-manager-ssm) +- [Security Setup](../SECURITY_SETUP.md#ssm-parameter-store-security) +- [Migration Guide](../README.md#migration-from-env-to-ssm) +- [AWS IAM Best Practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) +- [AWS SSM Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) diff --git a/02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-admin-policy.json b/02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-admin-policy.json new file mode 100644 index 00000000..a6c94737 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-admin-policy.json @@ -0,0 +1,56 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "SSMParameterManagement", + "Effect": "Allow", + "Action": [ + "ssm:PutParameter", + "ssm:GetParameter", + "ssm:GetParametersByPath", + "ssm:DescribeParameters", + "ssm:DeleteParameter", + "ssm:GetParameterHistory", + "ssm:AddTagsToResource", + "ssm:RemoveTagsFromResource", + "ssm:ListTagsForResource" + ], + "Resource": "arn:aws:ssm:*:*:parameter/lh_*", + "Condition": { + "StringEquals": { + "aws:RequestedRegion": "${AWS_REGION}" + } + } + }, + { + "Sid": "KMSDecryptForSSM", + "Effect": "Allow", + "Action": [ + "kms:Decrypt", + "kms:DescribeKey" + ], + "Resource": "arn:aws:kms:*:*:key/*", + "Condition": { + "StringEquals": { + "kms:ViaService": "ssm.*.amazonaws.com" + } + } + }, + { + "Sid": "STSGetCallerIdentity", + "Effect": "Allow", + "Action": [ + "sts:GetCallerIdentity" + ], + "Resource": "*" + }, + { + "Sid": "SSMListParameters", + "Effect": "Allow", + "Action": [ + "ssm:DescribeParameters" + ], + "Resource": "*" + } + ] +} diff --git a/02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-read-policy.json b/02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-read-policy.json new file mode 100644 index 00000000..9235724c --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/iam-policies/lakehouse-ssm-read-policy.json @@ -0,0 +1,40 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "SSMParameterRead", + "Effect": "Allow", + "Action": [ + "ssm:GetParameter", + "ssm:GetParametersByPath" + ], + "Resource": "arn:aws:ssm:*:*:parameter/lh_*", + "Condition": { + "StringEquals": { + "aws:RequestedRegion": "${AWS_REGION}" + } + } + }, + { + "Sid": "KMSDecryptForSSM", + "Effect": "Allow", + "Action": [ + "kms:Decrypt" + ], + "Resource": "arn:aws:kms:*:*:key/*", + "Condition": { + "StringEquals": { + "kms:ViaService": "ssm.*.amazonaws.com" + } + } + }, + { + "Sid": "STSGetCallerIdentity", + "Effect": "Allow", + "Action": [ + "sts:GetCallerIdentity" + ], + "Resource": "*" + } + ] +} diff --git a/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/.dockerignore b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/.dockerignore new file mode 100644 index 00000000..6c3765b3 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/.dockerignore @@ -0,0 +1,72 @@ +# Build artifacts +build/ +dist/ +*.egg-info/ +*.egg + +# Python cache +__pycache__/ +__pycache__* +*.py[cod] +*$py.class +*.so +.Python + +# Virtual environments +.venv/ +.env +venv/ +env/ +ENV/ + +# Testing +.pytest_cache/ +.coverage +.coverage* +htmlcov/ +.tox/ +*.cover +.hypothesis/ +.mypy_cache/ +.ruff_cache/ + +# Development +*.log +*.bak +*.swp +*.swo +*~ +.DS_Store + +# IDEs +.vscode/ +.idea/ + +# Version control +.git/ +.gitignore +.gitattributes + +# Documentation +docs/ + +# CI/CD +.github/ +.gitlab-ci.yml +.travis.yml + +# Project specific +tests/ + +# Bedrock AgentCore specific - keep config but exclude runtime files +.bedrock_agentcore.yaml +.dockerignore +.bedrock_agentcore/ + +# Keep wheelhouse for offline installations +# wheelhouse/ + +# Monorepo directories +cdk/ +terraform/ +mcp/lambda/ diff --git a/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/Dockerfile b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/Dockerfile new file mode 100644 index 00000000..b9366655 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/Dockerfile @@ -0,0 +1,41 @@ +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim +WORKDIR /app + +# All environment variables in one layer +ENV UV_SYSTEM_PYTHON=1 \ + UV_COMPILE_BYTECODE=1 \ + UV_NO_PROGRESS=1 \ + PYTHONUNBUFFERED=1 \ + DOCKER_CONTAINER=1 \ + AWS_REGION=us-east-1 \ + AWS_DEFAULT_REGION=us-east-1 + + + +COPY requirements.txt requirements.txt +# Install from requirements file +RUN uv pip install -r requirements.txt + + + + +RUN uv pip install aws-opentelemetry-distro==0.12.2 + + +# Signal that this is running in Docker for host binding logic +ENV DOCKER_CONTAINER=1 + +# Create non-root user +RUN useradd -m -u 1000 bedrock_agentcore +USER bedrock_agentcore + +EXPOSE 9000 +EXPOSE 8000 +EXPOSE 8080 + +# Copy entire project (respecting .dockerignore) +COPY . . + +# Use the full module path + +CMD ["opentelemetry-instrument", "python", "-m", "lakehouse_agent"] diff --git a/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/deploy_lakehouse_agent.py b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/deploy_lakehouse_agent.py new file mode 100644 index 00000000..769fa447 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/deploy_lakehouse_agent.py @@ -0,0 +1,406 @@ +#!/usr/bin/env python3 +""" +Deploy Lakehouse Agent to AgentCore Runtime + +This script deploys the health lakehouse data agent to Amazon Bedrock AgentCore Runtime +using the Bedrock AgentCore Starter Toolkit. + +Prerequisites: +- AWS credentials configured +- Docker running +- Gateway configured (run create_gateway.py) +- Configuration in SSM Parameter Store (see README.md) +- bedrock-agentcore-starter-toolkit installed + +Usage: + python deploy_lakehouse_agent.py +""" + +import sys +import boto3 +import json + +try: + from bedrock_agentcore_starter_toolkit import Runtime +except ImportError: + print("\nāŒ Error: bedrock-agentcore-starter-toolkit not installed") + print(" Please install it with: pip install bedrock-agentcore-starter-toolkit") + sys.exit(1) + + +class SSMConfig: + """Load configuration from SSM Parameter Store.""" + + def __init__(self): + """Initialize and load configuration from SSM.""" + # Get region from boto3 session + session = boto3.Session() + self.region = session.region_name + + self.ssm = boto3.client('ssm', region_name=self.region) + self.sts = boto3.client('sts', region_name=self.region) + + # Get account ID + self.account_id = self.sts.get_caller_identity()['Account'] + + print(f"āœ… Using AWS configuration") + print(f" Region: {self.region}") + print(f" Account: {self.account_id}") + + # Load configuration from SSM + print(f"\nšŸ” Loading configuration from SSM Parameter Store...") + self.gateway_arn = self._get_parameter('/app/lakehouse-agent/gateway-arn', required=False) + self.cognito_user_pool_id = self._get_parameter('/app/lakehouse-agent/cognito-user-pool-id', required=False) + self.cognito_app_client_id = self._get_parameter('/app/lakehouse-agent/cognito-app-client-id', required=False) + + if self.gateway_arn: + print(f" āœ… Gateway ARN: {self.gateway_arn}") + else: + print(f" āš ļø Gateway ARN not configured") + + if self.cognito_user_pool_id and self.cognito_app_client_id: + print(f" āœ… Cognito configured") + else: + print(f" āš ļø Cognito not configured - will use IAM authentication") + + def _get_parameter(self, parameter_name: str, required: bool = True) -> str: + """Get parameter value from SSM Parameter Store.""" + try: + response = self.ssm.get_parameter(Name=parameter_name) + return response['Parameter']['Value'] + except self.ssm.exceptions.ParameterNotFound: + if required: + print(f"āŒ SSM parameter {parameter_name} not found") + print(f" Please run the setup scripts first") + sys.exit(1) + return None + except Exception as e: + if required: + print(f"āŒ Error retrieving parameter {parameter_name}: {e}") + sys.exit(1) + return None + + def store_agent_parameters(self, runtime_arn: str, runtime_id: str): + """Store Lakehouse Agent runtime information in SSM Parameter Store.""" + print("\nšŸ’¾ Storing agent configuration in SSM Parameter Store...") + + parameters = [ + { + 'name': '/app/lakehouse-agent/agent-runtime-arn', + 'value': runtime_arn, + 'description': 'Lakehouse Agent runtime ARN on AgentCore' + }, + { + 'name': '/app/lakehouse-agent/agent-runtime-id', + 'value': runtime_id, + 'description': 'Lakehouse Agent runtime ID on AgentCore' + }, + { + 'name': '/app/lakehouse-agent/agent-name', + 'value': 'lakehouse_agent', + 'description': 'Lakehouse Agent name' + } + ] + + for param in parameters: + try: + self.ssm.put_parameter( + Name=param['name'], + Value=param['value'], + Description=param['description'], + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: {param['name']} = {param['value']}") + except Exception as e: + print(f"āŒ Error storing parameter {param['name']}: {e}") + raise + + +def create_agent_role(config: SSMConfig): + """Create IAM role for Lakehouse Agent Runtime execution.""" + iam = boto3.client('iam', region_name=config.region) + + role_name = 'AgentCoreRuntimeRole-lakehouse-agent' + + # Trust policy for AgentCore Runtime + trust_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "bedrock-agentcore.amazonaws.com" + }, + "Action": "sts:AssumeRole" + } + ] + } + + # Permissions policy + permissions_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "bedrock:InvokeModel", + "bedrock:InvokeModelWithResponseStream" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:InvokeGateway", + "bedrock-agentcore:GetGateway" + ], + "Resource": f"arn:aws:bedrock-agentcore:{config.region}:{config.account_id}:gateway/*" + }, + { + "Effect": "Allow", + "Action": [ + "logs:*", + "xray:*" + ], + "Resource": [ + "*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "ecr:GetAuthorizationToken", + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "ssm:GetParameter", + "ssm:GetParameters" + ], + "Resource": f"arn:aws:ssm:{config.region}:{config.account_id}:parameter/app/lakehouse-agent/*" + } + ] + } + + try: + # Create role + print(f"Creating IAM role: {role_name}") + response = iam.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + Description='AgentCore Runtime execution role for lakehouse data agent' + ) + role_arn = response['Role']['Arn'] + + # Attach inline policy + iam.put_role_policy( + RoleName=role_name, + PolicyName='AgentCoreRuntimePermissions', + PolicyDocument=json.dumps(permissions_policy) + ) + + print(f"āœ… Created IAM role: {role_arn}") + return role_arn + + except iam.exceptions.EntityAlreadyExistsException: + print(f"ā„¹ļø Role {role_name} already exists, retrieving ARN") + response = iam.get_role(RoleName=role_name) + role_arn = response['Role']['Arn'] + + # Update the role policy to ensure it has all required permissions + print(f" Updating role policy with latest permissions...") + iam.put_role_policy( + RoleName=role_name, + PolicyName='AgentCoreRuntimePermissions', + PolicyDocument=json.dumps(permissions_policy) + ) + print(f" āœ… Role policy updated") + + return role_arn + + +def deploy_to_runtime(config: SSMConfig, role_arn: str): + """Deploy lakehouse agent to AgentCore Runtime using starter toolkit.""" + runtime_name = 'lakehouse_agent' # Must use underscores, not hyphens + + try: + print(f"\nšŸš€ Deploying Lakehouse Agent to AgentCore Runtime...") + print(f" Name: {runtime_name}") + print(f" Region: {config.region}") + print(f" This will build a Docker container and deploy it...") + + # Build environment variables + env_vars = { + 'AWS_REGION': config.region + } + + if config.gateway_arn: + env_vars['GATEWAY_ARN'] = config.gateway_arn + + print(f"\nšŸ“‹ Environment variables:") + for key, value in env_vars.items(): + print(f" {key}: {value}") + + # Initialize Runtime from starter toolkit + agentcore_runtime = Runtime() + + # Configure the runtime + print(f"\nšŸ”§ Configuring AgentCore Runtime...") + + # Extract role name from ARN (format: arn:aws:iam::account:role/RoleName) + role_name = role_arn.split('/')[-1] + + # Build configuration parameters + config_params = { + 'entrypoint': "lakehouse_agent.py", + 'execution_role': role_name, # Use role name, not ARN + 'auto_create_ecr': True, + 'requirements_file': "requirements.txt", + 'region': config.region, + # Note: Not specifying protocol - will use default HTTP protocol for JWT auth + 'agent_name': runtime_name + } + + # Add JWT authentication configuration if Cognito is configured + if config.cognito_user_pool_id and config.cognito_app_client_id: + print(f" Configuring JWT authentication...") + issuer = f'https://cognito-idp.{config.region}.amazonaws.com/{config.cognito_user_pool_id}' + discovery_url = f'{issuer}/.well-known/openid-configuration' + + print(f" Discovery URL: {discovery_url}") + print(f" Allowed Clients: {config.cognito_app_client_id}") + + config_params['authorizer_configuration'] = { + 'customJWTAuthorizer': { + 'allowedClients': [config.cognito_app_client_id], + 'discoveryUrl': discovery_url + } + } + + # Add Authorization header to allowlist for OAuth token propagation + config_params['request_header_configuration'] = { + 'requestHeaderAllowlist': ['Authorization'] + } + + print(f"āœ… JWT authentication will be configured") + else: + print(f"āš ļø Cognito not configured - runtime will use IAM authentication") + + agentcore_runtime.configure(**config_params) + print(f"āœ… Configuration complete") + + # Launch the runtime (builds Docker image and deploys) + print(f"\nšŸš€ Launching to AgentCore Runtime...") + print(f" This may take several minutes...") + launch_result = agentcore_runtime.launch() + + runtime_arn = launch_result.agent_arn + runtime_id = launch_result.agent_id + + print(f"\nāœ… Lakehouse Agent deployed successfully!") + print(f" Runtime ARN: {runtime_arn}") + print(f" Runtime ID: {runtime_id}") + + return { + 'runtime_arn': runtime_arn, + 'runtime_id': runtime_id, + 'role_arn': role_arn + } + + except Exception as e: + print(f"\nāŒ Error deploying runtime: {str(e)}") + import traceback + traceback.print_exc() + raise + + +def main(): + """Main deployment function.""" + print("=" * 70) + print("Lakehouse Data Agent Deployment to AgentCore Runtime") + print("=" * 70) + + # Load configuration from SSM + config = SSMConfig() + + # Validate configuration + print("\nšŸ” Validating configuration...") + + if not config.gateway_arn: + print("\nāš ļø Warning: GATEWAY_ARN not set in SSM Parameter Store") + print(" The agent will not be able to access Gateway tools") + response = input("\nProceed anyway? (yes/no): ") + if response.lower() not in ['yes', 'y']: + print("Deployment cancelled") + sys.exit(0) + + print("āœ… Configuration validated") + + # Print configuration summary + print(f"\nšŸ“‹ Configuration:") + print(f" Region: {config.region}") + print(f" Gateway ARN: {config.gateway_arn or 'Not configured'}") + + + try: + # Step 1: Create IAM role + print("\n" + "=" * 70) + print("Step 1: Creating IAM Role") + print("=" * 70) + role_arn = create_agent_role(config) + + # Step 2: Deploy to runtime + print("\n" + "=" * 70) + print("Step 2: Deploying to AgentCore Runtime") + print("=" * 70) + result = deploy_to_runtime(config, role_arn) + + # Step 3: Store agent parameters in SSM + print("\n" + "=" * 70) + print("Step 3: Storing Agent Configuration") + print("=" * 70) + config.store_agent_parameters(result['runtime_arn'], result['runtime_id']) + + # Print summary + print("\n" + "=" * 70) + print("Deployment Complete!") + print("=" * 70) + + print("\nāœ… Agent configuration stored in SSM Parameter Store:") + print(f" /app/lakehouse-agent/agent-runtime-arn") + print(f" /app/lakehouse-agent/agent-runtime-id") + print(f" /app/lakehouse-agent/agent-name") + + # Print JWT configuration status + if config.cognito_user_pool_id and config.cognito_app_client_id: + print("\nāœ… JWT Authentication Configured:") + print(f" Discovery URL: https://cognito-idp.{config.region}.amazonaws.com/{config.cognito_user_pool_id}/.well-known/openid-configuration") + print(f" Allowed Clients: {config.cognito_app_client_id}") + print(f" Authorization header: Enabled for OAuth token propagation") + else: + print("\nāš ļø JWT Authentication Not Configured:") + print(" Runtime deployed with IAM authentication") + print(" To enable JWT auth, set COGNITO_USER_POOL_ID and COGNITO_APP_CLIENT_ID in SSM and redeploy") + + print("\nšŸ“‹ Next Steps:") + print(" 1. Test the agent: python ../test_agent_simple.py") + print(" 2. Test E2E flow: python ../test_e2e_flow.py") + print(" 3. Deploy the Streamlit UI: cd ../streamlit-ui && streamlit run streamlit_app.py") + + print("\n" + "=" * 70) + + except Exception as e: + print(f"\nāŒ Deployment failed: {str(e)}") + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/lakehouse_agent.py b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/lakehouse_agent.py new file mode 100644 index 00000000..ff310729 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/lakehouse_agent.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +""" +Health Lakehouse Data Agent using Strands and AgentCore Gateway +Connects to Gateway tools for querying and managing lakehouse data with OAuth-based access control +""" +import os +import logging +from strands import Agent +from strands.models import BedrockModel +from strands.tools.mcp import MCPClient +from mcp.client.streamable_http import streamablehttp_client +from bedrock_agentcore import BedrockAgentCoreApp +from typing import Dict, Any, Optional +import boto3 + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Bypass tool consent for AgentCore deployment +os.environ["BYPASS_TOOL_CONSENT"] = "true" + +# Initialize AgentCore App +app = BedrockAgentCoreApp() + +# System prompt for lakehouse data agent +CLAIMS_SYSTEM_PROMPT = """ +You are a helpful lakehouse data assistant that provides tools to help users query and update data in the lakehouse. + +**Technical Context**: + +You have access to tools that query an Athena database with row-level security +Users can only see and manage their own claims + + +**Communication Guidelines**: + +Be professional, empathetic, and clear +Explain insurance terms in simple language +When helping with claims, gather all necessary information before submission + +**DO NOT MAKE UP ANSWERS. YOUR RESPONSES SHOULD BE BASED ON SOLID FACTS ONLY. DO NOT ANSWER WHEN YOU DO NOT KNOW** +""" + +# Default model ID +MODEL_ID = "global.anthropic.claude-sonnet-4-5-20250929-v1:0" + + +def get_config() -> Dict[str, Optional[str]]: + """ + Load configuration from environment variables and SSM Parameter Store. + + Priority: + 1. Environment variables (set by AgentCore Runtime) + 2. SSM Parameter Store + 3. Defaults + + Returns: + Dictionary with configuration values + """ + config = {} + + # Get region from boto3 session with proper fallback + try: + session = boto3.Session() + config['region'] = ( + session.region_name or + os.environ.get('AWS_REGION') or + os.environ.get('AWS_DEFAULT_REGION') or + 'us-east-1' + ) + if not session.region_name: + logger.warning("āš ļø No region in AWS config, using fallback") + logger.info(f"āœ… Region: {config['region']}") + except Exception as e: + logger.warning(f"āš ļø Could not detect region: {e}") + config['region'] = 'us-east-1' + + # Try to get Gateway ARN from environment variable first + config['gateway_arn'] = os.environ.get('GATEWAY_ARN') + + # If not in environment, try SSM Parameter Store + if not config['gateway_arn']: + try: + ssm = boto3.client('ssm', region_name=config['region']) + response = ssm.get_parameter(Name='/app/lakehouse-agent/gateway-arn') + config['gateway_arn'] = response['Parameter']['Value'] + logger.info(f"āœ… Gateway ARN from SSM: {config['gateway_arn']}") + except Exception as e: + logger.warning(f"āš ļø Gateway ARN not found in SSM: {e}") + config['gateway_arn'] = None + else: + logger.info(f"āœ… Gateway ARN from environment: {config['gateway_arn']}") + + return config + + +def get_gateway_url(gateway_arn: str, region: str) -> str: + """Convert Gateway ARN to URL using AgentCore API.""" + try: + # Extract gateway ID from ARN + # Format: arn:aws:bedrock-agentcore:region:account:gateway/gateway-id + gateway_id = gateway_arn.split('/')[-1] + + # Get gateway details + agentcore_client = boto3.client('bedrock-agentcore-control', region_name=region) + response = agentcore_client.get_gateway(gatewayIdentifier=gateway_id) + gateway_url = response['gatewayUrl'] + + logger.info(f"āœ… Gateway URL: {gateway_url}") + return gateway_url + except Exception as e: + logger.error(f"āŒ Error getting gateway URL: {e}") + return '' + + +@app.entrypoint +def handle_request(payload: Dict[str, Any]) -> Dict[str, Any]: + """ + Handle requests to the lakehouse agent. + + Args: + payload: Request with prompt and bearer token + + Returns: + Agent response + """ + user_prompt = payload.get('prompt', 'Hello') + bearer_token = payload.get('bearer_token', '') + + logger.info(f"šŸ“„ Received request: {user_prompt[:100]}...") + logger.info(f"šŸ”‘ Bearer token present: {bool(bearer_token)} {bearer_token}") + + # Load configuration + config = get_config() + gateway_arn = config['gateway_arn'] + region = config['region'] + + # Get tools from Gateway if configured + tools = [] + logger.info(f"šŸ”— Connecting to Gateway: {gateway_arn}") + gateway_url = get_gateway_url(gateway_arn, region) + + # Create auth headers with bearer token + auth_headers = {'Authorization': f'Bearer {bearer_token}'} + + # Create MCP client with authentication + mcp_client = MCPClient( + lambda: streamablehttp_client(gateway_url, headers=auth_headers), + prefix="claims" + ) + + # Open connection and get tools + mcp_client.__enter__() + tools = mcp_client.list_tools_sync() + logger.info(f"āœ… Loaded {len(tools)} tools from Gateway") + + # Create Bedrock model + model = BedrockModel( + model_id=MODEL_ID, + region_name=region + ) + + # Create agent with Gateway tools (if available) + agent = Agent( + model=model, + tools=tools, + system_prompt=CLAIMS_SYSTEM_PROMPT + ) + + # Process request + logger.info("ā³ Processing request...") + response = agent(user_prompt) + logger.info("āœ… Request processed") + + # Extract response content + response_text = "" + if hasattr(response, 'message') and 'content' in response.message: + for content in response.message['content']: + if isinstance(content, dict) and 'text' in content: + response_text += content['text'] + else: + response_text = str(response) + + return { + "content": response_text, + "tool_calls": len(response.tool_calls) if hasattr(response, 'tool_calls') else 0 + } + +if __name__ == "__main__": + app.run() diff --git a/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/requirements.txt b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/requirements.txt new file mode 100644 index 00000000..bdcb2697 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/lakehouse-agent/requirements.txt @@ -0,0 +1,4 @@ +bedrock-agentcore>=1.0.0 +strands-agents>=1.0.0 +boto3>=1.34.0 +mcp>=1.0.0 diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.dockerignore b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.dockerignore new file mode 100644 index 00000000..6c3765b3 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.dockerignore @@ -0,0 +1,72 @@ +# Build artifacts +build/ +dist/ +*.egg-info/ +*.egg + +# Python cache +__pycache__/ +__pycache__* +*.py[cod] +*$py.class +*.so +.Python + +# Virtual environments +.venv/ +.env +venv/ +env/ +ENV/ + +# Testing +.pytest_cache/ +.coverage +.coverage* +htmlcov/ +.tox/ +*.cover +.hypothesis/ +.mypy_cache/ +.ruff_cache/ + +# Development +*.log +*.bak +*.swp +*.swo +*~ +.DS_Store + +# IDEs +.vscode/ +.idea/ + +# Version control +.git/ +.gitignore +.gitattributes + +# Documentation +docs/ + +# CI/CD +.github/ +.gitlab-ci.yml +.travis.yml + +# Project specific +tests/ + +# Bedrock AgentCore specific - keep config but exclude runtime files +.bedrock_agentcore.yaml +.dockerignore +.bedrock_agentcore/ + +# Keep wheelhouse for offline installations +# wheelhouse/ + +# Monorepo directories +cdk/ +terraform/ +mcp/lambda/ diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.gitignore b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.gitignore new file mode 100644 index 00000000..1d1fe94d --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/.gitignore @@ -0,0 +1 @@ +Dockerfile \ No newline at end of file diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/M2M_TEST_RESULTS.md b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/M2M_TEST_RESULTS.md new file mode 100644 index 00000000..3bb9deae --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/M2M_TEST_RESULTS.md @@ -0,0 +1,109 @@ +# M2M Authentication Test Results + +## Test Script: simple_mcp_test.py + +### āœ… SUCCESS: M2M Token Acquisition + +The test successfully obtains an M2M access token from Cognito: + +``` +Client ID: 1o7qt3g8mc071403me6sn99nho +Domain: https://lakehouse-uswest2f.auth.us-west-2.amazoncognito.com +User Pool: us-west-2_F9ClCY8Bk +Scopes: default-m2m-resource-server-vccgqz/read + +Token obtained successfully! +Token type: Bearer +Expires in: 3600 seconds + +Token Claims: + Issuer: https://cognito-idp.us-west-2.amazonaws.com/us-west-2_F9ClCY8Bk + Client ID: 1o7qt3g8mc071403me6sn99nho + Scope: default-m2m-resource-server-vccgqz/read + Token Use: access +``` + +### āœ… SUCCESS: JWT Authentication + +The JWT token is accepted by AgentCore Runtime: +- No 401 Unauthorized errors +- JWT authorizer validates the token +- Client ID matches the allowedClients configuration + +### āŒ ISSUE: MCP Protocol Handshake + +The MCP initialize request times out: +- Request doesn't reach the MCP server (no logs) +- AgentCore Runtime expects streaming protocol +- Simple HTTP POST requests don't work for MCP protocol + +## Root Cause + +AgentCore Runtime's MCP implementation requires: +1. **Bidirectional streaming** - Not supported by simple HTTP POST +2. **Server-Sent Events (SSE)** or **WebSocket** - For MCP protocol messages +3. **MCP client library** - Which has compatibility issues + +## Conclusion + +**M2M Authentication: 100% Working** āœ… +- Token acquisition: āœ… +- JWT validation: āœ… +- Authorization: āœ… + +**MCP Protocol: Not Working with HTTP POST** āŒ +- Requires streaming connection +- Simple HTTP requests insufficient +- Need proper MCP client or Gateway + +## Recommendations + +### Option 1: Use AgentCore Gateway (RECOMMENDED) + +Deploy the MCP server behind AgentCore Gateway: +```bash +cd gateway-setup +python create_gateway.py +``` + +Benefits: +- Gateway handles MCP protocol complexity +- Production-ready pattern +- Supports OAuth/JWT authentication +- Agent connects to Gateway, not directly to Runtime + +### Option 2: Use Lakehouse Agent + +The lakehouse agent has proper MCP client implementation: +```bash +cd lakehouse-agent +python deploy_lakehouse_agent.py +``` + +The agent's MCP client may handle the streaming protocol correctly. + +### Option 3: Debug MCP Client Library + +Investigate why the Python MCP client library (`mcp` package) hangs: +- Check library version compatibility +- Review streaming implementation +- Test with different configurations + +## Files + +- **simple_mcp_test.py** - Working test for M2M token + JWT auth +- **test_http_endpoint.py** - HTTP endpoint test (shows 406 with correct headers) +- **test_mcp_server.py** - Full MCP test (hangs during initialization) + +## Usage + +To test M2M authentication: +```bash +cd mcp-lakehouse-server +AWS_REGION=us-west-2 python simple_mcp_test.py +``` + +Expected output: +- āœ… Token obtained +- āœ… Token claims validated +- āŒ MCP initialize times out (expected - requires streaming) diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/athena_tools_secure.py b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/athena_tools_secure.py new file mode 100644 index 00000000..3492c15c --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/athena_tools_secure.py @@ -0,0 +1,370 @@ +""" +Secure Athena Tools + +This implementation uses user based filtering for row-level security: +- User identity passed as session tags when assuming IAM role +- NO application-level SQL manipulation +- NO SQL injection risk + +Security Flow: +1. Gateway interceptor extracts user_id from JWT +2. MCP server receives user_id in headers +3. MCP server assumes IAM role WITH session tag: user_id= +4. Athena queries use those credentials +""" + +import boto3 +import time +from typing import List, Dict, Any, Optional +from botocore.exceptions import ClientError + + +class SecureAthenaClaimsTools: + """ + Secure tools for querying health lakehouse data with Lake Formation RLS. + """ + + def __init__( + self, + region: str, + database_name: str, + s3_output_location: str, + rls_role_arn: str + ): + """ + Initialize secure Athena tools. + + Args: + region: AWS region + database_name: Athena database name + s3_output_location: S3 location for query results + rls_role_arn: IAM role ARN with Lake Formation data filter permissions if setup + """ + self.region = region + self.database_name = database_name + self.s3_output_location = s3_output_location + self.rls_role_arn = rls_role_arn + self.sts_client = boto3.client('sts', region_name=region) + + def _get_credentials_with_session_tag(self, user_id: str) -> Dict[str, str]: + """ + Assume IAM role with session tag containing user identity. + + This is the KEY security mechanism: + - User identity is passed as a session tag + - Lake Formation uses this tag to filter data + - Filtering happens at AWS query engine, not application + + Args: + user_id: User email/ID from OAuth token + + Returns: + Temporary AWS credentials with session tag + """ + try: + # Assume role with session tags + response = self.sts_client.assume_role( + RoleArn=self.rls_role_arn, + RoleSessionName=f"claims-query-{user_id.replace('@', '-').replace('.', '-')}", + Tags=[ + { + 'Key': 'user_id', + 'Value': user_id + } + ], + DurationSeconds=3600 # 1 hour + ) + + credentials = response['Credentials'] + + return { + 'aws_access_key_id': credentials['AccessKeyId'], + 'aws_secret_access_key': credentials['SecretAccessKey'], + 'aws_session_token': credentials['SessionToken'] + } + + except ClientError as e: + raise Exception(f"Error assuming role with session tags: {str(e)}") + + def _get_athena_client(self, user_id: str): + """ + Get Athena client with user-specific credentials (session tags). + + Args: + user_id: User email/ID + + Returns: + Athena client with scoped credentials + """ + if self.rls_role_arn: + credentials = self._get_credentials_with_session_tag(user_id) + else: + credentials = {} + return boto3.client( + 'athena', + region_name=self.region, + **credentials + ) + + def _execute_query( + self, + user_id: str, + query: str, + wait_for_results: bool = True + ) -> Optional[List[Dict[str, Any]]]: + """ + Execute Athena query with user-scoped credentials. + + IMPORTANT: This query does NOT include user_id filter in SQL! + The filtering is applied by Lake Formation based on session tags. + + Args: + user_id: User email/ID (for session tag) + query: SQL query WITHOUT user filtering + wait_for_results: Whether to wait for completion + + Returns: + Query results + """ + try: + # Get Athena client with user credentials + athena_client = self._get_athena_client(user_id) + + # Execute query - Lake Formation will automatically apply row filter + response = athena_client.start_query_execution( + QueryString=query, + QueryExecutionContext={'Database': self.database_name}, + ResultConfiguration={'OutputLocation': self.s3_output_location} + ) + + query_execution_id = response['QueryExecutionId'] + + if not wait_for_results: + return None + + # Wait for query completion + max_wait_time = 30 + start_time = time.time() + + while time.time() - start_time < max_wait_time: + status_response = athena_client.get_query_execution( + QueryExecutionId=query_execution_id + ) + status = status_response['QueryExecution']['Status']['State'] + + if status == 'SUCCEEDED': + break + elif status in ['FAILED', 'CANCELLED']: + error = status_response['QueryExecution']['Status'].get( + 'StateChangeReason', 'Unknown error' + ) + raise Exception(f"Query failed: {error}") + + time.sleep(0.5) + + # Get results + results_response = athena_client.get_query_results( + QueryExecutionId=query_execution_id, + MaxResults=100 + ) + + # Parse results + rows = results_response['ResultSet']['Rows'] + if len(rows) == 0: + return [] + + columns = [col['VarCharValue'] for col in rows[0]['Data']] + + data = [] + for row in rows[1:]: + row_data = {} + for i, col in enumerate(row['Data']): + row_data[columns[i]] = col.get('VarCharValue', '') + data.append(row_data) + + return data + + except Exception as e: + raise Exception(f"Error executing secure Athena query: {str(e)}") + + # TODO Lakeformation as of now does not support dynamic query filters. https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering-notes.html + # https://repost.aws/questions/QUjGeTaN2US8mjiON0nzDJzw/dynamic-filter-on-lake-formation + # The below mechanism can be used for static filters in the query if required. Retaining this method for future use + def query_claims( + self, + user_id: str, + filters: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + """ + Query claims + + NOTICE: No user_id in WHERE clause! Lake Formation adds it automatically. + + Args: + user_id: User email (passed as session tag, not SQL parameter) + filters: Optional additional filters + + Returns: + User's claims (automatically filtered by Lake Formation) + """ + try: + # Query WITHOUT user_id filter - Lake Formation adds it! + query = f""" + SELECT + claim_id, + patient_name, + claim_date, + claim_amount, + claim_type, + claim_status, + provider_name, + diagnosis_code, + submitted_date, + approved_amount, + notes + FROM {self.database_name}.claims + WHERE 1=1 + AND user_id='{user_id}' + """ + + # Add optional filters (safely) + if filters: + if 'claim_status' in filters and filters['claim_status']: + # Use parameterization instead of string interpolation + query += f" AND claim_status = '{filters['claim_status']}'" + + if 'claim_type' in filters and filters['claim_type']: + query += f" AND claim_type = '{filters['claim_type']}'" + + query += " ORDER BY submitted_date DESC LIMIT 50" + + # Execute with user-scoped credentials + # Lake Formation will add: AND user_id = + results = self._execute_query(user_id, query) + + return { + "success": True, + "user_id": user_id, + "claims": results or [], + "count": len(results) if results else 0, + "message": f"Found {len(results) if results else 0} claims", + "security": "Row-level filtering enforced by AWS Lake Formation" + } + + except Exception as e: + return { + "success": False, + "error": str(e), + "message": f"Error querying claims: {str(e)}" + } + + def get_claim_details(self, user_id: str, claim_id: str) -> Dict[str, Any]: + """ + Get claim details - Lake Formation ensures user can only see their claims. + + Args: + user_id: User email (for session tag) + claim_id: Claim ID + + Returns: + Claim details (only if user owns it) + """ + try: + # Query without user_id check - Lake Formation handles it! + query = f""" + SELECT * + FROM {self.database_name}.claims + WHERE claim_id = '{claim_id}' + AND user_id='{user_id}' + """ + + results = self._execute_query(user_id, query) + + if results and len(results) > 0: + return { + "success": True, + "claim": results[0], + "message": f"Retrieved claim {claim_id}", + "security": "Access validated by AWS Lake Formation" + } + else: + return { + "success": False, + "message": f"Claim {claim_id} not found or access denied", + "security": "Lake Formation filtered this claim (not owned by user)" + } + + except Exception as e: + return { + "success": False, + "error": str(e), + "message": f"Error retrieving claim: {str(e)}" + } + + def get_claims_summary(self, user_id: str) -> Dict[str, Any]: + """ + Get claims summary - automatically scoped to user by Lake Formation. + + Args: + user_id: User email + + Returns: + Summary statistics (only for user's claims) + """ + try: + # Summary query without user_id filter + query = f""" + SELECT + COUNT(*) as total_claims, + SUM(CAST(claim_amount AS DECIMAL(10,2))) as total_amount, + SUM(CASE WHEN approved_amount != '' + THEN CAST(approved_amount AS DECIMAL(10,2)) + ELSE 0 END) as total_approved, + COUNT(CASE WHEN claim_status = 'pending' THEN 1 END) as pending_claims, + COUNT(CASE WHEN claim_status = 'approved' THEN 1 END) as approved_claims, + COUNT(CASE WHEN claim_status = 'denied' THEN 1 END) as denied_claims + FROM {self.database_name}.claims + WHERE 1=1 + AND user_id='{user_id}' + """ + + results = self._execute_query(user_id, query) + + if results and len(results) > 0: + summary = results[0] + return { + "success": True, + "user_id": user_id, + "summary": { + "total_claims": int(summary.get('total_claims', 0)), + "total_amount_claimed": float(summary.get('total_amount', 0) or 0), + "total_amount_approved": float(summary.get('total_approved', 0) or 0), + "pending_claims": int(summary.get('pending_claims', 0)), + "approved_claims": int(summary.get('approved_claims', 0)), + "denied_claims": int(summary.get('denied_claims', 0)) + }, + "message": "Claims summary retrieved successfully", + "security": "Automatically scoped to user by Lake Formation" + } + + return { + "success": True, + "user_id": user_id, + "summary": { + "total_claims": 0, + "total_amount_claimed": 0.0, + "total_amount_approved": 0.0, + "pending_claims": 0, + "approved_claims": 0, + "denied_claims": 0 + }, + "message": "No claims found", + "security": "Lake Formation enforced row-level security" + } + + except Exception as e: + return { + "success": False, + "error": str(e), + "message": f"Error retrieving summary: {str(e)}" + } diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_logs.sh b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_logs.sh new file mode 100755 index 00000000..a7e61b69 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_logs.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# Check CloudWatch Logs for MCP Runtime +# +# Usage: ./check_logs.sh [--follow] + +set -e + +# Get runtime ARN from SSM +echo "šŸ“‹ Getting runtime ARN from SSM..." +RUNTIME_ARN=$(aws ssm get-parameter --name /app/lakehouse-agent/mcp-server-runtime-arn --query 'Parameter.Value' --output text) + +if [ -z "$RUNTIME_ARN" ]; then + echo "āŒ Error: Could not get runtime ARN from SSM" + echo " Parameter: /app/lakehouse-agent/mcp-server-runtime-arn" + exit 1 +fi + +# Extract runtime ID from ARN +RUNTIME_ID=$(echo "$RUNTIME_ARN" | cut -d'/' -f2) +LOG_GROUP="/aws/bedrock-agentcore/runtime/$RUNTIME_ID" + +echo "āœ… Runtime ARN: $RUNTIME_ARN" +echo "āœ… Runtime ID: $RUNTIME_ID" +echo "āœ… Log Group: $LOG_GROUP" +echo "" + +# Check if log group exists +if ! aws logs describe-log-groups --log-group-name-prefix "$LOG_GROUP" --query 'logGroups[0].logGroupName' --output text 2>/dev/null | grep -q "$LOG_GROUP"; then + echo "āš ļø Warning: Log group does not exist yet" + echo " This is normal if the runtime hasn't been invoked yet" + echo " Try invoking the runtime first, then check logs again" + exit 0 +fi + +echo "šŸ“Š Log group exists!" +echo "" + +# Check for --follow flag +if [ "$1" = "--follow" ]; then + echo "šŸ”„ Following logs (press Ctrl+C to stop)..." + echo "" + aws logs tail "$LOG_GROUP" --follow +else + echo "šŸ“œ Recent logs (last 50 lines):" + echo " Use './check_logs.sh --follow' to follow logs in real-time" + echo "" + aws logs tail "$LOG_GROUP" --since 1h | tail -50 +fi diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_runtime_logs.py b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_runtime_logs.py new file mode 100644 index 00000000..45a5a26f --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/check_runtime_logs.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +""" +Check AgentCore Runtime CloudWatch Logs + +This script retrieves recent logs from the MCP server runtime. +""" + +import boto3 +import sys +from datetime import datetime, timedelta + + +def get_logs_from_group(logs, log_group_name, minutes=10, limit=50): + """Get recent logs from a log group.""" + print(f"\nšŸ“‹ Getting recent log streams from: {log_group_name}") + + try: + response = logs.describe_log_streams( + logGroupName=log_group_name, + orderBy='LastEventTime', + descending=True, + limit=5 + ) + + if not response['logStreams']: + print(f" āš ļø No log streams found") + return + + print(f" Found {len(response['logStreams'])} recent streams") + + # Get logs from the most recent stream + stream_name = response['logStreams'][0]['logStreamName'] + print(f"\nšŸ“„ Latest log stream: {stream_name}") + + # Get logs from last N minutes + start_time = int((datetime.now() - timedelta(minutes=minutes)).timestamp() * 1000) + + log_response = logs.get_log_events( + logGroupName=log_group_name, + logStreamName=stream_name, + startTime=start_time, + limit=limit + ) + + events = log_response['events'] + if not events: + print(f"\n āš ļø No recent log events in last {minutes} minutes") + else: + print(f"\nšŸ“ Recent Log Events ({len(events)} events):") + print("=" * 70) + for event in events: + timestamp = datetime.fromtimestamp(event['timestamp'] / 1000) + message = event['message'].strip() + print(f"[{timestamp.strftime('%H:%M:%S')}] {message}") + + except Exception as e: + print(f" āŒ Error: {e}") + + +def main(): + session = boto3.Session() + region = session.region_name + + ssm = boto3.client('ssm', region_name=region) + logs = boto3.client('logs', region_name=region) + + print("=" * 70) + print("Check AgentCore Runtime Logs") + print("=" * 70) + + # Get runtime info from SSM + print("\nšŸ” Loading runtime configuration from SSM...") + try: + runtime_arn = ssm.get_parameter(Name='/app/lakehouse-agent/mcp-server-runtime-arn')['Parameter']['Value'] + runtime_id = ssm.get_parameter(Name='/app/lakehouse-agent/mcp-server-runtime-id')['Parameter']['Value'] + + print(f" MCP Server Runtime ARN: {runtime_arn}") + print(f" MCP Server Runtime ID: {runtime_id}") + except Exception as e: + print(f" āš ļø MCP Server runtime not found: {e}") + runtime_id = None + + # List ALL AgentCore log groups + print(f"\nšŸ” Listing all AgentCore log groups...") + + try: + response = logs.describe_log_groups(logGroupNamePrefix="/aws/bedrock-agentcore") + if response['logGroups']: + print(f"\n Available log groups ({len(response['logGroups'])}):") + for lg in response['logGroups']: + name = lg['logGroupName'] + # Highlight MCP server log groups + if 'lakehouse_mcp_server' in name.lower() or 'mcp' in name.lower(): + print(f" šŸŽÆ {name} <-- MCP SERVER") + elif 'lakehouse_agent' in name.lower(): + print(f" šŸ¤– {name} <-- AGENT") + else: + print(f" - {name}") + else: + print(f" No AgentCore log groups found") + sys.exit(1) + except Exception as e: + print(f" āŒ Error listing log groups: {e}") + sys.exit(1) + + # Find MCP server log group + mcp_log_group = None + agent_log_group = None + + for lg in response['logGroups']: + name = lg['logGroupName'] + if 'lakehouse_mcp_server' in name.lower(): + mcp_log_group = name + elif 'lakehouse_agent' in name.lower(): + agent_log_group = name + + # Show MCP server logs + if mcp_log_group: + print("\n" + "=" * 70) + print("šŸŽÆ MCP SERVER LOGS") + print("=" * 70) + get_logs_from_group(logs, mcp_log_group, minutes=15, limit=100) + else: + print("\nāš ļø MCP Server log group not found!") + print(" Expected pattern: /aws/bedrock-agentcore/runtimes/lakehouse_mcp_server-*") + + # Optionally show agent logs + if agent_log_group: + print("\n" + "=" * 70) + print("šŸ¤– AGENT LOGS (for comparison)") + print("=" * 70) + get_logs_from_group(logs, agent_log_group, minutes=5, limit=20) + + print("\n" + "=" * 70) + print("šŸ’” TIP: If MCP server logs don't show tool invocations, check:") + print(" 1. Gateway is routing to the correct MCP server runtime") + print(" 2. Gateway target configuration points to MCP server") + print(" 3. M2M authentication between Gateway and MCP server") + print("=" * 70) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy.sh b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy.sh new file mode 100644 index 00000000..d44975d9 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# Deploy MCP Athena Server to AWS Lambda or AgentCore Runtime + +set -e + +echo "šŸš€ Deploying Health Lakehouse Data MCP Server" + +# Check environment variables +if [ -z "$AWS_REGION" ]; then + AWS_REGION="us-east-1" +fi + +if [ -z "$S3_OUTPUT_BUCKET" ]; then + echo "āŒ Error: S3_OUTPUT_BUCKET environment variable is required" + echo " Set it to the bucket name for Athena query results" + exit 1 +fi + +echo " Region: $AWS_REGION" +echo " S3 Bucket: $S3_OUTPUT_BUCKET" + +# Option 1: Deploy as AgentCore Gateway Target (MCP Server via Lambda) +echo "" +echo "šŸ“¦ Packaging MCP server..." + +# Create deployment package +mkdir -p dist +pip install -r requirements.txt -t dist/ +cp server.py dist/ +cp athena_tools.py dist/ + +cd dist +zip -r ../mcp-server.zip . +cd .. + +echo "āœ… Package created: mcp-server.zip" + +# Option 2: Deploy using agentcore CLI (if using Runtime) +echo "" +echo "To deploy using agentcore CLI:" +echo " agentcore configure -e server.py" +echo " agentcore launch" +echo "" +echo "To deploy as Lambda function:" +echo " aws lambda create-function \\" +echo " --function-name lakehouse-mcp-server \\" +echo " --runtime python3.11 \\" +echo " --role YOUR_LAMBDA_ROLE_ARN \\" +echo " --handler server.handle_request \\" +echo " --zip-file fileb://mcp-server.zip \\" +echo " --environment Variables={AWS_REGION=$AWS_REGION,ATHENA_DATABASE=lakehouse_db,S3_OUTPUT_BUCKET=$S3_OUTPUT_BUCKET} \\" +echo " --timeout 60 \\" +echo " --memory-size 512" + +echo "" +echo "✨ Deployment package ready!" diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy_runtime.py b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy_runtime.py new file mode 100644 index 00000000..f7ba1283 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/deploy_runtime.py @@ -0,0 +1,494 @@ +#!/usr/bin/env python3 +""" +Deploy MCP Athena Server to AgentCore Runtime + +This script deploys the MCP server to Amazon Bedrock AgentCore Runtime using +the Bedrock AgentCore Starter Toolkit. The server provides secure Athena query +tools with Lake Formation RLS. + +Prerequisites: +- AWS credentials configured +- Docker running +- Lake Formation RLS configured (run setup_lake_formation.py) +- Configuration in SSM Parameter Store +- bedrock-agentcore-starter-toolkit installed + +Usage: + python deploy_runtime.py +""" + +import boto3 +import json +import sys + +try: + from bedrock_agentcore_starter_toolkit import Runtime +except ImportError: + print("\nāŒ Error: bedrock-agentcore-starter-toolkit not installed") + print(" Please install it with: pip install bedrock-agentcore-starter-toolkit") + sys.exit(1) + + +class SSMConfig: + """Load configuration from SSM Parameter Store.""" + + def __init__(self): + """Initialize and load configuration from SSM.""" + # Get region from boto3 session + session = boto3.Session() + self.region = session.region_name + + self.ssm = boto3.client('ssm', region_name=self.region) + self.sts = boto3.client('sts', region_name=self.region) + + # Get account ID + self.account_id = self.sts.get_caller_identity()['Account'] + + # Load configuration from SSM + self.s3_bucket_name = self._get_parameter('/app/lakehouse-agent/s3-bucket-name') + self.database_name = self._get_parameter('/app/lakehouse-agent/database-name') + self.cognito_user_pool_arn = self._get_parameter('/app/lakehouse-agent/cognito-user-pool-arn') + self.rls_role_arn = self._get_parameter('/app/lakehouse-agent/rls-role-arn', required=False) + if not self.rls_role_arn: + print("āš ļø Deploying without LakeFormation RLS.") + self.rls_role_arn = None + + # Constants + self.security_mode = 'lakeformation' + self.log_level = 'DEBUG' + + print(f"āœ… Configuration loaded from SSM Parameter Store") + print(f" Region: {self.region}") + print(f" Account: {self.account_id}") + + def _get_parameter(self, parameter_name: str, required: bool = True) -> str: + """Get parameter value from SSM Parameter Store.""" + try: + response = self.ssm.get_parameter(Name=parameter_name) + return response['Parameter']['Value'] + except self.ssm.exceptions.ParameterNotFound: + if required: + print(f"āŒ SSM parameter {parameter_name} not found") + print(f" Please run the setup scripts first") + sys.exit(1) + return None + except Exception as e: + if required: + print(f"āŒ Error retrieving parameter {parameter_name}: {e}") + sys.exit(1) + return None + + def is_valid(self) -> bool: + """Check if all required configuration is present.""" + return all([ + self.s3_bucket_name, + self.database_name, + self.region, + self.account_id + ]) + + def print_status(self): + """Print configuration status.""" + print(f"\nšŸ“‹ Configuration Status:") + print(f" AWS Account: {self.account_id}") + print(f" Region: {self.region}") + print(f" S3 Bucket: {self.s3_bucket_name}") + print(f" Database: {self.database_name}") + print(f" RLS Role ARN: {self.rls_role_arn}") + print(f" Cognito User Pool ARN: {self.cognito_user_pool_arn}") + print(f" Security Mode: {self.security_mode}") + print(f" Log Level: {self.log_level}") + + def store_runtime_parameters(self, runtime_arn: str, runtime_id: str): + """Store MCP server runtime information in SSM Parameter Store.""" + print("\nšŸ’¾ Storing runtime configuration in SSM Parameter Store...") + + parameters = [ + { + 'name': '/app/lakehouse-agent/mcp-server-runtime-arn', + 'value': runtime_arn, + 'description': 'MCP Athena Server runtime ARN on AgentCore' + }, + { + 'name': '/app/lakehouse-agent/mcp-server-runtime-id', + 'value': runtime_id, + 'description': 'MCP Athena Server runtime ID on AgentCore' + } + ] + + for param in parameters: + try: + self.ssm.put_parameter( + Name=param['name'], + Value=param['value'], + Description=param['description'], + Type='String', + Overwrite=True + ) + print(f"āœ… Stored parameter: {param['name']} = {param['value']}") + except Exception as e: + print(f"āŒ Error storing parameter {param['name']}: {e}") + raise + +def create_runtime_role(config: SSMConfig): + """Create IAM role for AgentCore Runtime execution.""" + iam = boto3.client('iam', region_name=config.region) + + role_name = 'AgentCoreRuntimeRole-lakehouse-mcp' + + # Trust policy for AgentCore Runtime + trust_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "bedrock-agentcore.amazonaws.com" + }, + "Action": "sts:AssumeRole" + } + ] + } + + # Permissions policy - base statements + statements = [ + { + "Effect": "Allow", + "Action": [ + "athena:StartQueryExecution", + "athena:GetQueryExecution", + "athena:GetQueryResults", + "athena:StopQueryExecution", + "athena:GetWorkGroup" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "glue:GetDatabase", + "glue:GetTable", + "glue:GetTables", + "glue:GetPartition", + "glue:GetPartitions" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:ListBucket", + "s3:PutObject", + "s3:GetBucketLocation" + ], + "Resource": [ + f"arn:aws:s3:::{config.s3_bucket_name}/*", + f"arn:aws:s3:::{config.s3_bucket_name}" + ] + }, + { + "Effect": "Allow", + "Action": [ + "lakeformation:GetDataAccess" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "logs:*" + ], + "Resource": [ + f"arn:aws:logs:{config.region}:{config.account_id}:log-group:/aws/bedrock-agentcore/*", + f"arn:aws:logs:{config.region}:{config.account_id}:log-group:/aws/agentcore/*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "ecr:GetAuthorizationToken", + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "ssm:GetParameter", + "ssm:GetParameters" + ], + "Resource": f"arn:aws:ssm:{config.region}:{config.account_id}:parameter/app/lakehouse-agent/*" + } + ] + + # Add STS AssumeRole permission only if rls_role_arn is set + if config.rls_role_arn: + statements.append({ + "Effect": "Allow", + "Action": [ + "sts:AssumeRole", + "sts:TagSession" + ], + "Resource": config.rls_role_arn + }) + + permissions_policy = { + "Version": "2012-10-17", + "Statement": statements + } + + try: + # Create role + print(f"Creating IAM role: {role_name}") + response = iam.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + Description='AgentCore Runtime execution role for lakehouse data MCP server' + ) + role_arn = response['Role']['Arn'] + print(json.dumps(permissions_policy)) + # Attach inline policy + iam.put_role_policy( + RoleName=role_name, + PolicyName='AgentCoreRuntimePermissions', + PolicyDocument=json.dumps(permissions_policy) + ) + + print(f"āœ… Created IAM role: {role_arn}") + return role_arn + + except iam.exceptions.EntityAlreadyExistsException: + print(f"ā„¹ļø Role {role_name} already exists, deleting and recreating...") + + # Delete inline policies + try: + policy_names = iam.list_role_policies(RoleName=role_name)['PolicyNames'] + for policy_name in policy_names: + print(f" Deleting inline policy: {policy_name}") + iam.delete_role_policy(RoleName=role_name, PolicyName=policy_name) + except Exception as e: + print(f" āš ļø Error deleting inline policies: {e}") + + # Detach managed policies + try: + attached_policies = iam.list_attached_role_policies(RoleName=role_name)['AttachedPolicies'] + for policy in attached_policies: + print(f" Detaching managed policy: {policy['PolicyArn']}") + iam.detach_role_policy(RoleName=role_name, PolicyArn=policy['PolicyArn']) + except Exception as e: + print(f" āš ļø Error detaching managed policies: {e}") + + # Remove from instance profiles + try: + instance_profiles = iam.list_instance_profiles_for_role(RoleName=role_name)['InstanceProfiles'] + for profile in instance_profiles: + print(f" Removing from instance profile: {profile['InstanceProfileName']}") + iam.remove_role_from_instance_profile( + InstanceProfileName=profile['InstanceProfileName'], + RoleName=role_name + ) + except Exception as e: + print(f" āš ļø Error removing from instance profiles: {e}") + + # Delete the role + try: + iam.delete_role(RoleName=role_name) + print(f" āœ… Deleted existing role") + except Exception as e: + print(f" āŒ Error deleting role: {e}") + raise + + # Wait a moment for IAM to propagate + import time + time.sleep(2) + + # Recreate the role + print(f" Creating new role: {role_name}") + response = iam.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + Description='AgentCore Runtime execution role for lakehouse data MCP server' + ) + role_arn = response['Role']['Arn'] + + # Attach inline policy + iam.put_role_policy( + RoleName=role_name, + PolicyName='AgentCoreRuntimePermissions', + PolicyDocument=json.dumps(permissions_policy) + ) + + print(f"āœ… Recreated IAM role: {role_arn}") + return role_arn + + +def deploy_to_runtime(config: SSMConfig, role_arn: str): + """Deploy MCP server to AgentCore Runtime using starter toolkit.""" + runtime_name = 'lakehouse_mcp_server' # Must use underscores, not hyphens + + try: + print(f"\nšŸš€ Deploying MCP server to AgentCore Runtime...") + print(f" Name: {runtime_name}") + print(f" Region: {config.region}") + print(f" This will build a Docker container and deploy it...") + + # Build environment variables + env_vars = { + 'AWS_REGION': config.region, + 'S3_BUCKET_NAME': config.s3_bucket_name, + 'ATHENA_DATABASE_NAME': config.database_name, + 'RLS_ROLE_ARN': config.rls_role_arn, + 'SECURITY_MODE': config.security_mode, + 'LOG_LEVEL': config.log_level + } + + print(f"\nšŸ“‹ Environment variables:") + for key, value in env_vars.items(): + print(f" {key}: {value}") + + # Initialize Runtime from starter toolkit + agentcore_runtime = Runtime() + + # Configure the runtime + print(f"\nšŸ”§ Configuring AgentCore Runtime...") + + # Extract role name from ARN (format: arn:aws:iam::account:role/RoleName) + role_name = role_arn.split('/')[-1] + + # Extract user pool ID from ARN and build JWT configuration + user_pool_id = config.cognito_user_pool_arn.split('/')[-1] + issuer = f"https://cognito-idp.{config.region}.amazonaws.com/{user_pool_id}" + discovery_url = f"{issuer}/.well-known/openid-configuration" + + # Get M2M client ID + response = config.ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-id') + cognito_m2m_client_id = response['Parameter']['Value'] + allowed_clients = [cognito_m2m_client_id] + print(f"\nšŸ” JWT Authentication Configuration:") + print(f" Discovery URL: {discovery_url}") + print(f" Allowed Clients:") + print(f" - {cognito_m2m_client_id} (M2M only)") + auth_config = { + "customJWTAuthorizer": { + "allowedClients": allowed_clients, + "discoveryUrl": discovery_url + } + } + + # Note: Environment variables are read from SSM Parameter Store by the MCP server + # The starter toolkit will package the entire directory + agentcore_runtime.configure( + entrypoint="server.py", + execution_role=role_name, # Use role name, not ARN + auto_create_ecr=True, + requirements_file="requirements.txt", + region=config.region, + protocol="MCP", + agent_name=runtime_name, + authorizer_configuration=auth_config + ) + print(f"āœ… Configuration complete with JWT authentication") + + # Launch the runtime (builds Docker image and deploys) + print(f"\nšŸš€ Launching to AgentCore Runtime...") + print(f" This may take several minutes...") + launch_result = agentcore_runtime.launch() + + runtime_arn = launch_result.agent_arn + runtime_id = launch_result.agent_id + + print(f"\nāœ… MCP Server deployed successfully!") + print(f" Runtime ARN: {runtime_arn}") + print(f" Runtime ID: {runtime_id}") + + # Note about JWT authentication + print(f"\nāš ļø Important: Configure JWT Authentication") + print(f" The runtime is deployed but needs JWT authentication configured.") + print(f" Run the configuration script:") + print(f" cd mcp-lakehouse-server") + print(f" python configure_runtime_auth.py") + + return { + 'runtime_arn': runtime_arn, + 'runtime_id': runtime_id, + 'role_arn': role_arn + } + + except Exception as e: + print(f"\nāŒ Error deploying runtime: {str(e)}") + import traceback + traceback.print_exc() + raise + + +def main(): + """Main deployment function.""" + print("=" * 70) + print("MCP Athena Server Deployment to AgentCore Runtime") + print("=" * 70) + + # Load configuration from SSM + print("\nšŸ” Loading configuration from SSM Parameter Store...") + config = SSMConfig() + + # Validate configuration + if not config.is_valid(): + print("\nāŒ Configuration is invalid!") + config.print_status() + print("\nšŸ“ Please run the setup scripts first.") + sys.exit(1) + + + print("āœ… Configuration validated") + + # Print configuration summary + config.print_status() + + + try: + # Step 1: Create IAM role + print("\n" + "=" * 70) + print("Step 1: Creating IAM Role") + print("=" * 70) + role_arn = create_runtime_role(config) + + # Step 2: Deploy to runtime + print("\n" + "=" * 70) + print("Step 2: Deploying to AgentCore Runtime") + print("=" * 70) + result = deploy_to_runtime(config, role_arn) + + # Step 3: Store runtime parameters in SSM + print("\n" + "=" * 70) + print("Step 3: Storing Runtime Configuration") + print("=" * 70) + config.store_runtime_parameters(result['runtime_arn'], result['runtime_id']) + + # Print summary + print("\n" + "=" * 70) + print("Deployment Complete!") + print("=" * 70) + + print("\nāœ… Runtime configuration stored in SSM Parameter Store:") + print(f" /app/lakehouse-agent/mcp-server-runtime-arn") + print(f" /app/lakehouse-agent/mcp-server-runtime-id") + + print("\nšŸ“‹ Next Steps:") + print(" 1. Deploy the Gateway and Interceptor (Step 7)") + print(" 2. Deploy the Lakehouse Agent (Step 8)") + print(" 3. Test the system end-to-end") + + print("\n" + "=" * 70) + + except Exception as e: + print(f"\nāŒ Deployment failed: {str(e)}") + import traceback + traceback.print_exc() + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/requirements.txt b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/requirements.txt new file mode 100644 index 00000000..7f90d58b --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/requirements.txt @@ -0,0 +1,5 @@ +bedrock-agentcore>=1.0.0 +bedrock-agentcore-starter-toolkit +boto3>=1.34.0 +mcp>=1.9.0 +requests>=2.31.0 diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/server.py b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/server.py new file mode 100644 index 00000000..82a17952 --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/server.py @@ -0,0 +1,361 @@ +""" +MCP Server for Health Lakehouse Data - Production Security with Lake Formation + +This MCP server provides tools for querying and managing health lakehouse data +with enterprise-grade row-level security enforced by AWS Lake Formation. + +Security Architecture: +- OAuth authentication (Cognito JWT tokens) +- User identity extraction from Gateway interceptor +- Lake Formation session tag-based row-level security +- No SQL string interpolation (eliminates SQL injection risk) + +IMPORTANT: This server ONLY supports Lake Formation security mode. +Application-level SQL filtering has been removed for security reasons. + +Configuration: +- Reads from SSM Parameter Store +- Auto-detects region from boto3 session +- Requires SECURITY_MODE=lakeformation +- Optional RLS_ROLE_ARN to be set +""" + +import sys +import os +from typing import Any, Dict, Optional +import boto3 +from mcp.server.fastmcp import FastMCP + +# Initialize MCP server +mcp = FastMCP(host="0.0.0.0", stateless_http=True) + +# PRODUCTION ONLY: Use Lake Formation row-level security +from athena_tools_secure import SecureAthenaClaimsTools as AthenaTools + +print("šŸ”’ Using Lake Formation row-level security (production mode)") + +# Global Athena tools instance +athena_tools = None + +# Configuration cache +_config_cache = None + + +def get_config() -> Dict[str, Optional[str]]: + """ + Load configuration from environment variables and SSM Parameter Store. + """ + global _config_cache + + if _config_cache is not None: + return _config_cache + + config = {} + + # Get region from boto3 session with proper fallback + try: + session = boto3.Session() + config['region'] = ( + session.region_name or + os.environ.get('AWS_REGION') or + os.environ.get('AWS_DEFAULT_REGION') or + 'us-east-1' + ) + if not session.region_name: + print("āš ļø No region in AWS config, using fallback") + print(f"āœ… Region: {config['region']}") + except Exception as e: + print(f"āš ļø Could not detect region: {e}") + config['region'] = 'us-east-1' + + # Get account ID + try: + sts = boto3.client('sts', region_name=config['region']) + config['account_id'] = sts.get_caller_identity()['Account'] + except Exception as e: + print(f"āš ļø Could not get account ID: {e}") + config['account_id'] = None + + ssm = boto3.client('ssm', region_name=config['region']) + + def get_param(name: str, env_var: str = None, default: str = None) -> Optional[str]: + if env_var and env_var in os.environ: + value = os.environ[env_var] + print(f"āœ… {name} from environment: {value}") + return value + + try: + response = ssm.get_parameter(Name=f'/app/lakehouse-agent/{name}') + value = response['Parameter']['Value'] + print(f"āœ… {name} from SSM: {value}") + return value + except ssm.exceptions.ParameterNotFound: + if default: + print(f"ā„¹ļø {name} using default: {default}") + return default + print(f"āš ļø {name} not found") + return None + except Exception as e: + print(f"āŒ Error getting {name}: {e}") + return default + + config['s3_bucket_name'] = get_param('s3-bucket-name', 'S3_BUCKET_NAME') + config['database_name'] = get_param('database-name', 'ATHENA_DATABASE_NAME') + config['rls_role_arn'] = get_param('rls-role-arn', None) + config['security_mode'] = get_param('security-mode', 'SECURITY_MODE', 'lakeformation') + config['log_level'] = os.environ.get('LOG_LEVEL', 'INFO') + + if config['s3_bucket_name']: + config['s3_output_location'] = f"s3://{config['s3_bucket_name']}/athena-results/" + else: + config['s3_output_location'] = None + + config['test_user'] = os.environ.get('TEST_USER_1', 'user001@example.com') + config['local_development'] = os.environ.get('LOCAL_DEVELOPMENT', 'false').lower() == 'true' + + _config_cache = config + return config + + +def validate_config(config: Dict[str, Optional[str]]) -> bool: + required_params = [ + ('region', 'AWS Region'), + ('s3_bucket_name', 'S3 Bucket Name'), + ('database_name', 'Athena Database Name'), + ('security_mode', 'Security Mode') + ] + + missing = [] + for param, display_name in required_params: + if not config.get(param): + missing.append(display_name) + + if missing: + print(f"āŒ Missing required configuration: {', '.join(missing)}") + return False + + if config['security_mode'] != 'lakeformation': + print(f"āŒ Invalid security mode: {config['security_mode']}") + print(" Only 'lakeformation' is supported") + return False + + return True + + +def get_athena_tools(): + global athena_tools + if athena_tools is None: + config = get_config() + + print("Initializing Athena tools with Lake Formation RLS...") + print(f" Region: {config['region']}") + print(f" Database: {config['database_name']}") + print(f" S3 Output: {config['s3_output_location']}") + print(f" RLS Role: {config['rls_role_arn']}") + + athena_tools = AthenaTools( + region=config['region'], + database_name=config['database_name'], + s3_output_location=config['s3_output_location'], + rls_role_arn=config['rls_role_arn'] + ) + + print("āœ… Athena tools initialized with Lake Formation RLS") + + return athena_tools + + +def get_user_id_with_fallback(context_arg: Dict[str, Any] = None) -> str: + """Get user ID from context argument or fallback to test user.""" + config = get_config() + user_id = None + + if context_arg: + print(f"šŸ“‹ Context argument received: {context_arg}") + user_id = context_arg.get('user_id') + if user_id: + print(f" Got user_id from context argument: {user_id}") + return user_id + + if config['local_development']: + user_id = config['test_user'] + print(f"āš ļø Using test user for local development: {user_id}") + return user_id + + print("āŒ User identity not found in request") + return None + + +@mcp.tool( + name="query_claims", + description="Query health lakehouse data for the authenticated user with optional filters" +) +def query_claims( + claim_status: str = None, + claim_type: str = None, + start_date: str = None, + end_date: str = None, + context: Dict[str, Any] = None +) -> Dict[str, Any]: + """Query lakehouse data for the authenticated user.""" + print("=" * 60) + print("šŸ”§ TOOL INVOKED: query_claims") + print("=" * 60) + + print("šŸ“„ INPUT PARAMETERS:") + print(f" claim_status: {claim_status}") + print(f" claim_type: {claim_type}") + print(f" start_date: {start_date}") + print(f" end_date: {end_date}") + print(f" context: {context}") + + try: + user_id = get_user_id_with_fallback(context) + print(f"šŸ‘¤ USER ID: {user_id}") + + if not user_id: + return {"success": False, "error": "User identity not found in request"} + + filters = {k: v for k, v in { + 'claim_status': claim_status, + 'claim_type': claim_type, + 'start_date': start_date, + 'end_date': end_date + }.items() if v is not None} + + print(f"šŸ” FILTERS: {filters}") + + tools = get_athena_tools() + result = tools.query_claims(user_id, filters if filters else None) + + print("šŸ“¤ OUTPUT:") + print(f" success: {result.get('success', 'N/A')}") + if result.get('success'): + claims_count = len(result.get('claims', [])) + print(f" claims_count: {claims_count}") + else: + print(f" error: {result.get('error', 'N/A')}") + + print("=" * 60) + return result + + except Exception as e: + print(f"āŒ ERROR in query_claims: {str(e)}") + import traceback + print(f" Stack trace: {traceback.format_exc()}") + print("=" * 60) + return {"success": False, "error": str(e)} + + +@mcp.tool( + name="get_claim_details", + description="Get detailed information about a specific claim by ID" +) +def get_claim_details(claim_id: str, context: Dict[str, Any] = None) -> Dict[str, Any]: + """Get details of a specific claim.""" + print("=" * 60) + print("šŸ”§ TOOL INVOKED: get_claim_details") + print("=" * 60) + + print("šŸ“„ INPUT PARAMETERS:") + print(f" claim_id: {claim_id}") + print(f" context: {context}") + + try: + user_id = get_user_id_with_fallback(context) + print(f"šŸ‘¤ USER ID: {user_id}") + + if not user_id: + return {"success": False, "error": "User identity not found in request"} + + tools = get_athena_tools() + result = tools.get_claim_details(user_id, claim_id) + + print("šŸ“¤ OUTPUT:") + print(f" success: {result.get('success', 'N/A')}") + if result.get('success'): + claim_data = result.get('claim', {}) + print(f" claim_id: {claim_data.get('claim_id', 'N/A')}") + print(f" claim_status: {claim_data.get('claim_status', 'N/A')}") + else: + print(f" error: {result.get('error', 'N/A')}") + + print("=" * 60) + return result + + except Exception as e: + print(f"āŒ ERROR in get_claim_details: {str(e)}") + import traceback + print(f" Stack trace: {traceback.format_exc()}") + print("=" * 60) + return {"success": False, "error": str(e)} + + +@mcp.tool( + name="get_claims_summary", + description="Get summary statistics of all claims for the authenticated user" +) +def get_claims_summary(context: Dict[str, Any] = None) -> Dict[str, Any]: + """Get claims summary for the user.""" + print("=" * 60) + print("šŸ”§ TOOL INVOKED: get_claims_summary") + print("=" * 60) + + print("šŸ“„ INPUT PARAMETERS:") + print(f" context: {context}") + + try: + user_id = get_user_id_with_fallback(context) + print(f"šŸ‘¤ USER ID: {user_id}") + + if not user_id: + return {"success": False, "error": "User identity not found in request"} + + tools = get_athena_tools() + result = tools.get_claims_summary(user_id) + + print("šŸ“¤ OUTPUT:") + print(f" success: {result.get('success', 'N/A')}") + if result.get('success'): + summary = result.get('summary', {}) + print(f" total_claims: {summary.get('total_claims', 'N/A')}") + print(f" total_amount: {summary.get('total_amount', 'N/A')}") + print(f" by_status: {summary.get('by_status', 'N/A')}") + else: + print(f" error: {result.get('error', 'N/A')}") + + print("=" * 60) + return result + + except Exception as e: + print(f"āŒ ERROR in get_claims_summary: {str(e)}") + import traceback + print(f" Stack trace: {traceback.format_exc()}") + print("=" * 60) + return {"success": False, "error": str(e)} + + +if __name__ == "__main__": + print("\nšŸ” Validating configuration...") + + config = get_config() + + if config['security_mode'] != 'lakeformation': + print("\nāŒ Error: Only Lake Formation security mode is supported!") + print(f" Current SECURITY_MODE: {config['security_mode']}") + sys.exit(1) + + if not validate_config(config): + print("\nāŒ Configuration is invalid!") + sys.exit(1) + + print("āœ… Configuration validated") + print("šŸ”’ Lake Formation row-level security enabled") + + print(f"Starting MCP Server with Lake Formation RLS:") + print(f" Region: {config['region']}") + print(f" Database: {config['database_name']}") + print(f" S3 Output: {config['s3_output_location']}") + print(f" RLS Role: {config['rls_role_arn']}") + + mcp.run(transport="streamable-http") diff --git a/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/simple_mcp_test.py b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/simple_mcp_test.py new file mode 100644 index 00000000..d4b6575a --- /dev/null +++ b/02-use-cases/lakehouse-agent/deployment/mcp-lakehouse-server/simple_mcp_test.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +""" +Simple MCP Server Test + +This script: +1. Gets M2M token from Cognito +2. Prints token for validation +3. Uses token to invoke MCP server and get tool list +""" + +import boto3 +import requests +import json +import base64 + + +def get_m2m_token(): + """Get M2M access token from Cognito.""" + print("=" * 70) + print("Step 1: Get M2M Token from Cognito") + print("=" * 70) + + try: + session = boto3.Session() + region = session.region_name + ssm = boto3.client('ssm', region_name=region) + cognito = boto3.client('cognito-idp', region_name=region) + + # Get M2M client credentials from SSM + print("\nšŸ“‹ Loading M2M client credentials from SSM...") + client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-id')['Parameter']['Value'] + client_secret = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-m2m-client-secret', WithDecryption=True)['Parameter']['Value'] + domain = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-domain')['Parameter']['Value'] + user_pool_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-user-pool-id')['Parameter']['Value'] + except Exception as e: + print(f"āŒ Error loading configuration: {e}") + print(" Please check your AWS credentials and SSM parameters") + return None, None + + print(f" Client ID: {client_id}") + print(f" Domain: {domain}") + print(f" User Pool: {user_pool_id}") + + # Get configured OAuth scopes + print("\nšŸ” Getting OAuth scopes from client configuration...") + client_details = cognito.describe_user_pool_client( + UserPoolId=user_pool_id, + ClientId=client_id + ) + allowed_scopes = client_details['UserPoolClient'].get('AllowedOAuthScopes', []) + scope_string = ' '.join(allowed_scopes) + print(f" Scopes: {scope_string}") + + # Request token + print("\nšŸ” Requesting access token...") + token_endpoint = f"{domain}/oauth2/token" + credentials = f"{client_id}:{client_secret}" + encoded_credentials = base64.b64encode(credentials.encode()).decode() + + response = requests.post( + token_endpoint, + headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {encoded_credentials}' + }, + data={ + 'grant_type': 'client_credentials', + 'scope': scope_string + } + ) + + if response.status_code != 200: + print(f"āŒ Token request failed: {response.status_code}") + print(f" Response: {response.text}") + return None, region + + token_data = response.json() + access_token = token_data['access_token'] + + print(f"āœ… Token obtained successfully!") + print(f" Token type: {token_data.get('token_type', 'N/A')}") + print(f" Expires in: {token_data.get('expires_in', 'N/A')} seconds") + + # Decode and print token claims + print("\nšŸ“„ Token Claims:") + parts = access_token.split('.') + if len(parts) == 3: + payload = json.loads(base64.urlsafe_b64decode(parts[1] + '==')) + print(f" Issuer: {payload.get('iss', 'N/A')}") + print(f" Client ID: {payload.get('client_id', 'N/A')}") + print(f" Scope: {payload.get('scope', 'N/A')}") + print(f" Token Use: {payload.get('token_use', 'N/A')}") + + print(f"\nšŸ”‘ Access Token (first 100 chars):") + print(f" {access_token[:100]}...") + + return access_token, region + + +def test_mcp_server(access_token, region): + """Test MCP server by getting tool list.""" + print("\n" + "=" * 70) + print("Step 2: Invoke MCP Server to Get Tool List") + print("=" * 70) + + ssm = boto3.client('ssm', region_name=region) + + # Get runtime ARN + print("\nšŸ“¦ Loading runtime configuration...") + try: + runtime_arn = ssm.get_parameter(Name='/app/lakehouse-agent/mcp-server-runtime-arn')['Parameter']['Value'] + print(f" Runtime ARN: {runtime_arn}") + except ssm.exceptions.ParameterNotFound: + print(f" āŒ Runtime ARN not found in region {region}") + print(f" Please deploy the MCP server first or check your region") + return + except Exception as e: + print(f" āŒ Error loading runtime ARN: {e}") + return + + # Build MCP endpoint URL + encoded_arn = runtime_arn.replace(':', '%3A').replace('/', '%2F') + url = f"https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{encoded_arn}/invocations?qualifier=DEFAULT" + print(f" Endpoint: {url}") + + # Prepare headers + headers = { + "Authorization": f"Bearer {access_token}", + "Content-Type": "application/json", + "Accept": "application/json, text/event-stream" + } + + # Test 1: Initialize MCP session + print("\nšŸ“¤ Test 1: Initialize MCP session") + init_request = { + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "simple-test-client", + "version": "1.0.0" + } + } + } + + try: + response = requests.post(url, headers=headers, json=init_request, timeout=10) + print(f" Status: {response.status_code}") + print(f" Response length: {len(response.text)} bytes") + print(f" Content-Type: {response.headers.get('Content-Type', 'N/A')}") + + if response.status_code == 200: + if response.text: + # Parse SSE format + if response.headers.get('Content-Type') == 'text/event-stream': + print(f" āœ… Received SSE response") + # Extract JSON from SSE format + lines = response.text.split('\n') + for line in lines: + if line.startswith('data: '): + json_str = line[6:] # Remove 'data: ' prefix + try: + data = json.loads(json_str) + print(f" āœ… Initialize successful!") + if 'result' in data: + server_info = data['result'].get('serverInfo', {}) + print(f" Server Name: {server_info.get('name', 'N/A')}") + print(f" Server Version: {server_info.get('version', 'N/A')}") + print(f" Protocol Version: {data['result'].get('protocolVersion', 'N/A')}") + break + except json.JSONDecodeError: + continue + else: + try: + data = response.json() + print(f" āœ… Initialize successful!") + if 'result' in data: + server_info = data['result'].get('serverInfo', {}) + print(f" Server Name: {server_info.get('name', 'N/A')}") + print(f" Server Version: {server_info.get('version', 'N/A')}") + print(f" Protocol Version: {data['result'].get('protocolVersion', 'N/A')}") + except json.JSONDecodeError as je: + print(f" āš ļø Response is not valid JSON: {je}") + print(f" Raw response (first 500 chars): {response.text[:500]}") + else: + print(f" āš ļø Response body is empty") + return + else: + print(f" āŒ Initialize failed") + if response.text: + print(f" Response: {response.text[:500]}") + else: + print(f" Response body is empty") + return + + except requests.exceptions.Timeout: + print(f" āŒ Request timed out") + return + except Exception as e: + print(f" āŒ Error: {e}") + return + + # Test 2: Get tool list + print("\nšŸ“¤ Test 2: Get tool list") + tools_request = { + "jsonrpc": "2.0", + "id": 2, + "method": "tools/list", + "params": {} + } + + try: + response = requests.post(url, headers=headers, json=tools_request, timeout=10) + print(f" Status: {response.status_code}") + print(f" Response length: {len(response.text)} bytes") + + if response.status_code == 200: + if response.text: + # Parse SSE format + if response.headers.get('Content-Type') == 'text/event-stream': + print(f" āœ… Received SSE response") + # Extract JSON from SSE format + lines = response.text.split('\n') + for line in lines: + if line.startswith('data: '): + json_str = line[6:] # Remove 'data: ' prefix + try: + data = json.loads(json_str) + print(f" āœ… Tool list retrieved!") + + if 'result' in data and 'tools' in data['result']: + tools = data['result']['tools'] + print(f"\n šŸ“‹ Available Tools ({len(tools)}):") + print(" " + "=" * 66) + for i, tool in enumerate(tools, 1): + print(f"\n {i}. {tool.get('name', 'N/A')}") + print(f" Description: {tool.get('description', 'N/A')}") + if 'inputSchema' in tool and 'properties' in tool['inputSchema']: + props = tool['inputSchema']['properties'] + if props: + print(f" Parameters: {', '.join(props.keys())}") + else: + print(f" Response: {json.dumps(data, indent=2)}") + break + except json.JSONDecodeError: + continue + else: + try: + data = response.json() + print(f" āœ… Tool list retrieved!") + + if 'result' in data and 'tools' in data['result']: + tools = data['result']['tools'] + print(f"\n šŸ“‹ Available Tools ({len(tools)}):") + print(" " + "=" * 66) + for i, tool in enumerate(tools, 1): + print(f"\n {i}. {tool.get('name', 'N/A')}") + print(f" Description: {tool.get('description', 'N/A')}") + if 'inputSchema' in tool and 'properties' in tool['inputSchema']: + props = tool['inputSchema']['properties'] + if props: + print(f" Parameters: {', '.join(props.keys())}") + else: + print(f" Response: {json.dumps(data, indent=2)}") + except json.JSONDecodeError: + print(f" āš ļø Response is not valid JSON") + print(f" Raw response: {response.text[:200]}") + else: + print(f" āš ļø Response body is empty") + else: + print(f" āŒ Tool list failed") + if response.text: + print(f" Response: {response.text[:500]}") + else: + print(f" Response body is empty") + + except requests.exceptions.Timeout: + print(f" āŒ Request timed out") + except Exception as e: + print(f" āŒ Error: {e}") + + +def main(): + print("\n" + "=" * 70) + print("Simple MCP Server Test with M2M Authentication") + print("=" * 70 + "\n") + + # Step 1: Get token + access_token, region = get_m2m_token() + + if not access_token: + print("\nāŒ Failed to get access token. Exiting.") + return + + # Step 2: Test MCP server + test_mcp_server(access_token, region) + + print("\n" + "=" * 70) + print("Test Complete") + print("=" * 70 + "\n") + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/requirements.txt b/02-use-cases/lakehouse-agent/requirements.txt new file mode 100644 index 00000000..ddd3a282 --- /dev/null +++ b/02-use-cases/lakehouse-agent/requirements.txt @@ -0,0 +1,26 @@ +# Health Lakehouse Agent - Main Requirements + +# Core dependencies +boto3>=1.34.0 +bedrock-agentcore>=1.0.0 +bedrock-agentcore-starter-toolkit>=0.2.6 +strands-agents>=1.0.0 + +# Web UI +streamlit>=1.30.0 +requests>=2.31.0 + +# MCP +mcp>=1.9.0 + +# JWT handling +python-jose[cryptography]>=3.4.0 +cryptography>=41.0.0 + +# Development +jupyter>=1.0.0 +ipykernel>=6.29.0 + +# Testing +pytest>=7.4.0 +hypothesis>=6.92.0 diff --git a/02-use-cases/lakehouse-agent/screenshots/testuser1-lakehouseagent.png b/02-use-cases/lakehouse-agent/screenshots/testuser1-lakehouseagent.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2c34a1a6d2a12fb007499ddd0e6af5f7735ade GIT binary patch literal 359606 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⁢h_zpIX%(-o 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%0AFnYP_Z<)ZRcibRyHhseU-v9iG>g~nPuxxPb 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

@L3xyc*|0EykD#wEm8qk&r)y07PXnXZ|$ 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ⅇ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�O* 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

Q( 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⪻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�cTP8s9gBFpUq2r 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


z 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 P;Gd+ZoJfg~uFwAiac;La literal 0 HcmV?d00001 diff --git a/02-use-cases/lakehouse-agent/streamlit-ui/requirements.txt b/02-use-cases/lakehouse-agent/streamlit-ui/requirements.txt new file mode 100644 index 00000000..c5454c4e --- /dev/null +++ b/02-use-cases/lakehouse-agent/streamlit-ui/requirements.txt @@ -0,0 +1,3 @@ +streamlit>=1.30.0 +requests>=2.31.0 +boto3>=1.28.0 diff --git a/02-use-cases/lakehouse-agent/streamlit-ui/streamlit_app.py b/02-use-cases/lakehouse-agent/streamlit-ui/streamlit_app.py new file mode 100644 index 00000000..02c9ab92 --- /dev/null +++ b/02-use-cases/lakehouse-agent/streamlit-ui/streamlit_app.py @@ -0,0 +1,444 @@ +""" +Streamlit UI for Health Lakehouse Data Agent with Cognito User Authentication +""" +import streamlit as st +import requests +import json +import uuid +import boto3 +import os +from typing import Optional + +st.set_page_config(page_title="Lakehouse Data Assistant", page_icon="šŸ„", layout="wide") + +# Initialize session state +if "messages" not in st.session_state: + st.session_state.messages = [] +if "session_id" not in st.session_state: + st.session_state.session_id = str(uuid.uuid4()) +if "access_token" not in st.session_state: + st.session_state.access_token = None +if "id_token" not in st.session_state: + st.session_state.id_token = None +if "user_email" not in st.session_state: + st.session_state.user_email = None +if "runtime_arn" not in st.session_state: + st.session_state.runtime_arn = "" +if "cognito_config" not in st.session_state: + st.session_state.cognito_config = {} + +def load_config_from_ssm(): + """Load configuration from SSM Parameter Store""" + try: + session = boto3.Session() + # Get region with proper fallback + region = ( + session.region_name or + os.environ.get('AWS_REGION') or + os.environ.get('AWS_DEFAULT_REGION') or + 'us-east-1' + ) + ssm = boto3.client('ssm', region_name=region) + + config = {} + params = { + 'runtime_arn': '/app/lakehouse-agent/agent-runtime-arn', + 'cognito_user_pool_id': '/app/lakehouse-agent/cognito-user-pool-id', + 'cognito_app_client_id': '/app/lakehouse-agent/cognito-app-client-id', + 'cognito_domain': '/app/lakehouse-agent/cognito-domain', + 'cognito_region': '/app/lakehouse-agent/cognito-region' + } + + for key, param_name in params.items(): + try: + response = ssm.get_parameter(Name=param_name) + config[key] = response['Parameter']['Value'] + except: + config[key] = None + + config['region'] = region + return config + except Exception as e: + st.error(f"Failed to load config from SSM: {e}") + # Return config with at least region set + session = boto3.Session() + return { + 'region': ( + session.region_name or + os.environ.get('AWS_REGION') or + os.environ.get('AWS_DEFAULT_REGION') or + 'us-east-1' + ) + } + +def authenticate_user(username: str, password: str, user_pool_id: str, client_id: str, region: str) -> Optional[dict]: + """Authenticate user with Cognito using USER_PASSWORD_AUTH flow""" + try: + client = boto3.client('cognito-idp', region_name=region) + + # Get client secret from SSM + ssm = boto3.client('ssm', region_name=region) + try: + client_secret = ssm.get_parameter( + Name='/app/lakehouse-agent/cognito-app-client-secret', + WithDecryption=True + )['Parameter']['Value'] + except: + st.error("āŒ Could not retrieve client secret from SSM") + return None + + # Calculate SECRET_HASH + import hmac + import hashlib + import base64 + + message = bytes(username + client_id, 'utf-8') + secret = bytes(client_secret, 'utf-8') + secret_hash = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest()).decode() + + response = client.admin_initiate_auth( + UserPoolId=user_pool_id, + ClientId=client_id, + AuthFlow='ADMIN_NO_SRP_AUTH', + AuthParameters={ + 'USERNAME': username, + 'PASSWORD': password, + 'SECRET_HASH': secret_hash + } + ) + + if 'ChallengeName' in response: + if response['ChallengeName'] == 'NEW_PASSWORD_REQUIRED': + return { + 'challenge': 'NEW_PASSWORD_REQUIRED', + 'session': response['Session'] + } + + if 'AuthenticationResult' in response: + return { + 'access_token': response['AuthenticationResult']['AccessToken'], + 'id_token': response['AuthenticationResult']['IdToken'], + 'refresh_token': response['AuthenticationResult'].get('RefreshToken') + } + + return None + + except client.exceptions.NotAuthorizedException: + st.error("āŒ Invalid username or password") + return None + except Exception as e: + st.error(f"āŒ Authentication failed: {e}") + return None + +def set_new_password(username: str, new_password: str, session: str, user_pool_id: str, client_id: str, region: str) -> Optional[dict]: + """Set new password for user with NEW_PASSWORD_REQUIRED challenge""" + try: + client = boto3.client('cognito-idp', region_name=region) + + # Get client secret from SSM + ssm = boto3.client('ssm', region_name=region) + try: + client_secret = ssm.get_parameter( + Name='/app/lakehouse-agent/cognito-app-client-secret', + WithDecryption=True + )['Parameter']['Value'] + except: + st.error("āŒ Could not retrieve client secret from SSM") + return None + + # Calculate SECRET_HASH + import hmac + import hashlib + import base64 + + message = bytes(username + client_id, 'utf-8') + secret = bytes(client_secret, 'utf-8') + secret_hash = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest()).decode() + + response = client.admin_respond_to_auth_challenge( + UserPoolId=user_pool_id, + ClientId=client_id, + ChallengeName='NEW_PASSWORD_REQUIRED', + ChallengeResponses={ + 'USERNAME': username, + 'NEW_PASSWORD': new_password, + 'SECRET_HASH': secret_hash + }, + Session=session + ) + + if 'AuthenticationResult' in response: + return { + 'access_token': response['AuthenticationResult']['AccessToken'], + 'id_token': response['AuthenticationResult']['IdToken'], + 'refresh_token': response['AuthenticationResult'].get('RefreshToken') + } + + return None + + except Exception as e: + st.error(f"āŒ Failed to set new password: {e}") + return None + +def invoke_agent(runtime_arn: str, prompt: str, access_token: str, id_token: str, region: str) -> str: + """Invoke AgentCore Runtime with OAuth bearer token via HTTPS""" + try: + import requests + import urllib.parse + + # URL encode the agent ARN + escaped_agent_arn = urllib.parse.quote(runtime_arn, safe='') + + # Construct the AWS API endpoint URL + url = f"https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{escaped_agent_arn}/invocations?qualifier=DEFAULT" + + # Set up headers with bearer token + headers = { + "Authorization": f"Bearer {access_token}", + "Content-Type": "application/json", + "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": st.session_state.session_id + } + + # Prepare payload + payload = {"prompt": prompt, "bearer_token": access_token, "id_token": id_token} + + st.info(f"šŸ”— Invoking AgentCore Runtime with OAuth") + + # Make HTTPS request + response = requests.post( + url, + headers=headers, + json=payload, + timeout=60 + ) + + # Check for errors + if response.status_code != 200: + error_msg = f"HTTP {response.status_code}" + try: + error_detail = response.json() + error_msg += f": {error_detail}" + except: + error_msg += f": {response.text}" + return f"āŒ Error: {error_msg}" + + # Handle streaming response (text/event-stream) + content_type = response.headers.get('Content-Type', '') + + if 'text/event-stream' in content_type: + # Parse SSE (Server-Sent Events) format + content = [] + for line in response.text.split('\n'): + if line.startswith('data: '): + data_str = line[6:].strip() + if data_str: + try: + data = json.loads(data_str) + # Extract content from various possible formats + if isinstance(data, dict): + if 'content' in data: + content.append(str(data['content'])) + elif 'response' in data: + content.append(str(data['response'])) + elif 'result' in data: + content.append(str(data['result'])) + else: + content.append(str(data)) + else: + content.append(str(data)) + except json.JSONDecodeError: + content.append(data_str) + + return '\n'.join(content) if content else "āš ļø No response received" + + else: + # Handle JSON response + try: + result = response.json() + if isinstance(result, dict): + if 'content' in result: + return result['content'] + elif 'response' in result: + return result['response'] + elif 'result' in result: + return result['result'] + return str(result) + except json.JSONDecodeError: + return response.text + + except requests.exceptions.RequestException as e: + return f"āŒ Request error: {str(e)}" + except Exception as e: + return f"āŒ Error: {str(e)}" + +# Load configuration from SSM on first run +if not st.session_state.cognito_config: + with st.spinner("Loading configuration from SSM..."): + st.session_state.cognito_config = load_config_from_ssm() + if st.session_state.cognito_config.get('runtime_arn'): + st.session_state.runtime_arn = st.session_state.cognito_config['runtime_arn'] + +# Sidebar configuration +with st.sidebar: + st.title("šŸ„ Claims Assistant") + st.markdown("---") + + # Login section + if not st.session_state.access_token: + with st.expander("šŸ” User Login", expanded=True): + st.markdown("*Default password: TempPass123!*") + st.markdown("---") + + # Test users dropdown + test_users = [ + "user001@example.com", + "user002@example.com", + "adjuster001@example.com" + ] + username = st.selectbox("Email", options=test_users, index=0) + password = st.text_input("Password", type="password", placeholder="TempPass123!") + + config = st.session_state.cognito_config + + if st.button("šŸ”‘ Login", use_container_width=True): + if username and password: + if not config.get('cognito_user_pool_id') or not config.get('cognito_app_client_id'): + st.error("āŒ Cognito not configured. Please run setup_cognito.py first.") + else: + with st.spinner("Authenticating..."): + result = authenticate_user( + username, + password, + config['cognito_user_pool_id'], + config['cognito_app_client_id'], + config.get('cognito_region') or config.get('region') + ) + + if result: + if result.get('challenge') == 'NEW_PASSWORD_REQUIRED': + st.session_state.password_challenge = { + 'username': username, + 'session': result['session'] + } + st.warning("āš ļø You must set a new password") + st.rerun() + else: + st.session_state.access_token = result['access_token'] + st.session_state.id_token = result['id_token'] + st.session_state.user_email = username + st.success(f"āœ… Logged in as {username}") + st.rerun() + else: + st.warning("āš ļø Please enter username and password") + + # Handle password change challenge + if 'password_challenge' in st.session_state: + with st.expander("šŸ”’ Set New Password", expanded=True): + st.info("First time login - please set a new password") + new_password = st.text_input("New Password", type="password", key="new_pwd") + confirm_password = st.text_input("Confirm Password", type="password", key="confirm_pwd") + + if st.button("Set Password", use_container_width=True): + if new_password and new_password == confirm_password: + config = st.session_state.cognito_config + challenge = st.session_state.password_challenge + + with st.spinner("Setting new password..."): + result = set_new_password( + challenge['username'], + new_password, + challenge['session'], + config['cognito_user_pool_id'], + config['cognito_app_client_id'], + config.get('cognito_region') or config.get('region') + ) + + if result: + st.session_state.access_token = result['access_token'] + st.session_state.id_token = result['id_token'] + st.session_state.user_email = challenge['username'] + del st.session_state.password_challenge + st.success(f"āœ… Password set! Logged in as {challenge['username']}") + st.rerun() + else: + st.error("āŒ Passwords don't match or are empty") + else: + st.success(f"šŸ”“ Logged in as: {st.session_state.user_email}") + if st.button("🚪 Logout", use_container_width=True): + st.session_state.access_token = None + st.session_state.id_token = None + st.session_state.user_email = None + st.session_state.messages = [] + st.session_state.session_id = str(uuid.uuid4()) + st.rerun() + + st.markdown("---") + + with st.expander("āš™ļø Runtime Configuration", expanded=False): + runtime_arn = st.text_input("Runtime ARN", value=st.session_state.runtime_arn) + st.session_state.runtime_arn = runtime_arn + + config = st.session_state.cognito_config + region = st.text_input("AWS Region", value=config.get('region', 'us-east-1')) + + if st.button("šŸ”„ Reload from SSM", use_container_width=True): + st.session_state.cognito_config = load_config_from_ssm() + if st.session_state.cognito_config.get('runtime_arn'): + st.session_state.runtime_arn = st.session_state.cognito_config['runtime_arn'] + st.success("āœ… Configuration reloaded") + st.rerun() + + st.markdown("---") + st.markdown("### šŸ’” Example Queries") + examples = [ + "Show me all my claims", + "What's the status of CLM-2024-001?", + "Get my claims summary", + "Show pending claims" + ] + for ex in examples: + if st.button(ex, key=f"ex_{ex[:15]}", use_container_width=True): + st.session_state.example_prompt = ex + +# Main interface +st.title("šŸ„ Health Lakehouse Data Assistant") +st.markdown(f"Ask me about your lakehouse data! *Logged in as: {st.session_state.user_email or 'Not logged in'}*") + +if not st.session_state.access_token: + st.warning("āš ļø Please login in the sidebar first!") + st.stop() + +if not st.session_state.runtime_arn: + st.warning("āš ļø Runtime ARN not configured. Please check SSM Parameter Store or enter manually in the sidebar.") + st.stop() + +# Display chat history +for msg in st.session_state.messages: + with st.chat_message(msg["role"]): + st.markdown(msg["content"]) + +# Handle input +prompt = st.session_state.pop("example_prompt", None) or st.chat_input("Ask about your claims...") + +if prompt: + with st.chat_message("user"): + st.markdown(prompt) + st.session_state.messages.append({"role": "user", "content": prompt}) + + with st.chat_message("assistant"): + config = st.session_state.cognito_config + # Config should always have region from load_config_from_ssm + response = invoke_agent( + st.session_state.runtime_arn, + prompt, + st.session_state.access_token, + st.session_state.id_token, + config.get('region') # Should always be set from load_config_from_ssm + ) + try: + data = json.loads(response) + response = data.get("content", response) + except: + pass + st.markdown(response) + st.session_state.messages.append({"role": "assistant", "content": response}) diff --git a/02-use-cases/lakehouse-agent/test/check_agent_status.py b/02-use-cases/lakehouse-agent/test/check_agent_status.py new file mode 100644 index 00000000..69299781 --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/check_agent_status.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python3 +""" +Check Agent Runtime Status and CloudWatch Logs + +This script checks the status of the lakehouse agent runtime and helps you +find its CloudWatch logs. +""" + +import boto3 +import sys +from datetime import datetime, timedelta + +def main(): + print("=" * 80) + print("Agent Runtime Status and Logs Checker") + print("=" * 80) + + session = boto3.Session() + region = session.region_name + + print(f"\nšŸ“ Region: {region}") + + # Check if agent runtime ARN exists in SSM + print("\nšŸ” Checking SSM Parameter Store...") + ssm = boto3.client('ssm', region_name=region) + + try: + runtime_arn = ssm.get_parameter(Name='/app/lakehouse-agent/agent-runtime-arn')['Parameter']['Value'] + print(f" āœ… Agent Runtime ARN: {runtime_arn}") + except ssm.exceptions.ParameterNotFound: + print(f" āŒ Agent runtime ARN not found in SSM") + print(f"\nšŸ’” Solution:") + print(f" The agent hasn't been deployed yet.") + print(f" Run: python lakehouse-agent/deploy_lakehouse_agent.py") + return + + # Get agent runtime details + print(f"\nšŸ” Checking Agent Runtime Status...") + try: + client = boto3.client('bedrock-agentcore-control', region_name=region) + response = client.get_agent_runtime(agentRuntimeArn=runtime_arn) + runtime = response['agentRuntime'] + + status = runtime.get('status', 'UNKNOWN') + name = runtime.get('agentRuntimeName', 'unknown') + created = runtime.get('createdAt', 'unknown') + updated = runtime.get('updatedAt', 'unknown') + + print(f" Name: {name}") + print(f" Status: {status}") + print(f" Created: {created}") + print(f" Updated: {updated}") + + if status != 'ACTIVE': + print(f"\n āš ļø Agent is not ACTIVE!") + print(f" Current status: {status}") + + if status == 'CREATING': + print(f" ā„¹ļø Agent is still being created. Wait a few minutes.") + elif status == 'FAILED': + print(f" āŒ Agent creation failed. Check CloudWatch logs for errors.") + elif status == 'UPDATING': + print(f" ā„¹ļø Agent is being updated. Wait a few minutes.") + else: + print(f" āœ… Agent is ACTIVE and ready to receive requests") + + # Check authorizer configuration + if 'authorizerConfiguration' in runtime: + auth_config = runtime['authorizerConfiguration'] + if 'customJWTAuthorizer' in auth_config: + jwt_config = auth_config['customJWTAuthorizer'] + print(f"\n šŸ” JWT Authentication:") + print(f" Discovery URL: {jwt_config.get('discoveryUrl')}") + print(f" Allowed Clients: {jwt_config.get('allowedClients')}") + else: + print(f"\n šŸ” Authentication: IAM SigV4") + else: + print(f"\n šŸ” Authentication: IAM SigV4 (default)") + + except Exception as e: + print(f" āŒ Error getting agent runtime: {e}") + return + + # Find CloudWatch log groups + print(f"\nšŸ” Searching for CloudWatch Log Groups...") + logs = boto3.client('logs', region_name=region) + + # Extract runtime ID from ARN + # ARN format: arn:aws:bedrock-agentcore:region:account:runtime/runtime-id + runtime_id = runtime_arn.split('/')[-1] + + # Common log group patterns for AgentCore Runtime + patterns = [ + f"/aws/bedrock-agentcore/runtime/{runtime_id}", + f"/aws/bedrock-agentcore/runtime/{name}", + f"/aws/bedrock-agentcore/{runtime_id}", + f"/aws/agentcore/runtime/{runtime_id}", + f"/aws/agentcore/{name}", + f"/aws/bedrock/agentcore/{runtime_id}", + ] + + found_log_groups = [] + + # Search for log groups + try: + # Get all log groups with bedrock-agentcore prefix + paginator = logs.get_paginator('describe_log_groups') + + for page in paginator.paginate(logGroupNamePrefix='/aws/bedrock-agentcore'): + for log_group in page.get('logGroups', []): + log_group_name = log_group['logGroupName'] + found_log_groups.append({ + 'name': log_group_name, + 'created': log_group.get('creationTime'), + 'size': log_group.get('storedBytes', 0) + }) + + # Also try /aws/agentcore prefix + for page in paginator.paginate(logGroupNamePrefix='/aws/agentcore'): + for log_group in page.get('logGroups', []): + log_group_name = log_group['logGroupName'] + if log_group_name not in [lg['name'] for lg in found_log_groups]: + found_log_groups.append({ + 'name': log_group_name, + 'created': log_group.get('creationTime'), + 'size': log_group.get('storedBytes', 0) + }) + + except Exception as e: + print(f" āš ļø Error searching log groups: {e}") + + if found_log_groups: + print(f" āœ… Found {len(found_log_groups)} AgentCore log group(s):") + for lg in found_log_groups: + created_date = datetime.fromtimestamp(lg['created'] / 1000).strftime('%Y-%m-%d %H:%M:%S') + size_mb = lg['size'] / (1024 * 1024) + print(f"\n šŸ“ {lg['name']}") + print(f" Created: {created_date}") + print(f" Size: {size_mb:.2f} MB") + + # Check for recent log streams + try: + streams_response = logs.describe_log_streams( + logGroupName=lg['name'], + orderBy='LastEventTime', + descending=True, + limit=5 + ) + + streams = streams_response.get('logStreams', []) + if streams: + print(f" Recent log streams:") + for stream in streams[:3]: + stream_name = stream['logStreamName'] + last_event = stream.get('lastEventTimestamp') + if last_event: + last_event_date = datetime.fromtimestamp(last_event / 1000).strftime('%Y-%m-%d %H:%M:%S') + print(f" - {stream_name} (last: {last_event_date})") + else: + print(f" - {stream_name} (no events)") + else: + print(f" āš ļø No log streams found (agent hasn't been invoked yet)") + + except Exception as e: + print(f" āš ļø Error checking log streams: {e}") + else: + print(f" āš ļø No AgentCore log groups found") + print(f"\n This could mean:") + print(f" 1. The agent hasn't been invoked yet (logs created on first invocation)") + print(f" 2. CloudWatch logging isn't enabled") + print(f" 3. The log group uses a different naming pattern") + + # Provide instructions for viewing logs + print(f"\nšŸ“‹ How to View Logs:") + print(f"\n Option 1: AWS Console") + print(f" 1. Go to CloudWatch Console") + print(f" 2. Click 'Log groups' in the left sidebar") + print(f" 3. Search for: /aws/bedrock-agentcore") + print(f" 4. Look for log groups containing: {runtime_id}") + + print(f"\n Option 2: AWS CLI") + if found_log_groups: + log_group_name = found_log_groups[0]['name'] + print(f" # List log streams") + print(f" aws logs describe-log-streams \\") + print(f" --log-group-name '{log_group_name}' \\") + print(f" --order-by LastEventTime \\") + print(f" --descending \\") + print(f" --max-items 10") + print(f"\n # Tail logs (last 10 minutes)") + print(f" aws logs tail '{log_group_name}' --follow --since 10m") + else: + print(f" # Search for log groups") + print(f" aws logs describe-log-groups \\") + print(f" --log-group-name-prefix '/aws/bedrock-agentcore'") + + print(f"\n Option 3: Python Script") + print(f" python check_recent_logs.py") + + # Check if agent has been invoked + print(f"\nšŸ” Checking Invocation History...") + + if found_log_groups and any(lg['size'] > 0 for lg in found_log_groups): + print(f" āœ… Agent has been invoked (logs exist)") + + # Try to get recent log events + for lg in found_log_groups: + if lg['size'] > 0: + try: + # Get recent log events + end_time = int(datetime.now().timestamp() * 1000) + start_time = int((datetime.now() - timedelta(hours=1)).timestamp() * 1000) + + events_response = logs.filter_log_events( + logGroupName=lg['name'], + startTime=start_time, + endTime=end_time, + limit=10 + ) + + events = events_response.get('events', []) + if events: + print(f"\n šŸ“„ Recent log events from {lg['name']}:") + for event in events[:5]: + timestamp = datetime.fromtimestamp(event['timestamp'] / 1000).strftime('%H:%M:%S') + message = event['message'][:100] + print(f" [{timestamp}] {message}") + + if len(events) > 5: + print(f" ... and {len(events) - 5} more events") + except Exception as e: + print(f" āš ļø Error reading log events: {e}") + else: + print(f" āš ļø No invocations detected") + print(f"\n šŸ’” To generate logs:") + print(f" 1. Invoke the agent using the Streamlit UI") + print(f" 2. Or run: python test_agent_invocation.py") + print(f" 3. Then check CloudWatch logs again") + + print(f"\n" + "=" * 80) + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/test/check_logs.sh b/02-use-cases/lakehouse-agent/test/check_logs.sh new file mode 100755 index 00000000..528df551 --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/check_logs.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Check CloudWatch logs for the agent runtime + +RUNTIME_ID="lakehouse_agent-Hhb3lX6y7M" +REGION="us-east-1" + +echo "šŸ” Checking CloudWatch logs for runtime: $RUNTIME_ID" +echo "" + +# Try different log group patterns +LOG_GROUPS=( + "/aws/bedrock-agentcore/runtime/$RUNTIME_ID" + "/aws/bedrock/agentcore/runtime/$RUNTIME_ID" + "/aws/bedrock-agentcore/$RUNTIME_ID" +) + +for LOG_GROUP in "${LOG_GROUPS[@]}"; do + echo "Checking log group: $LOG_GROUP" + aws logs describe-log-streams \ + --log-group-name "$LOG_GROUP" \ + --region "$REGION" \ + --max-items 5 \ + 2>&1 | head -20 + + if [ $? -eq 0 ]; then + echo "" + echo "āœ… Found log group: $LOG_GROUP" + echo "" + echo "šŸ“‹ Recent logs:" + aws logs tail "$LOG_GROUP" \ + --region "$REGION" \ + --since 1h \ + --format short \ + 2>&1 | head -50 + break + fi + echo "" +done + +echo "" +echo "šŸ” Searching for any bedrock-agentcore log groups..." +aws logs describe-log-groups \ + --region "$REGION" \ + --log-group-name-prefix "/aws/bedrock" \ + 2>&1 | grep -i "logGroupName" | head -20 diff --git a/02-use-cases/lakehouse-agent/test/test_agent_no_gateway.py b/02-use-cases/lakehouse-agent/test/test_agent_no_gateway.py new file mode 100644 index 00000000..0e8dcb4b --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/test_agent_no_gateway.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +""" +Simple test of agent runtime WITHOUT gateway tools - just basic conversation +""" +import json +import uuid +import requests +from config import config + +def get_cognito_token(): + """Get Cognito bearer token using client_credentials flow""" + print("šŸ”‘ Getting Cognito bearer token...") + + cognito_domain = config.COGNITO_DOMAIN + client_id = config.COGNITO_APP_CLIENT_ID + client_secret = config.COGNITO_APP_CLIENT_SECRET + scope = config.COGNITO_SCOPE_QUERY + + # Fix scope format: replace slashes with dots + scope = scope.replace('/claims/', '/claims.') + + token_url = f"{cognito_domain}/oauth2/token" + data = { + "grant_type": "client_credentials", + "client_id": client_id, + "client_secret": client_secret, + "scope": scope + } + + try: + response = requests.post(token_url, data=data, timeout=10) + response.raise_for_status() + token = response.json().get("access_token") + print(f"āœ… Token obtained: {token[:20]}...") + return token + except Exception as e: + print(f"āŒ Failed to get token: {e}") + return None + +def test_agent_no_gateway(): + """Test agent with a simple prompt that doesn't require gateway tools""" + print("=" * 60) + print("🧪 Testing Agent Runtime (No Gateway)") + print("=" * 60) + + runtime_arn = config.RUNTIME_ARN + region = config.AWS_REGION + + print(f"\nRuntime ARN: {runtime_arn}") + print(f"Region: {region}") + + # Get Cognito token + bearer_token = get_cognito_token() + if not bearer_token: + print("\nāŒ Cannot proceed without token") + return False + + try: + # Build runtime endpoint URL + escaped_arn = requests.utils.quote(runtime_arn, safe='') + base_url = f"https://bedrock-agentcore.{region}.amazonaws.com" + runtime_url = f"{base_url}/runtimes/{escaped_arn}/invocations" + + # Simple payload that doesn't require tools + # Just ask the agent to introduce itself + payload = { + "prompt": "Hello! Please introduce yourself and tell me what you can help with. Don't try to query any data, just explain your capabilities.", + "bearer_token": bearer_token + } + + # Generate session ID + session_id = f"test-session-{uuid.uuid4().hex}" + + print(f"\nšŸ“¤ Sending request...") + print(f" URL: {runtime_url}") + print(f" Prompt: {payload['prompt'][:80]}...") + print(f" Session ID: {session_id}") + + # Make direct HTTPS request with OAuth bearer token + headers = { + 'Authorization': f'Bearer {bearer_token}', + 'Content-Type': 'application/json', + 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id': session_id + } + + print(f"\nā³ Waiting for response (this may take 30-60 seconds)...") + response = requests.post( + runtime_url, + headers=headers, + params={'qualifier': 'DEFAULT'}, + json=payload, + timeout=90 # Longer timeout for first request + ) + + response.raise_for_status() + response_data = response.json() + + print(f"\nāœ… Agent response:") + print(json.dumps(response_data, indent=2)) + return True + + except Exception as e: + print(f"\nāŒ Error: {e}") + if hasattr(e, 'response') and e.response is not None: + print(f" Status: {e.response.status_code}") + print(f" Response: {e.response.text}") + import traceback + traceback.print_exc() + return False + +if __name__ == "__main__": + success = test_agent_no_gateway() + print("\n" + "=" * 60) + if success: + print("āœ… Test passed!") + else: + print("āŒ Test failed") + print("=" * 60) diff --git a/02-use-cases/lakehouse-agent/test/test_agent_simple.py b/02-use-cases/lakehouse-agent/test/test_agent_simple.py new file mode 100644 index 00000000..176fd8d5 --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/test_agent_simple.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +""" +Simple test of agent runtime with JWT authentication +""" +import json +import uuid +import requests +from config import config + +def get_cognito_token(): + """Get Cognito bearer token using client_credentials flow""" + print("šŸ”‘ Getting Cognito bearer token...") + + cognito_domain = config.COGNITO_DOMAIN + client_id = config.COGNITO_APP_CLIENT_ID + client_secret = config.COGNITO_APP_CLIENT_SECRET + scope = config.COGNITO_SCOPE_QUERY + + # Fix scope format: replace slashes with dots + scope = scope.replace('/claims/', '/claims.') + + token_url = f"{cognito_domain}/oauth2/token" + data = { + "grant_type": "client_credentials", + "client_id": client_id, + "client_secret": client_secret, + "scope": scope + } + + try: + response = requests.post(token_url, data=data, timeout=10) + response.raise_for_status() + token = response.json().get("access_token") + print(f"āœ… Token obtained: {token[:20]}...") + return token + except Exception as e: + print(f"āŒ Failed to get token: {e}") + return None + +def test_agent_simple(): + """Test agent with a simple prompt using JWT authentication""" + print("=" * 60) + print("🧪 Testing Agent Runtime (Simple with JWT)") + print("=" * 60) + + runtime_arn = config.RUNTIME_ARN + runtime_id = config.RUNTIME_ID + region = config.AWS_REGION + + print(f"\nRuntime ARN: {runtime_arn}") + print(f"Runtime ID: {runtime_id}") + print(f"Region: {region}") + + # Get Cognito token + bearer_token = get_cognito_token() + if not bearer_token: + print("\nāŒ Cannot proceed without token") + return False + + try: + # Build runtime endpoint URL using the correct format + # Format: https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{escaped_arn}/invocations + escaped_arn = requests.utils.quote(runtime_arn, safe='') + base_url = f"https://bedrock-agentcore.{region}.amazonaws.com" + runtime_url = f"{base_url}/runtimes/{escaped_arn}/invocations" + + # Payload with bearer token for Gateway calls + payload = { + "prompt": "Hello, can you introduce yourself?", + "bearer_token": bearer_token # Pass token in payload for agent to use with Gateway + } + + # Generate session ID + session_id = f"test-session-{uuid.uuid4().hex}" + + print(f"\nšŸ“¤ Sending request...") + print(f" URL: {runtime_url}") + print(f" Prompt: {payload['prompt']}") + print(f" Session ID: {session_id}") + print(f" Bearer token: {bearer_token[:20]}...") + + # Make direct HTTPS request with OAuth bearer token + # The runtime is configured for JWT auth, so we must use Authorization header + headers = { + 'Authorization': f'Bearer {bearer_token}', + 'Content-Type': 'application/json', + 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id': session_id + } + + response = requests.post( + runtime_url, + headers=headers, + params={'qualifier': 'DEFAULT'}, + json=payload, + timeout=60 # Increased timeout for agent processing + ) + + response.raise_for_status() + response_data = response.json() + + print(f"\nāœ… Agent response:") + print(json.dumps(response_data, indent=2)) + return True + + except Exception as e: + print(f"\nāŒ Error: {e}") + if hasattr(e, 'response') and e.response is not None: + print(f" Status: {e.response.status_code}") + print(f" Response: {e.response.text}") + import traceback + traceback.print_exc() + return False + +if __name__ == "__main__": + success = test_agent_simple() + print("\n" + "=" * 60) + if success: + print("āœ… Simple test passed!") + else: + print("āŒ Simple test failed") + print("=" * 60) diff --git a/02-use-cases/lakehouse-agent/test/test_e2e_flow.py b/02-use-cases/lakehouse-agent/test/test_e2e_flow.py new file mode 100644 index 00000000..1c863e24 --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/test_e2e_flow.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +""" +Test end-to-end flow: Cognito Token → Runtime → Agent → Gateway → MCP Server +""" +import json +import requests +from config import config + +def get_cognito_token(): + """Get Cognito bearer token using client_credentials flow""" + print("šŸ”‘ Getting Cognito bearer token...") + + cognito_domain = config.COGNITO_DOMAIN + client_id = config.COGNITO_APP_CLIENT_ID + client_secret = config.COGNITO_APP_CLIENT_SECRET + scope = config.COGNITO_SCOPE_QUERY + + # Fix scope format: replace slashes with dots + scope = scope.replace('/claims/', '/claims.') + + print(f" Domain: {cognito_domain}") + print(f" Client ID: {client_id}") + print(f" Scope: {scope}") + + token_url = f"{cognito_domain}/oauth2/token" + data = { + "grant_type": "client_credentials", + "client_id": client_id, + "client_secret": client_secret, + "scope": scope + } + + try: + response = requests.post(token_url, data=data, timeout=10) + response.raise_for_status() + token = response.json().get("access_token") + print(f"āœ… Token obtained: {token[:20]}...") + return token + except Exception as e: + print(f"āŒ Failed to get token: {e}") + # Print response details for debugging + if hasattr(e, 'response') and e.response is not None: + print(f" Response status: {e.response.status_code}") + print(f" Response body: {e.response.text}") + return None + +def invoke_agent_runtime(bearer_token: str, prompt: str = "Show me all my claims"): + """Invoke the lakehouse agent runtime with bearer token via JWT authentication""" + print(f"\nšŸ¤– Invoking agent runtime...") + print(f" Prompt: {prompt}") + + runtime_id = config.RUNTIME_ID + region = config.AWS_REGION + + try: + # Build runtime endpoint URL using the correct format + # Format: https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{escaped_arn}/invocations + runtime_arn = config.RUNTIME_ARN + escaped_arn = requests.utils.quote(runtime_arn, safe='') + base_url = f"https://bedrock-agentcore.{region}.amazonaws.com" + runtime_url = f"{base_url}/runtimes/{escaped_arn}/invocations" + + # Payload with bearer token for Gateway calls + payload = { + "prompt": prompt, + "bearer_token": bearer_token # Pass token in payload for agent to use with Gateway + } + + print(f" Runtime URL: {runtime_url}") + print(f" Bearer token: {bearer_token[:20]}...") + + # Generate a session ID that meets the minimum length requirement (33 chars) + import uuid + session_id = f"test-session-{uuid.uuid4().hex}" + + # Make direct HTTPS request with OAuth bearer token + # The runtime is configured for JWT auth, so we must use Authorization header + headers = { + 'Authorization': f'Bearer {bearer_token}', + 'Content-Type': 'application/json', + 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id': session_id + } + + response = requests.post( + runtime_url, + headers=headers, + params={'qualifier': 'DEFAULT'}, + json=payload, + timeout=30 + ) + + response.raise_for_status() + response_data = response.json() + + print(f"\nāœ… Agent response:") + print(json.dumps(response_data, indent=2)) + return response_data + + except Exception as e: + print(f"\nāŒ Error invoking agent: {e}") + if hasattr(e, 'response') and e.response is not None: + print(f" Status: {e.response.status_code}") + print(f" Response: {e.response.text}") + import traceback + traceback.print_exc() + return None + +def main(): + print("=" * 60) + print("🧪 Testing End-to-End Flow") + print("=" * 60) + + # Step 1: Get Cognito token + token = get_cognito_token() + if not token: + print("\nāŒ Cannot proceed without token") + return + + # Step 2: Invoke agent runtime with token + response = invoke_agent_runtime(token) + + if response: + print("\n" + "=" * 60) + print("āœ… End-to-end test completed!") + print("=" * 60) + else: + print("\n" + "=" * 60) + print("āŒ End-to-end test failed") + print("=" * 60) + +if __name__ == "__main__": + main() diff --git a/02-use-cases/lakehouse-agent/test/test_e2e_with_user.py b/02-use-cases/lakehouse-agent/test/test_e2e_with_user.py new file mode 100644 index 00000000..d6a15386 --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/test_e2e_with_user.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +""" +End-to-End Test with User Authentication for RLS + +This test uses actual user credentials (not client_credentials) to test +row-level security with proper user identity. +""" +import sys +import requests +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from aws_session_utils import get_aws_session + +def main(): + session, region, account_id = get_aws_session() + ssm = session.client('ssm', region_name=region) + + print('='*70) + print('E2E TEST WITH USER AUTHENTICATION') + print('='*70) + print() + + # Get configuration + print('Loading configuration from SSM...') + + runtime_arn = ssm.get_parameter(Name='/app/lakehouse-agent/agent-runtime-id')['Parameter']['Value'] + cognito_domain = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-domain')['Parameter']['Value'] + client_id = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-id')['Parameter']['Value'] + client_secret = ssm.get_parameter(Name='/app/lakehouse-agent/cognito-app-client-secret', WithDecryption=True)['Parameter']['Value'] + + # Get test user credentials + test_user = ssm.get_parameter(Name='/app/lakehouse-agent/test-user-3')['Parameter']['Value'] + test_password = ssm.get_parameter(Name='/app/lakehouse-agent/test-password', WithDecryption=True)['Parameter']['Value'] + + print(f'āœ… Runtime: {runtime_arn}') + print(f'āœ… Test User: {test_user}') + print() + + # Get user token using Resource Owner Password Credentials flow + print('šŸ”‘ Getting user token (ROPC flow)...') + + token_url = f'{cognito_domain}/oauth2/token' + + try: + response = requests.post( + token_url, + auth=(client_id, client_secret), + data={ + 'grant_type': 'password', + 'username': test_user, + 'password': test_password, + 'scope': 'lakehouse-api/claims.query openid email profile' + }, + headers={'Content-Type': 'application/x-www-form-urlencoded'} + ) + + if response.status_code == 200: + token_data = response.json() + access_token = token_data['access_token'] + id_token = token_data.get('id_token') + + print(f'āœ… Access token obtained') + if id_token: + print(f'āœ… ID token obtained') + + # Decode token to show user identity + import base64 + import json + + def decode_jwt(token): + parts = token.split('.') + if len(parts) == 3: + payload = parts[1] + payload += '=' * (4 - len(payload) % 4) + decoded = base64.urlsafe_b64decode(payload) + return json.loads(decoded) + return {} + + access_claims = decode_jwt(access_token) + print(f'\nšŸ” Access Token Claims:') + print(f' Username: {access_claims.get("username", "N/A")}') + print(f' Email: {access_claims.get("email", "N/A")}') + print(f' Scope: {access_claims.get("scope", "N/A")}') + + if id_token: + id_claims = decode_jwt(id_token) + print(f'\nšŸ” ID Token Claims:') + print(f' Email: {id_claims.get("email", "N/A")}') + print(f' Email Verified: {id_claims.get("email_verified", "N/A")}') + + # Use ID token if available (contains more user info), otherwise access token + bearer_token = id_token if id_token else access_token + + else: + print(f'āŒ Failed to get token: HTTP {response.status_code}') + print(f' Response: {response.text}') + + # Try client_credentials as fallback + print(f'\nāš ļø Falling back to client_credentials flow...') + response = requests.post( + token_url, + data={ + 'grant_type': 'client_credentials', + 'client_id': client_id, + 'client_secret': client_secret, + 'scope': 'lakehouse-api/claims.query' + } + ) + + if response.status_code == 200: + bearer_token = response.json()['access_token'] + print(f'āœ… Got client_credentials token (no user identity for RLS)') + else: + print(f'āŒ Failed: {response.text}') + return False + + except Exception as e: + print(f'āŒ Error getting token: {e}') + import traceback + traceback.print_exc() + return False + + # Invoke agent + print(f'\nšŸ¤– Invoking agent with user token...') + + import urllib.parse + encoded_arn = urllib.parse.quote(f'arn:aws:bedrock-agentcore:{region}:{account_id}:runtime/{runtime_arn}', safe='') + runtime_url = f'https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{encoded_arn}/invocations' + + try: + response = requests.post( + runtime_url, + json={ + 'input': 'Show me all my claims', + 'sessionId': f'test-session-{test_user.replace("@", "-at-")}' + }, + headers={ + 'Authorization': f'Bearer {bearer_token}', + 'Content-Type': 'application/json' + }, + timeout=60 + ) + + if response.status_code == 200: + result = response.json() + + print(f'āœ… Agent response received') + print(f'\nResponse:') + print(f' Content: {result.get("content", "N/A")[:200]}...') + print(f' Tool Calls: {result.get("tool_calls", 0)}') + + if result.get('tool_calls', 0) > 0: + print(f'\nāœ…āœ…āœ… SUCCESS: Tools were invoked!') + print(f'\nWith user identity: {test_user}') + print(f'RLS should be applied based on this user') + else: + print(f'\nāŒ FAIL: No tools invoked') + print(f' Check MCP server logs for errors') + + return result.get('tool_calls', 0) > 0 + + else: + print(f'āŒ Agent invocation failed: HTTP {response.status_code}') + print(f' Response: {response.text}') + return False + + except Exception as e: + print(f'āŒ Error invoking agent: {e}') + import traceback + traceback.print_exc() + return False + + +if __name__ == '__main__': + success = main() + sys.exit(0 if success else 1) diff --git a/02-use-cases/lakehouse-agent/test/test_ssm_validation.py b/02-use-cases/lakehouse-agent/test/test_ssm_validation.py new file mode 100644 index 00000000..6ace08ab --- /dev/null +++ b/02-use-cases/lakehouse-agent/test/test_ssm_validation.py @@ -0,0 +1,628 @@ +#!/usr/bin/env python3 +""" +Comprehensive validation test for SSM migration implementation. + +This script validates all aspects of the SSM migration: +1. Migration utility functionality (dry-run) +2. SSM parameter creation and retrieval +3. Application startup with SSM configuration +4. Error handling when SSM unavailable +5. Sensitive parameter encryption +6. Parameter substitution for ARNs +7. IAM permissions validation + +Requirements: 8.1, 8.2, 8.3, 8.4, 8.5 +""" + +import sys +import os +import tempfile +from pathlib import Path +from typing import Dict, List, Tuple +import boto3 +from botocore.exceptions import ClientError, NoCredentialsError + +# Add current directory to path +sys.path.insert(0, str(Path(__file__).parent)) + +from ssm_config import SSMConfigLoader +from ssm_migrate import SSMMigrationUtility, MigrationResult +from config import Config + + +class ValidationTest: + """Comprehensive validation test suite for SSM migration.""" + + def __init__(self): + self.results: List[Tuple[str, bool, str]] = [] + self.test_prefix = 'lh_test_' + self.cleanup_params: List[str] = [] + + def log_result(self, test_name: str, passed: bool, message: str = ""): + """Log a test result.""" + status = "āœ… PASS" if passed else "āŒ FAIL" + self.results.append((test_name, passed, message)) + print(f"{status}: {test_name}") + if message: + print(f" {message}") + + def print_summary(self): + """Print test summary.""" + print("\n" + "=" * 70) + print("VALIDATION TEST SUMMARY") + print("=" * 70) + + passed = sum(1 for _, p, _ in self.results if p) + total = len(self.results) + + print(f"\nTotal Tests: {total}") + print(f"Passed: {passed}") + print(f"Failed: {total - passed}") + print(f"Success Rate: {(passed/total*100):.1f}%\n") + + if total - passed > 0: + print("Failed Tests:") + for name, passed, msg in self.results: + if not passed: + print(f" āŒ {name}") + if msg: + print(f" {msg}") + + print("=" * 70 + "\n") + + return passed == total + + def test_1_ssm_connectivity(self) -> bool: + """Test 1: Verify SSM connectivity and IAM permissions.""" + print("\n" + "=" * 70) + print("TEST 1: SSM Connectivity and IAM Permissions") + print("=" * 70 + "\n") + + try: + loader = SSMConfigLoader() + + # Test SSM availability + is_available = loader.is_available() + self.log_result( + "SSM Parameter Store is accessible", + is_available, + "Check AWS credentials and IAM permissions" if not is_available else "" + ) + + if not is_available: + return False + + # Test region detection + region = loader.get_region() + self.log_result( + "AWS region auto-detection", + bool(region), + f"Detected region: {region}" + ) + + # Test account ID detection + account_id = loader.get_account_id() + self.log_result( + "AWS account ID auto-detection", + bool(account_id) and account_id.isdigit(), + f"Detected account ID: {account_id}" + ) + + return True + + except Exception as e: + self.log_result("SSM connectivity test", False, str(e)) + return False + + def test_2_migration_utility_dry_run(self) -> bool: + """Test 2: Run migration utility in dry-run mode.""" + print("\n" + "=" * 70) + print("TEST 2: Migration Utility (Dry-Run)") + print("=" * 70 + "\n") + + try: + # Create a temporary .env file for testing + with tempfile.NamedTemporaryFile(mode='w', suffix='.env', delete=False) as f: + env_file = Path(f.name) + f.write("# Test configuration\n") + f.write("TEST_PARAM_1=value1\n") + f.write("TEST_PARAM_2=value2\n") + f.write("TEST_SECRET_KEY=secret123\n") + f.write("AWS_REGION=us-east-1\n") # Should be skipped + f.write("AWS_ACCOUNT_ID=XXXXXXXXXXXX\n") # Should be skipped + + try: + utility = SSMMigrationUtility(prefix=self.test_prefix) + + # Run dry-run migration + result = utility.migrate_env_to_ssm( + env_file=env_file, + overwrite=False, + dry_run=True + ) + + # Verify dry-run results + self.log_result( + "Dry-run migration executed", + True, + f"Would create/update {len(result.created) + len(result.updated)} parameters" + ) + + # Verify AWS_REGION and AWS_ACCOUNT_ID are skipped + skipped_auto = any('auto-detected' in s for s in result.skipped) + self.log_result( + "Auto-detected parameters skipped", + skipped_auto, + f"Skipped: {[s for s in result.skipped if 'auto-detected' in s]}" + ) + + # Verify no failures in dry-run + self.log_result( + "No failures in dry-run", + len(result.failed) == 0, + f"Failures: {result.failed}" if result.failed else "" + ) + + return True + + finally: + # Clean up temp file + env_file.unlink() + + except Exception as e: + self.log_result("Migration utility dry-run", False, str(e)) + return False + + def test_3_parameter_creation(self) -> bool: + """Test 3: Create test parameters and verify they exist.""" + print("\n" + "=" * 70) + print("TEST 3: SSM Parameter Creation and Retrieval") + print("=" * 70 + "\n") + + try: + loader = SSMConfigLoader(prefix=self.test_prefix) + ssm_client = loader._ssm_client + + # Create test parameters + test_params = { + 'TEST_STRING_PARAM': ('test_value', 'String'), + 'TEST_SECRET_KEY': ('secret_value', 'SecureString'), + 'TEST_ARN_PARAM': ('arn:aws:service:${AWS_REGION}:${AWS_ACCOUNT_ID}:resource', 'String'), + } + + for key, (value, param_type) in test_params.items(): + ssm_name = loader._config_key_to_ssm_name(key) + self.cleanup_params.append(ssm_name) + + try: + ssm_client.put_parameter( + Name=ssm_name, + Value=value, + Type=param_type, + Overwrite=True, + Description=f"Test parameter: {key}" + ) + self.log_result( + f"Created parameter: {key}", + True, + f"SSM name: {ssm_name}, Type: {param_type}" + ) + except Exception as e: + self.log_result(f"Create parameter: {key}", False, str(e)) + return False + + # Verify parameters can be retrieved + loader.clear_cache() # Clear cache to force SSM retrieval + + for key, (expected_value, _) in test_params.items(): + retrieved_value = loader.get_parameter(key) + matches = retrieved_value == expected_value + self.log_result( + f"Retrieved parameter: {key}", + matches, + f"Expected: {expected_value}, Got: {retrieved_value}" if not matches else "" + ) + + return True + + except Exception as e: + self.log_result("Parameter creation test", False, str(e)) + return False + + def test_4_sensitive_parameter_encryption(self) -> bool: + """Test 4: Verify sensitive parameters use SecureString type.""" + print("\n" + "=" * 70) + print("TEST 4: Sensitive Parameter Encryption") + print("=" * 70 + "\n") + + try: + loader = SSMConfigLoader(prefix=self.test_prefix) + ssm_client = loader._ssm_client + + # Check if TEST_SECRET_KEY is SecureString + ssm_name = loader._config_key_to_ssm_name('TEST_SECRET_KEY') + + response = ssm_client.get_parameter(Name=ssm_name, WithDecryption=False) + param_type = response['Parameter']['Type'] + + is_secure = param_type == 'SecureString' + self.log_result( + "Sensitive parameter uses SecureString", + is_secure, + f"Parameter type: {param_type}" + ) + + # Test sensitive parameter detection + test_cases = [ + ('MY_SECRET_KEY', True), + ('DATABASE_PASSWORD', True), + ('API_KEY', True), + ('AUTH_TOKEN', True), + ('S3_BUCKET_NAME', False), + ('DATABASE_NAME', False), + ] + + for key, should_be_sensitive in test_cases: + is_sensitive = loader._is_sensitive(key) + matches = is_sensitive == should_be_sensitive + self.log_result( + f"Sensitive detection: {key}", + matches, + f"Expected: {should_be_sensitive}, Got: {is_sensitive}" if not matches else "" + ) + + return True + + except Exception as e: + self.log_result("Sensitive parameter encryption test", False, str(e)) + return False + + def test_5_parameter_substitution(self) -> bool: + """Test 5: Verify parameter substitution for ARNs.""" + print("\n" + "=" * 70) + print("TEST 5: Parameter Substitution") + print("=" * 70 + "\n") + + try: + loader = SSMConfigLoader(prefix=self.test_prefix) + + # Get the ARN parameter with placeholders + arn_value = loader.get_parameter('TEST_ARN_PARAM') + + # Create a minimal config-like object for substitution + class TestConfig: + def __init__(self): + self.AWS_REGION = loader.get_region() + self.AWS_ACCOUNT_ID = loader.get_account_id() + + def _substitute_variables(self, value: str) -> str: + if '${AWS_ACCOUNT_ID}' in value: + value = value.replace('${AWS_ACCOUNT_ID}', self.AWS_ACCOUNT_ID) + if '${AWS_REGION}' in value: + value = value.replace('${AWS_REGION}', self.AWS_REGION) + return value + + test_config = TestConfig() + substituted = test_config._substitute_variables(arn_value) + + # Verify substitution occurred + has_placeholders = '${' in substituted + self.log_result( + "Parameter substitution removes placeholders", + not has_placeholders, + f"Result: {substituted}" + ) + + # Verify correct values were substituted + contains_region = test_config.AWS_REGION in substituted + contains_account = test_config.AWS_ACCOUNT_ID in substituted + + self.log_result( + "Substitution includes AWS_REGION", + contains_region, + f"Region: {test_config.AWS_REGION}" + ) + + self.log_result( + "Substitution includes AWS_ACCOUNT_ID", + contains_account, + f"Account ID: {test_config.AWS_ACCOUNT_ID}" + ) + + return True + + except Exception as e: + self.log_result("Parameter substitution test", False, str(e)) + return False + + def test_6_config_initialization(self) -> bool: + """Test 6: Test application startup with SSM configuration.""" + print("\n" + "=" * 70) + print("TEST 6: Application Configuration Initialization") + print("=" * 70 + "\n") + + try: + # Note: This will use the actual lh_ prefix, not test prefix + # We're testing that the Config class can initialize + + config = Config() + + # Verify config loaded + self.log_result( + "Config class initialized", + config._loaded, + "Configuration loaded from SSM" + ) + + # Verify AWS credentials auto-detected + has_region = bool(config.AWS_REGION) + has_account = bool(config.AWS_ACCOUNT_ID) + + self.log_result( + "AWS_REGION auto-detected", + has_region, + f"Region: {config.AWS_REGION}" + ) + + self.log_result( + "AWS_ACCOUNT_ID auto-detected", + has_account, + f"Account ID: {config.AWS_ACCOUNT_ID}" + ) + + # Test get() method + region_via_get = config.get('AWS_REGION') + self.log_result( + "Config.get() method works", + region_via_get == config.AWS_REGION, + f"Retrieved: {region_via_get}" + ) + + return True + + except Exception as e: + self.log_result("Config initialization test", False, str(e)) + return False + + def test_7_error_handling(self) -> bool: + """Test 7: Test error handling when SSM unavailable.""" + print("\n" + "=" * 70) + print("TEST 7: Error Handling") + print("=" * 70 + "\n") + + try: + loader = SSMConfigLoader(prefix=self.test_prefix) + + # Test getting non-existent parameter with default + default_value = "default_value" + result = loader.get_parameter('NONEXISTENT_PARAM', default=default_value) + + self.log_result( + "Non-existent parameter returns default", + result == default_value, + f"Expected: {default_value}, Got: {result}" + ) + + # Test parameter name conversion + test_key = "MY_TEST_PARAMETER" + expected_ssm_name = f"{self.test_prefix}my_test_parameter" + actual_ssm_name = loader._config_key_to_ssm_name(test_key) + + self.log_result( + "Parameter name conversion", + actual_ssm_name == expected_ssm_name, + f"Expected: {expected_ssm_name}, Got: {actual_ssm_name}" + ) + + # Test cache functionality + loader.clear_cache() + self.log_result( + "Cache clear functionality", + len(loader._cache) == 0, + "Cache cleared successfully" + ) + + return True + + except Exception as e: + self.log_result("Error handling test", False, str(e)) + return False + + def test_8_export_functionality(self) -> bool: + """Test 8: Test export functionality.""" + print("\n" + "=" * 70) + print("TEST 8: Export Functionality") + print("=" * 70 + "\n") + + try: + utility = SSMMigrationUtility(prefix=self.test_prefix) + + # Export to temporary file + with tempfile.NamedTemporaryFile(mode='w', suffix='.env', delete=False) as f: + output_file = Path(f.name) + + try: + # Export without secrets + count = utility.export_ssm_to_env( + output_file=output_file, + include_secrets=False + ) + + self.log_result( + "Export executed successfully", + count > 0, + f"Exported {count} parameters" + ) + + # Verify file was created + exists = output_file.exists() + self.log_result( + "Export file created", + exists, + f"File: {output_file}" + ) + + if exists: + # Read and verify content + content = output_file.read_text() + + # Should contain AWS_REGION and AWS_ACCOUNT_ID + has_region = 'AWS_REGION=' in content + has_account = 'AWS_ACCOUNT_ID=' in content + + self.log_result( + "Export includes AWS_REGION", + has_region + ) + + self.log_result( + "Export includes AWS_ACCOUNT_ID", + has_account + ) + + # Should mask secrets + has_masked = '***MASKED***' in content + self.log_result( + "Sensitive values masked in export", + has_masked, + "Secrets are properly masked" + ) + + return True + + finally: + # Clean up + if output_file.exists(): + output_file.unlink() + + except Exception as e: + self.log_result("Export functionality test", False, str(e)) + return False + + def test_9_validation_utility(self) -> bool: + """Test 9: Test validation utility.""" + print("\n" + "=" * 70) + print("TEST 9: Validation Utility") + print("=" * 70 + "\n") + + try: + utility = SSMMigrationUtility(prefix=self.test_prefix) + + # Run validation + results = utility.validate_ssm_parameters(verbose=False) + + self.log_result( + "Validation utility executed", + isinstance(results, dict), + f"Checked {len(results)} parameters" + ) + + # Note: Validation may fail if required parameters don't exist + # This is expected for test prefix + self.log_result( + "Validation returns results dictionary", + True, + "Validation completed" + ) + + return True + + except Exception as e: + self.log_result("Validation utility test", False, str(e)) + return False + + def cleanup(self): + """Clean up test parameters.""" + print("\n" + "=" * 70) + print("CLEANUP: Removing Test Parameters") + print("=" * 70 + "\n") + + if not self.cleanup_params: + print("No parameters to clean up") + return + + try: + loader = SSMConfigLoader(prefix=self.test_prefix) + ssm_client = loader._ssm_client + + for param_name in self.cleanup_params: + try: + ssm_client.delete_parameter(Name=param_name) + print(f"āœ… Deleted: {param_name}") + except ClientError as e: + if e.response.get('Error', {}).get('Code') == 'ParameterNotFound': + print(f"ā­ļø Already deleted: {param_name}") + else: + print(f"āŒ Failed to delete: {param_name} - {e}") + + except Exception as e: + print(f"āŒ Cleanup error: {e}") + + def run_all_tests(self) -> bool: + """Run all validation tests.""" + print("\n" + "=" * 70) + print("SSM MIGRATION VALIDATION TEST SUITE") + print("=" * 70) + print("\nThis test suite validates all requirements for task 10:") + print(" - Migration utility functionality") + print(" - SSM parameter creation and retrieval") + print(" - Application startup with SSM configuration") + print(" - Error handling") + print(" - Sensitive parameter encryption") + print(" - Parameter substitution") + print(" - IAM permissions validation") + print("\n") + + try: + # Run tests in sequence + self.test_1_ssm_connectivity() + self.test_2_migration_utility_dry_run() + self.test_3_parameter_creation() + self.test_4_sensitive_parameter_encryption() + self.test_5_parameter_substitution() + self.test_6_config_initialization() + self.test_7_error_handling() + self.test_8_export_functionality() + self.test_9_validation_utility() + + # Print summary + all_passed = self.print_summary() + + return all_passed + + finally: + # Always cleanup + self.cleanup() + + +def main(): + """Main entry point.""" + validator = ValidationTest() + + try: + all_passed = validator.run_all_tests() + + if all_passed: + print("\nšŸŽ‰ All validation tests passed!") + print("The SSM migration implementation is ready for production use.") + sys.exit(0) + else: + print("\nāš ļø Some validation tests failed.") + print("Please review the failures above and address any issues.") + sys.exit(1) + + except KeyboardInterrupt: + print("\n\nāŒ Tests cancelled by user") + validator.cleanup() + sys.exit(130) + + except Exception as e: + print(f"\nāŒ Unexpected error: {e}") + import traceback + traceback.print_exc() + validator.cleanup() + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/utils/__init__.py b/02-use-cases/lakehouse-agent/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/02-use-cases/lakehouse-agent/utils/aws_session_utils.py b/02-use-cases/lakehouse-agent/utils/aws_session_utils.py new file mode 100644 index 00000000..89aa2709 --- /dev/null +++ b/02-use-cases/lakehouse-agent/utils/aws_session_utils.py @@ -0,0 +1,548 @@ +#!/usr/bin/env python3 +""" +AWS Session Utility for SSO-aware boto3 Session Creation + +This module provides a centralized way to create and validate AWS sessions, +with special handling for AWS SSO authentication. It addresses common issues +with SSO token expiration and profile detection. + +Features: +- Automatic fallback from expired .env credentials to AWS SSO profiles +- Clear error messages with remediation steps +- Support for container IAM roles (Lambda, ECS, EKS) +- Flexible credential priority: Container IAM > Env vars > SSO profiles + +Usage: + from utils.aws_session_utils import get_aws_session, load_env_credentials + + # Load credentials from .env file and get session + # If .env credentials are invalid/expired, automatically falls back to SSO + load_env_credentials() + session, region, account_id = get_aws_session() + + # Auto-detect profile from environment + session, region, account_id = get_aws_session() + + # Use specific profile + session, region, account_id = get_aws_session(profile_name='myprofile') + + # Specify region + session, region, account_id = get_aws_session(region_name='us-west-2') +""" + +import boto3 +import os +import sys +from pathlib import Path +from typing import Tuple, Optional +from botocore.exceptions import ( + NoCredentialsError, + ProfileNotFound, + ClientError, + TokenRetrievalError, + SSOTokenLoadError +) + + +def load_env_credentials(env_path: str = '.env', verbose: bool = True) -> bool: + """ + Load AWS credentials from .env file into environment variables. + + This function loads environment variables from a .env file, making them + available to boto3 and other AWS tools. It's designed to work seamlessly + with the get_aws_session() function. + + Args: + env_path: Path to the .env file. Default is '.env' in current directory. + verbose: If True, print status messages. Default True. + + Returns: + bool: True if credentials were loaded successfully, False otherwise. + + Example: + >>> from utils.aws_session_utils import load_env_credentials, get_aws_session + >>> load_env_credentials() + >>> session, region, account_id = get_aws_session() + """ + env_file = Path(env_path) + if not env_file.exists(): + if verbose: + print(f"āš ļø .env file not found at {env_path}") + return False + + loaded_vars = [] + try: + with open(env_file, 'r') as f: + for line in f: + line = line.strip() + if line and not line.startswith('#') and '=' in line: + key, value = line.split('=', 1) + key = key.strip() + value = value.strip().strip('"').strip("'") + if value: # Only set non-empty values + os.environ[key] = value + loaded_vars.append(key) + except Exception as e: + if verbose: + print(f"āŒ Error reading .env file: {e}") + return False + + if loaded_vars: + if verbose: + print(f"āœ… Loaded {len(loaded_vars)} variables from .env file:") + for var in loaded_vars: + if any(keyword in var.upper() for keyword in ['SECRET', 'TOKEN', 'PASSWORD']): + print(f" {var}: ****** (hidden)") + else: + print(f" {var}: {os.environ[var]}") + + # Validate AWS credentials were loaded + aws_vars = ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'AWS_DEFAULT_REGION'] + has_credentials = bool( + os.environ.get('AWS_ACCESS_KEY_ID') and + os.environ.get('AWS_SECRET_ACCESS_KEY') + ) + + if verbose: + print("\nCurrent AWS environment variables:") + for key in aws_vars: + value = os.environ.get(key) + if value: + if any(keyword in key for keyword in ['SECRET', 'TOKEN']): + print(f" {key}: {'*' * min(len(value), 20)} (hidden)") + else: + print(f" {key}: {value}") + else: + print(f" {key}: Not set") + + if has_credentials: + if verbose: + print("\nāœ… AWS credentials loaded successfully!") + return True + else: + if verbose: + print("\nāš ļø AWS credentials not found in .env file") + print(" Make sure your .env file contains:") + print(" AWS_ACCESS_KEY_ID=your-access-key") + print(" AWS_SECRET_ACCESS_KEY=your-secret-key") + print(" AWS_SESSION_TOKEN=your-session-token (if using STS)") + print(" AWS_DEFAULT_REGION=your-region") + return False + else: + if verbose: + print("āš ļø No valid environment variables found in .env file") + return False + + +def get_aws_session( + profile_name: Optional[str] = None, + region_name: Optional[str] = None, + verbose: bool = True +) -> Tuple[boto3.Session, str, str]: + """ + Create and validate AWS session with SSO support and automatic fallback. + + This function: + 1. Detects AWS profile from environment variables or parameters + 2. Creates boto3 session with correct profile + 3. Validates credentials are available and not expired + 4. Automatically falls back to AWS SSO/profile if environment credentials fail + 5. Provides clear error messages with remediation steps + + Credential priority order: + 1. Container IAM role (if running in Lambda/ECS/EKS) + 2. Environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) + - If invalid/expired, automatically clears them and falls back to SSO + 3. AWS SSO profile (from AWS_PROFILE or AWS_DEFAULT_PROFILE) + 4. Default AWS credentials + + Args: + profile_name: Optional AWS profile name to use. If not provided, + will check AWS_PROFILE and AWS_DEFAULT_PROFILE env vars. + region_name: Optional AWS region. If not provided, will auto-detect + from session, environment, or use us-east-1 default. + verbose: If True, print status messages. Default True. + + Returns: + Tuple of (boto3.Session, region_name: str, account_id: str) + + Raises: + ValueError: If container credentials validation fails + SystemExit: On unrecoverable authentication errors when no fallback available + + Examples: + >>> session, region, account = get_aws_session() + >>> s3_client = session.client('s3', region_name=region) + + >>> session, region, account = get_aws_session(profile_name='prod') + """ + + # Check if running in container/Lambda environment + # In these environments, IAM roles provide credentials automatically + is_container = any([ + os.environ.get('AWS_EXECUTION_ENV'), # Lambda, ECS, etc. + os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'), # ECS + os.environ.get('AWS_CONTAINER_CREDENTIALS_FULL_URI'), # ECS + os.environ.get('ECS_CONTAINER_METADATA_URI'), # ECS + os.environ.get('K8S_AWS_ROLE_ARN'), # Kubernetes + ]) + + if is_container and not profile_name: + # In container environment, use simple session with IAM role credentials + if verbose: + print("šŸ” Container environment detected - using IAM role credentials") + + region = _detect_region_simple(region_name) + session = boto3.Session(region_name=region) + + try: + sts_client = session.client('sts', region_name=region) + account_id = sts_client.get_caller_identity()['Account'] + + if verbose: + print(f"āœ… Container credentials validated") + print(f" Region: {region}") + print(f" Account ID: {account_id}") + + return session, region, account_id + except Exception as e: + print(f"āŒ Failed to validate container credentials: {e}") + # In container, let the error propagate rather than SystemExit + raise ValueError(f"Container credential validation failed: {e}") from e + + # Check if we have environment variables (from .env or terminal) + # This takes precedence over SSO profiles + has_env_credentials = bool( + os.environ.get('AWS_ACCESS_KEY_ID') and + os.environ.get('AWS_SECRET_ACCESS_KEY') + ) + + if has_env_credentials: + # Use environment variables directly (bypasses SSO) + if verbose: + print("šŸ”‘ Using AWS credentials from environment variables") + + # Detect region from multiple sources with proper priority + # 1. Explicit parameter, 2. Environment vars, 3. AWS config, 4. Default + if region_name: + region = region_name + else: + # Try environment variables first + region = os.environ.get('AWS_DEFAULT_REGION') or os.environ.get('AWS_REGION') + if not region: + # Try to get from AWS config (without credentials first) + try: + temp_session = boto3.Session() + region = temp_session.region_name + except: + pass + # Final fallback + if not region: + region = 'us-east-1' + + # Create session with environment credentials + session = boto3.Session( + aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'), + aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'), + aws_session_token=os.environ.get('AWS_SESSION_TOKEN'), # Optional for STS + region_name=region + ) + + # Validate credentials + try: + sts_client = session.client('sts', region_name=region) + identity = sts_client.get_caller_identity() + account_id = identity['Account'] + + if verbose: + print(f"āœ… AWS credentials validated") + print(f" Account ID: {account_id}") + print(f" Region: {region}") + print(f" User ARN: {identity['Arn']}") + + return session, region, account_id + except Exception as e: + if verbose: + print(f"āš ļø Environment credentials validation failed: {e}") + print(" Clearing invalid environment credentials...") + print(" Attempting fallback to AWS profile/SSO...\n") + + # Clear invalid environment credentials to allow fallback + cleared_keys = [] + for key in ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN']: + if key in os.environ: + del os.environ[key] + cleared_keys.append(key) + + if verbose and cleared_keys: + print(f" Cleared: {', '.join(cleared_keys)}") + + # Don't raise - fall through to profile/SSO section below + + # Determine which profile to use (for local development) + detected_profile = _detect_profile(profile_name, verbose) + + # Create session with detected profile + try: + if detected_profile: + session = boto3.Session(profile_name=detected_profile) + else: + session = boto3.Session() + except ProfileNotFound as e: + _print_profile_not_found_error(detected_profile) + raise SystemExit(1) from e + + # Detect region + region = _detect_region(session, region_name, verbose) + + # Recreate session with explicit region if needed + if region and not session.region_name: + if detected_profile: + session = boto3.Session(profile_name=detected_profile, region_name=region) + else: + session = boto3.Session(region_name=region) + + # Validate credentials + try: + credentials = session.get_credentials() + if not credentials: + _print_no_credentials_error(detected_profile) + raise SystemExit(1) + + # Test credentials by getting account ID + sts_client = session.client('sts', region_name=region) + account_id = sts_client.get_caller_identity()['Account'] + + except (TokenRetrievalError, SSOTokenLoadError) as e: + _print_sso_token_expired_error(detected_profile, region, str(e)) + raise SystemExit(1) from e + except NoCredentialsError as e: + _print_no_credentials_error(detected_profile) + raise SystemExit(1) from e + except ClientError as e: + if 'ExpiredToken' in str(e) or 'InvalidToken' in str(e): + _print_sso_token_expired_error(detected_profile, region, str(e)) + raise SystemExit(1) from e + else: + print(f"\nāŒ AWS API Error: {e}") + raise SystemExit(1) from e + except Exception as e: + print(f"\nāŒ Unexpected error validating AWS credentials: {e}") + print(f" Error type: {type(e).__name__}") + raise SystemExit(1) from e + + # Print success message + if verbose: + _print_success_message(detected_profile, region, account_id, credentials) + + return session, region, account_id + + +def _detect_profile(profile_name: Optional[str], verbose: bool) -> Optional[str]: + """Detect which AWS profile to use.""" + if profile_name: + if verbose: + print(f"šŸ” Using specified profile: {profile_name}") + return profile_name + + # Check environment variables in order of precedence + env_profile = os.environ.get('AWS_PROFILE') or os.environ.get('AWS_DEFAULT_PROFILE') + + if env_profile: + if verbose: + env_var = 'AWS_PROFILE' if os.environ.get('AWS_PROFILE') else 'AWS_DEFAULT_PROFILE' + print(f"šŸ” Using profile from {env_var}: {env_profile}") + return env_profile + + if verbose: + print("šŸ” Using default AWS credentials (no profile specified)") + return None + + +def _detect_region_simple(region_name: Optional[str]) -> str: + """Detect AWS region without session (for container environments).""" + if region_name: + return region_name + + # Try environment variables + region = os.environ.get('AWS_REGION') or os.environ.get('AWS_DEFAULT_REGION') + if region: + return region + + # Try to get from AWS config + try: + temp_session = boto3.Session() + if temp_session.region_name: + return temp_session.region_name + except: + pass + + # Default to us-east-1 as last resort + return 'us-east-1' + + +def _detect_region( + session: boto3.Session, + region_name: Optional[str], + verbose: bool +) -> str: + """Detect AWS region from multiple sources.""" + if region_name: + if verbose: + print(f"šŸŒ Using specified region: {region_name}") + return region_name + + # Try to get from session + region = session.region_name + if region: + if verbose: + print(f"šŸŒ Using region from AWS config: {region}") + return region + + # Try environment variables + region = os.environ.get('AWS_REGION') or os.environ.get('AWS_DEFAULT_REGION') + if region: + env_var = 'AWS_REGION' if os.environ.get('AWS_REGION') else 'AWS_DEFAULT_REGION' + if verbose: + print(f"šŸŒ Using region from {env_var}: {region}") + return region + + # No region found anywhere - use default + region = 'us-east-1' + if verbose: + print(f"āš ļø No AWS region configured, using default: {region}") + print(" To set your region:") + print(" - Environment variable: export AWS_DEFAULT_REGION=your-region") + print(" - AWS CLI: aws configure set region your-region") + return region + + +def _print_success_message( + profile: Optional[str], + region: str, + account_id: str, + credentials +) -> None: + """Print success message with credential info.""" + print("\nāœ… AWS Credentials Validated") + print(f" Region: {region}") + print(f" Account ID: {account_id}") + print(f" Profile: {profile or 'default'}") + + # Try to detect SSO + is_sso = False + try: + if hasattr(credentials, 'method'): + method_str = str(credentials.method).lower() + is_sso = 'sso' in method_str + except: + pass + + if is_sso: + print(" Auth method: AWS SSO") + else: + print(" Auth method: AWS credentials (IAM/access keys)") + print() + + +def _print_no_credentials_error(profile: Optional[str]) -> None: + """Print helpful error message when no credentials are found.""" + print("\n" + "="*70) + print("āŒ AWS CREDENTIALS NOT CONFIGURED") + print("="*70) + print("\nNo AWS credentials were found.") + + if profile: + print(f"\nCurrent profile: {profile}") + print("\nThis profile may not be configured. To set it up:") + print(f" aws configure --profile {profile}") + + print("\nTo configure AWS credentials, use one of these methods:") + print("\n1. AWS SSO (Recommended for organizations):") + print(" aws configure sso") + print(" aws sso login --profile your-profile-name") + print(" export AWS_PROFILE=your-profile-name") + + print("\n2. AWS CLI with access keys:") + print(" aws configure") + + print("\n3. Environment variables:") + print(" export AWS_ACCESS_KEY_ID=your-key") + print(" export AWS_SECRET_ACCESS_KEY=your-secret") + + print("\n4. IAM Role (if running on EC2/ECS/Lambda):") + print(" Credentials are automatically provided") + + print("\n" + "="*70) + + +def _print_sso_token_expired_error( + profile: Optional[str], + region: str, + error_detail: str +) -> None: + """Print helpful error message for SSO token expiration.""" + print("\n" + "="*70) + print("āŒ AWS SSO TOKEN EXPIRED") + print("="*70) + print("\nYour AWS SSO session has expired and needs to be refreshed.") + + if profile: + print(f"\nTo refresh your SSO credentials for profile '{profile}', run:") + print(f" aws sso login --profile {profile}") + + print("\nThen ensure your environment uses this profile:") + print(f" export AWS_PROFILE={profile}") + else: + print("\nTo refresh your SSO credentials, run:") + print(" aws sso login") + + print("\nIf you use a specific profile, specify it:") + print(" aws sso login --profile your-profile-name") + print(" export AWS_PROFILE=your-profile-name") + + print("\nCurrent environment:") + print(f" AWS_PROFILE: {os.environ.get('AWS_PROFILE', 'not set')}") + print(f" AWS_DEFAULT_PROFILE: {os.environ.get('AWS_DEFAULT_PROFILE', 'not set')}") + print(f" AWS_REGION: {region}") + + print("\n" + "="*70) + print(f"Error details: {error_detail}") + print("="*70) + + +def _print_profile_not_found_error(profile: str) -> None: + """Print helpful error message when profile is not found.""" + print("\n" + "="*70) + print(f"āŒ AWS PROFILE NOT FOUND: {profile}") + print("="*70) + + print(f"\nThe AWS profile '{profile}' was not found in your AWS configuration.") + + print("\nTo list available profiles:") + print(" aws configure list-profiles") + + print(f"\nTo create this profile:") + print(f" aws configure --profile {profile}") + + print("\nOr for SSO:") + print(" aws configure sso") + + print("\n" + "="*70) + + +if __name__ == '__main__': + """Test the session utility.""" + print("Testing AWS Session Utility\n") + print("="*70) + + try: + session, region, account_id = get_aws_session() + print("\nāœ… Test successful!") + print(f"\nYou can now use this session to create AWS clients:") + print(f" s3_client = session.client('s3', region_name='{region}')") + print(f" dynamodb = session.resource('dynamodb', region_name='{region}')") + + except SystemExit: + print("\nāŒ Test failed - please fix the errors above and try again") + sys.exit(1) diff --git a/02-use-cases/lakehouse-agent/utils/check_runtime.py b/02-use-cases/lakehouse-agent/utils/check_runtime.py new file mode 100644 index 00000000..607891cf --- /dev/null +++ b/02-use-cases/lakehouse-agent/utils/check_runtime.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +"""Check runtime status""" +import boto3 +import json +from dotenv import load_dotenv +import os + +load_dotenv() + +runtime_id = os.getenv('LAKEHOUSE_AGENT_RUNTIME_ID', 'lakehouse_agent-Hhb3lX6y7M') +region = os.getenv('AWS_REGION', 'us-east-1') + +print(f"Checking runtime: {runtime_id}") +print(f"Region: {region}") + +client = boto3.client('bedrock-agentcore', region_name=region) + +try: + response = client.get_runtime(runtimeIdentifier=runtime_id) + print("\nāœ… Runtime found:") + print(json.dumps(response, indent=2, default=str)) +except Exception as e: + print(f"\nāŒ Error: {e}") + print("\nTrying to list all runtimes...") + try: + response = client.list_runtimes() + print(json.dumps(response, indent=2, default=str)) + except Exception as e2: + print(f"āŒ Error listing runtimes: {e2}") diff --git a/02-use-cases/lakehouse-agent/utils/diagnose_auth_issue.py b/02-use-cases/lakehouse-agent/utils/diagnose_auth_issue.py new file mode 100644 index 00000000..65f465d1 --- /dev/null +++ b/02-use-cases/lakehouse-agent/utils/diagnose_auth_issue.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 +""" +Diagnose JWT Authentication Issue + +This script checks the agent runtime and Cognito configuration to identify +why JWT authentication is failing. +""" + +import boto3 +import json +import base64 + +def decode_jwt_payload(token): + """Decode JWT token payload without verification""" + try: + parts = token.split('.') + if len(parts) != 3: + return None + + payload = parts[1] + padding = 4 - len(payload) % 4 + if padding != 4: + payload += '=' * padding + + decoded = base64.urlsafe_b64decode(payload) + return json.loads(decoded) + except Exception: + return None + +def main(): + print("=" * 80) + print("JWT Authentication Diagnostics") + print("=" * 80) + + session = boto3.Session() + region = session.region_name + ssm = boto3.client('ssm', region_name=region) + + print(f"\nšŸ“ Region: {region}") + + # Check SSM parameters + print("\nšŸ” Checking SSM Parameter Store...") + + params_to_check = [ + '/app/lakehouse-agent/agent-runtime-arn', + '/app/lakehouse-agent/cognito-user-pool-id', + '/app/lakehouse-agent/cognito-app-client-id', + '/app/lakehouse-agent/cognito-region' + ] + + params = {} + missing_params = [] + + for param_name in params_to_check: + try: + value = ssm.get_parameter(Name=param_name)['Parameter']['Value'] + params[param_name] = value + print(f" āœ… {param_name}: {value}") + except ssm.exceptions.ParameterNotFound: + missing_params.append(param_name) + print(f" āŒ {param_name}: NOT FOUND") + + if missing_params: + print(f"\nāŒ Missing SSM parameters!") + print(f"\nšŸ’” Solution:") + print(f" Run the setup scripts in order:") + print(f" 1. python gateway-setup/setup_cognito.py") + print(f" 2. python lakehouse-agent/deploy_lakehouse_agent.py") + return + + # Get agent runtime configuration + print(f"\nšŸ” Checking Agent Runtime Configuration...") + try: + client = boto3.client('bedrock-agentcore-control', region_name=region) + runtime_arn = params['/app/lakehouse-agent/agent-runtime-arn'] + + response = client.get_agent_runtime(agentRuntimeArn=runtime_arn) + runtime_config = response['agentRuntime'] + + if 'authorizerConfiguration' not in runtime_config: + print(f" āŒ No authorizer configuration found!") + print(f" ā„¹ļø Agent is using IAM SigV4 authentication") + print(f"\nšŸ’” Solution:") + print(f" Run: python lakehouse-agent/update_agent_authorizer.py") + return + + auth_config = runtime_config['authorizerConfiguration'] + + if 'customJWTAuthorizer' not in auth_config: + print(f" āŒ No JWT authorizer configured!") + print(f"\nšŸ’” Solution:") + print(f" Run: python lakehouse-agent/update_agent_authorizer.py") + return + + jwt_config = auth_config['customJWTAuthorizer'] + discovery_url = jwt_config.get('discoveryUrl', '') + allowed_clients = jwt_config.get('allowedClients', []) + + print(f" āœ… JWT Authorizer configured") + print(f" Discovery URL: {discovery_url}") + print(f" Allowed Clients: {allowed_clients}") + + # Extract issuer from discovery URL + configured_issuer = discovery_url.replace('/.well-known/openid-configuration', '') + + # Build expected issuer from Cognito config + cognito_region = params['/app/lakehouse-agent/cognito-region'] + cognito_pool_id = params['/app/lakehouse-agent/cognito-user-pool-id'] + cognito_client_id = params['/app/lakehouse-agent/cognito-app-client-id'] + + expected_issuer = f"https://cognito-idp.{cognito_region}.amazonaws.com/{cognito_pool_id}" + + print(f"\nšŸ” Comparing Issuers...") + print(f" Configured issuer: {configured_issuer}") + print(f" Expected issuer: {expected_issuer}") + + if configured_issuer != expected_issuer: + print(f" āŒ MISMATCH!") + print(f"\nšŸ’” Solution:") + print(f" Run: python lakehouse-agent/update_agent_authorizer.py") + return + + print(f" āœ… Issuers match!") + + # Check client ID + print(f"\nšŸ” Comparing Client IDs...") + print(f" Configured clients: {allowed_clients}") + print(f" Expected client: {cognito_client_id}") + + if cognito_client_id not in allowed_clients: + print(f" āŒ Client ID not in allowed list!") + print(f"\nšŸ’” Solution:") + print(f" Run: python lakehouse-agent/update_agent_authorizer.py") + return + + print(f" āœ… Client ID matches!") + + # Test authentication + print(f"\nšŸ” Testing Authentication...") + try: + cognito = boto3.client('cognito-idp', region_name=cognito_region) + + username = 'user001@example.com' + password = 'TempPass123!' + + # Get client secret + client_secret = ssm.get_parameter( + Name='/app/lakehouse-agent/cognito-app-client-secret', + WithDecryption=True + )['Parameter']['Value'] + + # Calculate SECRET_HASH + import hmac + import hashlib + message = bytes(username + cognito_client_id, 'utf-8') + secret = bytes(client_secret, 'utf-8') + secret_hash = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest()).decode() + + response = cognito.admin_initiate_auth( + UserPoolId=cognito_pool_id, + ClientId=cognito_client_id, + AuthFlow='ADMIN_NO_SRP_AUTH', + AuthParameters={ + 'USERNAME': username, + 'PASSWORD': password, + 'SECRET_HASH': secret_hash + } + ) + + if 'AuthenticationResult' in response: + access_token = response['AuthenticationResult']['AccessToken'] + print(f" āœ… Successfully authenticated as {username}") + + # Decode and check token + claims = decode_jwt_payload(access_token) + if claims: + token_issuer = claims.get('iss') + token_client_id = claims.get('client_id') + + print(f"\nšŸ“„ Token Claims:") + print(f" Issuer (iss): {token_issuer}") + print(f" Client ID: {token_client_id}") + print(f" Username: {claims.get('username')}") + print(f" Expires: {claims.get('exp')}") + + if token_issuer == configured_issuer and token_client_id in allowed_clients: + print(f"\nāœ… ALL CHECKS PASSED!") + print(f"\n Your configuration is correct.") + print(f" If you're still getting errors, check:") + print(f" 1. Token hasn't expired") + print(f" 2. Network connectivity to AWS") + print(f" 3. Agent runtime is in ACTIVE state") + else: + print(f"\nāŒ Token claims don't match configuration!") + if token_issuer != configured_issuer: + print(f" Issuer mismatch!") + if token_client_id not in allowed_clients: + print(f" Client ID not allowed!") + else: + print(f" āŒ Authentication failed") + + except Exception as e: + print(f" āŒ Error testing authentication: {e}") + + except Exception as e: + print(f" āŒ Error getting agent runtime: {e}") + import traceback + traceback.print_exc() + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/utils/find_all_runtimes.py b/02-use-cases/lakehouse-agent/utils/find_all_runtimes.py new file mode 100644 index 00000000..b224ea2d --- /dev/null +++ b/02-use-cases/lakehouse-agent/utils/find_all_runtimes.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +""" +Find All AgentCore Runtimes + +This script lists all AgentCore runtimes in your account and their CloudWatch logs. +""" + +import boto3 +from datetime import datetime + +def main(): + print("=" * 80) + print("Find All AgentCore Runtimes") + print("=" * 80) + + session = boto3.Session() + region = session.region_name + + print(f"\nšŸ“ Region: {region}") + + # List all agent runtimes + print(f"\nšŸ” Searching for AgentCore Runtimes...") + try: + client = boto3.client('bedrock-agentcore-control', region_name=region) + + response = client.list_agent_runtimes() + runtimes = response.get('agentRuntimeSummaries', []) + + if not runtimes: + print(f" āŒ No AgentCore runtimes found in {region}") + print(f"\nšŸ’” To deploy the lakehouse agent:") + print(f" python lakehouse-agent/deploy_lakehouse_agent.py") + return + + print(f" āœ… Found {len(runtimes)} runtime(s):") + + for i, runtime_summary in enumerate(runtimes, 1): + name = runtime_summary.get('agentRuntimeName', 'unknown') + arn = runtime_summary.get('agentRuntimeArn', 'unknown') + status = runtime_summary.get('status', 'unknown') + updated = runtime_summary.get('updatedAt', 'unknown') + + print(f"\n {i}. {name}") + print(f" ARN: {arn}") + print(f" Status: {status}") + print(f" Updated: {updated}") + + # Get detailed runtime info + try: + detail_response = client.get_agent_runtime(agentRuntimeArn=arn) + runtime = detail_response['agentRuntime'] + + # Check auth configuration + if 'authorizerConfiguration' in runtime: + auth_config = runtime['authorizerConfiguration'] + if 'customJWTAuthorizer' in auth_config: + jwt_config = auth_config['customJWTAuthorizer'] + print(f" Auth: JWT") + print(f" Discovery URL: {jwt_config.get('discoveryUrl')}") + print(f" Allowed Clients: {jwt_config.get('allowedClients')}") + else: + print(f" Auth: IAM SigV4") + else: + print(f" Auth: IAM SigV4 (default)") + + # Extract runtime ID for log search + runtime_id = arn.split('/')[-1] + + # Search for CloudWatch logs + print(f"\n šŸ” Searching for CloudWatch logs...") + logs = boto3.client('logs', region_name=region) + + # Try different log group patterns + log_patterns = [ + f"/aws/bedrock-agentcore/runtime/{runtime_id}", + f"/aws/bedrock-agentcore/runtime/{name}", + f"/aws/bedrock-agentcore/{runtime_id}", + f"/aws/agentcore/runtime/{runtime_id}", + ] + + found_logs = False + for pattern in log_patterns: + try: + log_response = logs.describe_log_groups( + logGroupNamePrefix=pattern, + limit=1 + ) + + if log_response.get('logGroups'): + log_group = log_response['logGroups'][0] + log_group_name = log_group['logGroupName'] + size_mb = log_group.get('storedBytes', 0) / (1024 * 1024) + + print(f" āœ… Log Group: {log_group_name}") + print(f" Size: {size_mb:.2f} MB") + + # Check for recent log streams + streams_response = logs.describe_log_streams( + logGroupName=log_group_name, + orderBy='LastEventTime', + descending=True, + limit=3 + ) + + streams = streams_response.get('logStreams', []) + if streams: + print(f" Recent streams:") + for stream in streams: + stream_name = stream['logStreamName'] + last_event = stream.get('lastEventTimestamp') + if last_event: + last_event_date = datetime.fromtimestamp(last_event / 1000).strftime('%Y-%m-%d %H:%M:%S') + print(f" - {stream_name} (last: {last_event_date})") + else: + print(f" āš ļø No log streams (not invoked yet)") + + found_logs = True + break + except Exception: + continue + + if not found_logs: + print(f" āš ļø No CloudWatch logs found") + print(f" Logs are created on first invocation") + print(f" Expected log group: /aws/bedrock-agentcore/runtime/{runtime_id}") + + except Exception as e: + print(f" āš ļø Error getting runtime details: {e}") + + # Provide next steps + print(f"\n" + "=" * 80) + print(f"Next Steps") + print(f"=" * 80) + + print(f"\nšŸ“‹ To view logs for a runtime:") + print(f" 1. Note the runtime ARN from above") + print(f" 2. Go to CloudWatch Console > Log groups") + print(f" 3. Search for the log group name") + print(f" 4. Or use AWS CLI:") + print(f" aws logs tail '/aws/bedrock-agentcore/runtime/' --follow") + + print(f"\nšŸ“‹ To invoke a runtime and generate logs:") + print(f" 1. Use the Streamlit UI: streamlit run streamlit-ui/streamlit_app.py") + print(f" 2. Or use boto3/requests to invoke the runtime") + + print(f"\nšŸ“‹ To store runtime ARN in SSM (for scripts to use):") + print(f" aws ssm put-parameter \\") + print(f" --name '/app/lakehouse-agent/agent-runtime-arn' \\") + print(f" --value '' \\") + print(f" --type String \\") + print(f" --overwrite") + + except Exception as e: + print(f" āŒ Error listing runtimes: {e}") + import traceback + traceback.print_exc() + +if __name__ == '__main__': + main() diff --git a/02-use-cases/lakehouse-agent/utils/notebook_init.py b/02-use-cases/lakehouse-agent/utils/notebook_init.py new file mode 100644 index 00000000..6d310250 --- /dev/null +++ b/02-use-cases/lakehouse-agent/utils/notebook_init.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +""" +Notebook initialization utility for AWS session setup. + +This module provides a simple init_aws() function for Jupyter notebooks +that loads credentials from .env and creates a validated AWS session. + +Usage in notebooks: + from utils.notebook_init import init_aws + + session, region, account_id = init_aws() +""" + +from .aws_session_utils import load_env_credentials, get_aws_session +from typing import Tuple +import boto3 + + +def init_aws( + env_path: str = '.env', + profile_name: str = None, + region_name: str = None, + verbose: bool = True +) -> Tuple[boto3.Session, str, str]: + """ + Initialize AWS session for notebook use with automatic SSO fallback. + + This function: + 1. Loads credentials from .env file (if it exists) + 2. Creates and validates AWS session + 3. Automatically falls back to AWS SSO if .env credentials are invalid/expired + 4. Returns session, region, and account_id + + Credential priority order: + - Container IAM role (if running in Lambda/ECS/EKS) + - Environment variables from .env file + * If invalid/expired, automatically clears them and falls back to SSO + - AWS SSO profile (from AWS_PROFILE or AWS_DEFAULT_PROFILE) + - Default AWS credentials + + Args: + env_path: Path to .env file. Default is '.env' in current directory. + profile_name: Optional AWS profile name to use. + region_name: Optional AWS region to use. + verbose: If True, print status messages. Default True. + + Returns: + Tuple of (boto3.Session, region_name: str, account_id: str) + + Example: + >>> from utils.notebook_init import init_aws + >>> session, region, account_id = init_aws() + >>> s3_client = session.client('s3', region_name=region) + """ + # Try to load credentials from .env file + load_env_credentials(env_path=env_path, verbose=verbose) + + # Create and validate AWS session + session, region, account_id = get_aws_session( + profile_name=profile_name, + region_name=region_name, + verbose=verbose + ) + + return session, region, account_id diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 61d18ccc..3f1d58fc 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -80,5 +80,8 @@ - vargas-dann-0896 - razkenari - Kostas Tzouvanas +- Sunita Koppar (skoppar) +- Gi Kim (giryoong) - richatt -- Hideki Tane \ No newline at end of file +- richatt +- Hideki Tane