From dd82b09ceb0356a9adef8bf23112aa41aa72e1c0 Mon Sep 17 00:00:00 2001 From: Sanjeev Nithyanandam Date: Wed, 18 Dec 2024 15:48:45 -0800 Subject: [PATCH] docs: vercel example portal to private postgres db --- .../portals/vercel/example-2/.gitignore | 2 + .../portals/vercel/example-2/README.md | 73 ++++++ .../portals/vercel/example-2/api/index.py | 222 ++++++++++++++++++ .../portals/vercel/example-2/diagram.png | Bin 0 -> 43957 bytes .../portals/vercel/example-2/requirements.txt | 2 + .../portals/vercel/example-2/vercel.json | 19 ++ 6 files changed, 318 insertions(+) create mode 100644 examples/command/portals/vercel/example-2/.gitignore create mode 100644 examples/command/portals/vercel/example-2/README.md create mode 100644 examples/command/portals/vercel/example-2/api/index.py create mode 100644 examples/command/portals/vercel/example-2/diagram.png create mode 100644 examples/command/portals/vercel/example-2/requirements.txt create mode 100644 examples/command/portals/vercel/example-2/vercel.json diff --git a/examples/command/portals/vercel/example-2/.gitignore b/examples/command/portals/vercel/example-2/.gitignore new file mode 100644 index 00000000000..76fc8a5a055 --- /dev/null +++ b/examples/command/portals/vercel/example-2/.gitignore @@ -0,0 +1,2 @@ +*.ticket +.vercel diff --git a/examples/command/portals/vercel/example-2/README.md b/examples/command/portals/vercel/example-2/README.md new file mode 100644 index 00000000000..ff15a934789 --- /dev/null +++ b/examples/command/portals/vercel/example-2/README.md @@ -0,0 +1,73 @@ +# Access private AWS RDS PostgreSQL Databasefrom Vercel + +![Architecture](./diagram.png) + +## AWS + +### Setup a private RDS PostgreSQL Database + +- [Follow AWS Guide](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) to setup a private RDS PostgreSQL Database + +- Create a database, table and insert some data + +```sql +CREATE TABLE public.products +( + id integer primary key, + product_name text, + price numeric +); + +INSERT INTO products (id, product_name, price) +VALUES + (1, "Ergonomic Keyboard", 38.30), + (2, "Wireless Mouse", 93.30), + (3, "USB Hub", 47.63)' + +``` + +### Setup an Ockam Outlet Node + +- [Follow Ockam Guide](https://docs.ockam.io/reference/command/guides/aws-marketplace/ockam-node-for-amazon-rds-postgrese) to setup an Ockam Outlet Node in AWS. + + +## Vercel: Setup Vercel Serverless functions to access the private database. + +### Download latest ockam binary + +- Download ockam binary `x86_64-unknown-linux-gnu` from the [Ockam](https://github.com/build-trust/ockam/releases) github repository and place it in the `data/linux-x86_64` directory. Rename the binary to `ockam`. + +### Create an enrollment ticket for the Vercel function + +```sh +# Generate an inlet ticket for the Vercel function. +# Values for --usage-count and --expires-in are setup to allow to be used 100 counts for 24 hours. +ockam project ticket --expires-in 24h --usage-count 100 \ + --attribute amazon-rds-postgresql-inlet \ + > "vercel-inlet.ticket" +``` + +### Setup a Vercel project and add the inlet ticket as a secret + +- Select `Project Settings`, `Environments`, `Production +- Click `Add Environment Variable` +- Select `Sensitive` +- Add `OCKAM_RDS_INLET_ENROLLMENT_TICKET` as the name +- Add the value of `vercel-inlet.ticket` as the value +- Click `Add` + +- Follow the same steps to add `DB_PASSWORD` as the environment variable + +### Deploy the Vercel function + +- Setup vercel cli and select the project +- Deploy the function inside the `api` directory + +```sh +vercel --prod +``` + +### Test the Vercel function + +- Use the `/api` endpoint to get the products +- Use the `/api/update` endpoint to update the products diff --git a/examples/command/portals/vercel/example-2/api/index.py b/examples/command/portals/vercel/example-2/api/index.py new file mode 100644 index 00000000000..d1c95e84b17 --- /dev/null +++ b/examples/command/portals/vercel/example-2/api/index.py @@ -0,0 +1,222 @@ +""" +Simple API handler for accessing PostgreSQL via Ockam secure channel +""" + +import json +import os +import subprocess +import threading +import time +from http.server import BaseHTTPRequestHandler +import psycopg2 +from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT +from decimal import Decimal + +# Constants +#TODO: Use ockam_inmemory testing. Cleanup after testing +OCKAM_BINARY_PATH = '/var/task/data/linux-x86_64/ockam' if os.environ.get('VERCEL_ENV') == 'production' else 'ockam' +MAX_RETRIES = 60 +RETRY_DELAY = 1 # seconds +DB_PORT = 15432 +DB_TIMEOUT = 3 # seconds + +# Track if Ockam node creation has been attempted +NODE_INITIALIZED = False + +def is_production() -> bool: + """Check if the environment is production.""" + return os.environ.get('VERCEL_ENV') == 'production' + +def get_ockam_version() -> str: + """Get the installed Ockam version.""" + try: + ockam_path = OCKAM_BINARY_PATH + if is_production() and not os.path.exists(ockam_path): + return f"Error: Ockam binary not found at {os.path.abspath(ockam_path)}" + + result = subprocess.run([ockam_path, '--version'], + capture_output=True, + text=True) + + return result.stdout.strip() if result.returncode == 0 else f"Error running ockam: {result.stderr}" + except Exception as e: + return f"Error: {str(e)} (CWD: {os.getcwd()})" + +class handler(BaseHTTPRequestHandler): + """Handler for PostgreSQL database requests via Ockam secure channel.""" + + def create_ockam_node(self, enrollment_ticket: str) -> bool: + """Initialize Ockam node with the provided enrollment ticket.""" + if not is_production(): + return False + + global NODE_INITIALIZED + request_id = self.headers.get('x-vercel-id', os.urandom(8).hex()) + + print(f"[{request_id}] Starting with NODE_INITIALIZED = {NODE_INITIALIZED}") + + if not NODE_INITIALIZED: + NODE_INITIALIZED = True + + def run_ockam_node(): + try: + config = '''{ + "tcp-inlet": { + "from": "127.0.0.1:15432", + "via": "postgresql", + "allow": "amazon-rds-postgresql-outlet" + } + }''' + + print(f"[{request_id}] Starting ockam node with config: {config}", flush=True) + + subprocess.Popen([ + OCKAM_BINARY_PATH, + 'node', + 'create', + '--configuration', + config, + '--enrollment-ticket', + enrollment_ticket.strip() + ], env={ + **os.environ, + 'OCKAM_HOME': '/tmp', + 'OCKAM_OPENTELEMETRY_EXPORT': 'false', + 'OCKAM_DISABLE_UPGRADE_CHECK': 'true' + }) + + except Exception as e: + print(f"[{request_id}] Error in node creation: {str(e)}", flush=True) + + thread = threading.Thread(target=run_ockam_node) + thread.daemon = True + print(f"[{request_id}] Starting ockam node thread", flush=True) + thread.start() + + return True + + def get_db_connection(self, request_id: str): + """Establish database connection with retries.""" + db_password = os.environ.get('DB_PASSWORD') + if not db_password: + raise ValueError("DB_PASSWORD environment variable is not set") + + for retry in range(MAX_RETRIES): + try: + conn = psycopg2.connect( + host="127.0.0.1", + port=DB_PORT, + database="testdb", + user="postgresuser", + password=db_password, + connect_timeout=DB_TIMEOUT + ) + print(f"[{request_id}] Connected to PostgreSQL successfully after {retry} retries") + conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) + return conn, None + + except Exception as e: + print(f"[{request_id}] Attempt {retry + 1} failed: {str(e)}") + if retry < MAX_RETRIES - 1: + time.sleep(RETRY_DELAY) + + return None, f"Failed to connect after {MAX_RETRIES} attempts" + + def handle_select(self, request_id: str) -> dict: + """Handle GET requests for product data.""" + conn, error = self.get_db_connection(request_id) + if error: + return {"status": "error", "message": f"Database connection failed: {error}"} + + try: + cur = conn.cursor() + cur.execute("SELECT * FROM products;") + rows = cur.fetchall() + formatted_rows = [ + { + 'id': row[0], + 'product_name': row[1], + 'price': round(float(row[2]), 2) if isinstance(row[2], Decimal) else row[2] + } + for row in rows + ] + + cur.close() + conn.close() + + return {"status": "success", "data": formatted_rows} + except Exception as e: + return {"status": "error", "message": str(e)} + + def handle_update(self, request_id: str) -> dict: + """Handle requests to update product prices.""" + conn, error = self.get_db_connection(request_id) + if error: + return {"status": "error", "message": f"Database connection failed: {error}"} + + try: + cur = conn.cursor() + cur.execute("UPDATE products SET price = (random() * 90 + 10)::numeric(10,2);") + + # Get updated data + cur.execute("SELECT * FROM products;") + rows = cur.fetchall() + formatted_rows = [ + { + 'id': row[0], + 'product_name': row[1], + 'price': round(float(row[2]), 2) if isinstance(row[2], Decimal) else row[2] + } + for row in rows + ] + + cur.close() + conn.close() + + return { + "status": "success", + "message": "Prices updated successfully", + "data": formatted_rows + } + except Exception as e: + return {"status": "error", "message": str(e)} + + def do_GET(self): + """Handle incoming GET requests.""" + try: + # Verify Ockam installation + version_result = get_ockam_version() + if 'Error' in version_result: + self._send_error(500, version_result) + return + + # Verify enrollment ticket + enrollment_ticket = os.environ.get('OCKAM_RDS_INLET_ENROLLMENT_TICKET') + if not enrollment_ticket: + self._send_error(500, 'OCKAM_RDS_INLET_ENROLLMENT_TICKET not configured') + return + + # Initialize Ockam node + if not self.create_ockam_node(enrollment_ticket): + self._send_error(500, 'Failed to initialize Ockam node') + return + + # Handle the request + request_id = self.headers.get('x-vercel-id', os.urandom(8).hex()) + result = self.handle_update(request_id) if self.path == '/api/update' else self.handle_select(request_id) + + self._send_response(200, result) + + except Exception as e: + self._send_error(500, str(e)) + + def _send_response(self, status: int, data: dict): + """Helper method to send JSON responses.""" + self.send_response(status) + self.send_header('Content-Type', 'application/json') + self.end_headers() + self.wfile.write(json.dumps(data).encode()) + + def _send_error(self, status: int, message: str): + """Helper method to send error responses.""" + self._send_response(status, {'error': message}) \ No newline at end of file diff --git a/examples/command/portals/vercel/example-2/diagram.png b/examples/command/portals/vercel/example-2/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..394fe11b29a7b987ce21eddfbcc6d213a716aa73 GIT binary patch literal 43957 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

^~DR*tVTn?Pl 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