-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy_to_aws.ps1
More file actions
189 lines (157 loc) · 6.52 KB
/
Copy pathdeploy_to_aws.ps1
File metadata and controls
189 lines (157 loc) · 6.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# ============================================
# MLOps AWS EC2 Deployment Script (PowerShell)
# ============================================
#
# USAGE:
# .\deploy_to_aws.ps1 -EC2_IP "YOUR_EC2_IP" -KEY_PATH "C:\path\to\your-key.pem"
#
# ============================================
param(
[Parameter(Mandatory=$true)]
[string]$EC2_IP,
[Parameter(Mandatory=$true)]
[string]$KEY_PATH,
[string]$SSH_USER = "ubuntu"
)
$ErrorActionPreference = "Stop"
# Configuration
# Set SLACK_WEBHOOK_URL environment variable or update below
$SLACK_WEBHOOK = $env:SLACK_WEBHOOK_URL
if (-not $SLACK_WEBHOOK) {
Write-Host "WARNING: SLACK_WEBHOOK_URL not set. Set it as environment variable." -ForegroundColor Yellow
$SLACK_WEBHOOK = "YOUR_SLACK_WEBHOOK_URL_HERE"
}
$PROJECT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
$REMOTE_DIR = "/home/$SSH_USER/mlops_project"
Write-Host "============================================" -ForegroundColor Cyan
Write-Host " MLOps AWS EC2 Deployment" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "EC2 IP: $EC2_IP"
Write-Host "SSH User: $SSH_USER"
Write-Host "Key File: $KEY_PATH"
Write-Host "Remote Directory: $REMOTE_DIR"
Write-Host ""
# Check if key file exists
if (-not (Test-Path $KEY_PATH)) {
Write-Host "ERROR: Key file not found: $KEY_PATH" -ForegroundColor Red
exit 1
}
# Step 1: Test SSH connection
Write-Host "[1/6] Testing SSH connection..." -ForegroundColor Yellow
try {
ssh -i $KEY_PATH -o StrictHostKeyChecking=no -o ConnectTimeout=10 "$SSH_USER@$EC2_IP" "echo 'SSH connection successful'"
Write-Host " SSH connection OK" -ForegroundColor Green
} catch {
Write-Host " ERROR: Cannot connect to EC2. Check IP and key file." -ForegroundColor Red
exit 1
}
# Step 2: Install Docker on EC2
Write-Host "[2/6] Installing Docker on EC2..." -ForegroundColor Yellow
$DOCKER_INSTALL_SCRIPT = @"
#!/bin/bash
set -e
# Check if Docker is installed
if ! command -v docker &> /dev/null; then
echo "Installing Docker..."
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu `$(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker `$USER
echo "Docker installed successfully"
else
echo "Docker already installed"
fi
# Install Docker Compose
if ! command -v docker-compose &> /dev/null; then
echo "Installing Docker Compose..."
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-`$(uname -s)-`$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
echo "Docker Compose installed successfully"
else
echo "Docker Compose already installed"
fi
docker --version
docker-compose --version
"@
ssh -i $KEY_PATH "$SSH_USER@$EC2_IP" $DOCKER_INSTALL_SCRIPT
Write-Host " Docker installation complete" -ForegroundColor Green
# Step 3: Create project directory on EC2
Write-Host "[3/6] Creating project directory on EC2..." -ForegroundColor Yellow
ssh -i $KEY_PATH "$SSH_USER@$EC2_IP" "mkdir -p $REMOTE_DIR"
Write-Host " Directory created: $REMOTE_DIR" -ForegroundColor Green
# Step 4: Copy project files to EC2
Write-Host "[4/6] Copying project files to EC2..." -ForegroundColor Yellow
Write-Host " This may take a few minutes..."
# Copy essential files
scp -i $KEY_PATH -r "$PROJECT_DIR\src" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH -r "$PROJECT_DIR\prometheus" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH -r "$PROJECT_DIR\alertmanager" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH -r "$PROJECT_DIR\grafana" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH -r "$PROJECT_DIR\exporters" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH "$PROJECT_DIR\docker-compose.yml" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH "$PROJECT_DIR\Dockerfile" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
scp -i $KEY_PATH "$PROJECT_DIR\requirements.txt" "$SSH_USER@${EC2_IP}:$REMOTE_DIR/"
Write-Host " Files copied successfully" -ForegroundColor Green
# Step 5: Create .env file and start services
Write-Host "[5/6] Starting Docker services on EC2..." -ForegroundColor Yellow
$START_SCRIPT = @"
#!/bin/bash
set -e
cd $REMOTE_DIR
# Create .env file
cat > .env << 'EOF'
SLACK_WEBHOOK_URL=$SLACK_WEBHOOK
DATA_LAKE_URL=http://149.40.228.124:6500
API_HOST=0.0.0.0
API_PORT=5000
MODEL_DIR=/app/models
EOF
# Stop existing containers
sudo docker-compose down 2>/dev/null || true
# Build and start containers
sudo docker-compose up -d --build
# Wait for services to start
sleep 30
# Check container status
sudo docker-compose ps
"@
ssh -i $KEY_PATH "$SSH_USER@$EC2_IP" $START_SCRIPT
Write-Host " Docker services started" -ForegroundColor Green
# Step 6: Verify deployment
Write-Host "[6/6] Verifying deployment..." -ForegroundColor Yellow
$VERIFY_SCRIPT = @"
#!/bin/bash
echo "Checking services..."
curl -s http://localhost:5000/health || echo "ML API: Not ready yet"
curl -s http://localhost:9090/-/healthy || echo "Prometheus: Not ready yet"
curl -s http://localhost:3000/api/health || echo "Grafana: Not ready yet"
curl -s http://localhost:9093/-/healthy || echo "Alertmanager: Not ready yet"
echo ""
echo "Container status:"
sudo docker-compose ps
"@
ssh -i $KEY_PATH "$SSH_USER@$EC2_IP" "cd $REMOTE_DIR && $VERIFY_SCRIPT"
Write-Host ""
Write-Host "============================================" -ForegroundColor Green
Write-Host " DEPLOYMENT COMPLETE!" -ForegroundColor Green
Write-Host "============================================" -ForegroundColor Green
Write-Host ""
Write-Host "Access your services at:" -ForegroundColor Cyan
Write-Host " ML API: http://${EC2_IP}:5000"
Write-Host " Predict: http://${EC2_IP}:5000/predict"
Write-Host " Metrics: http://${EC2_IP}:5000/metrics"
Write-Host " Prometheus: http://${EC2_IP}:9090"
Write-Host " Grafana: http://${EC2_IP}:3000 (admin/admin123)"
Write-Host " Alertmanager: http://${EC2_IP}:9093"
Write-Host ""
Write-Host "Slack alerts will be sent to: #all-mlosping" -ForegroundColor Yellow
# Send Slack notification
$SLACK_MSG = @{
text = "MLOps Deployment Complete! Services running on EC2: $EC2_IP"
} | ConvertTo-Json
Invoke-RestMethod -Uri $SLACK_WEBHOOK -Method Post -Body $SLACK_MSG -ContentType "application/json"
Write-Host "Slack notification sent!" -ForegroundColor Green