AWS CDK EC2 Deployment Example
Section titled “AWS CDK EC2 Deployment Example”Introduction
Section titled “Introduction”This is a TypeScript-based CDK (Cloud Development Kit) example that demonstrates how to deploy a Python application to AWS EC2. The example deploys a weather forecaster application that runs as a service on an EC2 instance. The application provides two weather endpoints:
/weather- A standard endpoint that returns weather information based on the provided prompt/weather-streaming- A streaming endpoint that delivers weather information in real-time as it’s being generated
Prerequisites
Section titled “Prerequisites”Project Structure
Section titled “Project Structure”lib/- Contains the CDK stack definition in TypeScriptbin/- Contains the CDK app entry point and deployment scripts:cdk-app.ts- Main CDK application entry point
app/- Contains the application code:app.py- FastAPI application code
requirements.txt- Python dependencies for the application
Setup and Deployment
Section titled “Setup and Deployment”- Install dependencies:
# Install Node.js dependencies including CDK and TypeScript locallynpm install
# Create a Python virtual environment (optional but recommended)python -m venv .venvsource .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install Python dependencies for the local developmentpip install -r ./requirements.txt
# Install Python dependencies for the app distributionpip install -r requirements.txt --python-version 3.12 --platform manylinux2014_aarch64 --target ./packaging/_dependencies --only-binary=:all:- Bootstrap your AWS environment (if not already done):
npx cdk bootstrap- Deploy the stack:
npx cdk deployHow It Works
Section titled “How It Works”This deployment:
- Creates an EC2 instance in a public subnet with a public IP
- Uploads the application code to S3 as CDK assets
- Uses a user data script to:
- Install Python and other dependencies
- Download the application code from S3
- Set up the application as a systemd service using uvicorn
After deployment, you can access the weather service using the Application Load Balancer URL that is output after deployment:
# Get the service URL from the CDK outputSERVICE_URL=$(aws cloudformation describe-stacks --stack-name AgentEC2Stack --region us-east-1 --query "Stacks[0].Outputs[?ExportName=='Ec2ServiceEndpoint'].OutputValue" --output text)The service exposes a REST API endpoint that you can call using curl or any HTTP client:
# Call the weather servicecurl -X POST \ http://$SERVICE_URL/weather \ -H 'Content-Type: application/json' \ -d '{"prompt": "What is the weather in New York?"}'
# Call the streaming endpoint curl -X POST \ http://$SERVICE_URL/weather-streaming \ -H 'Content-Type: application/json' \ -d '{"prompt": "What is the weather in New York in Celsius?"}'Local testing
Section titled “Local testing”You can run the python app directly for local testing via:
python app/app.pyThen, set the SERVICE_URL to point to your local server
SERVICE_URL=127.0.0.1:8000and you can use the curl commands above to test locally.
Cleanup
Section titled “Cleanup”To remove all resources created by this example:
npx cdk destroyCallouts and considerations
Section titled “Callouts and considerations”Note that this example demonstrates a simple deployment approach with some important limitations:
- The application code is deployed only during the initial instance creation via user data script
- Updating the application requires implementing a custom update mechanism
- The example exposes the application directly on port 8000 without a load balancer
- For production workloads, consider using ECS/Fargate which provides built-in support for application updates, scaling, and high availability