feat(terraform): Add EC2 user-data bootstrap script
This commit is contained in:
94
terraform/aws-infrastructure/scripts/user-data.sh
Normal file
94
terraform/aws-infrastructure/scripts/user-data.sh
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# EC2 User Data Bootstrap Script
|
||||||
|
# Runs on instance launch
|
||||||
|
|
||||||
|
set -e
|
||||||
|
exec > >(tee /var/log/user-data.log) 2>&1
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "Starting EC2 Bootstrap"
|
||||||
|
echo "Environment: ${environment}"
|
||||||
|
echo "Region: ${region}"
|
||||||
|
echo "========================================="
|
||||||
|
|
||||||
|
# Update system
|
||||||
|
echo "[1/5] Updating system..."
|
||||||
|
yum update -y
|
||||||
|
|
||||||
|
# Install CloudWatch Agent
|
||||||
|
echo "[2/5] Installing CloudWatch Agent..."
|
||||||
|
wget https://s3.${region}.amazonaws.com/amazoncloudwatch-agent-${region}/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
|
||||||
|
rpm -U ./amazon-cloudwatch-agent.rpm
|
||||||
|
|
||||||
|
# Install Docker
|
||||||
|
echo "[3/5] Installing Docker..."
|
||||||
|
yum install -y docker
|
||||||
|
systemctl start docker
|
||||||
|
systemctl enable docker
|
||||||
|
usermod -a -G docker ec2-user
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
echo "[4/5] Installing dependencies..."
|
||||||
|
yum install -y git htop vim wget curl jq python3 python3-pip
|
||||||
|
|
||||||
|
# Setup health check endpoint
|
||||||
|
echo "[5/5] Setting up health check..."
|
||||||
|
mkdir -p /opt/app
|
||||||
|
|
||||||
|
cat > /opt/app/health.py << 'PYEOF'
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||||
|
|
||||||
|
class Handler(BaseHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
if self.path == '/health':
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'text/plain')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(b'healthy')
|
||||||
|
else:
|
||||||
|
self.send_response(404)
|
||||||
|
self.end_headers()
|
||||||
|
|
||||||
|
def log_message(self, format, *args):
|
||||||
|
pass # Suppress logs
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
server = HTTPServer(('', 80), Handler)
|
||||||
|
server.serve_forever()
|
||||||
|
PYEOF
|
||||||
|
|
||||||
|
chmod +x /opt/app/health.py
|
||||||
|
|
||||||
|
# Create systemd service
|
||||||
|
cat > /etc/systemd/system/health-server.service << 'EOF'
|
||||||
|
[Unit]
|
||||||
|
Description=Health Check Server
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/app
|
||||||
|
ExecStart=/usr/bin/python3 /opt/app/health.py
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable health-server
|
||||||
|
systemctl start health-server
|
||||||
|
|
||||||
|
# Tag instance
|
||||||
|
INSTANCE_ID=$(ec2-metadata --instance-id | cut -d " " -f 2)
|
||||||
|
aws ec2 create-tags \
|
||||||
|
--resources $INSTANCE_ID \
|
||||||
|
--tags Key=Bootstrap,Value=Complete \
|
||||||
|
--region ${region}
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "Bootstrap Complete!"
|
||||||
|
echo "Instance ID: $INSTANCE_ID"
|
||||||
|
echo "========================================="
|
||||||
Reference in New Issue
Block a user