- Added comprehensive course structure with 11 modules - Included theoretical content, practical examples, and tasks - Multi-language code examples (Java, Rust, Node.js, Python) - Detailed analysis of architectural approaches and trade-offs - Complete caching strategies documentation - Architecture examples from real-world systems (Twitter, Netflix, Uber) - Structured navigation and learning path - Ready for educational use
702 lines
18 KiB
Markdown
702 lines
18 KiB
Markdown
# Основы облачных технологий
|
|
|
|
## Навигация
|
|
- [🏠 Главная страница курса](../../../README.md)
|
|
- [📚 Модуль 8](../README.md)
|
|
|
|
---
|
|
|
|
## Что такое облачные вычисления
|
|
|
|
**Облачные вычисления** — модель предоставления вычислительных ресурсов через интернет по требованию.
|
|
|
|
## Модели обслуживания
|
|
|
|
### 1. IaaS (Infrastructure as a Service)
|
|
**Определение:** Предоставление виртуальной инфраструктуры.
|
|
|
|
**Примеры:**
|
|
- AWS EC2
|
|
- Azure Virtual Machines
|
|
- Google Compute Engine
|
|
|
|
**Преимущества:**
|
|
- Полный контроль над инфраструктурой
|
|
- Гибкость в выборе ОС и ПО
|
|
- Масштабируемость
|
|
|
|
**Технический пример - AWS EC2 Infrastructure as Code:**
|
|
|
|
```yaml
|
|
# terraform/main.tf
|
|
terraform {
|
|
required_providers {
|
|
aws = {
|
|
source = "hashicorp/aws"
|
|
version = "~> 5.0"
|
|
}
|
|
}
|
|
}
|
|
|
|
provider "aws" {
|
|
region = var.aws_region
|
|
}
|
|
|
|
# VPC Configuration
|
|
resource "aws_vpc" "main" {
|
|
cidr_block = "10.0.0.0/16"
|
|
enable_dns_hostnames = true
|
|
enable_dns_support = true
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-vpc"
|
|
Environment = var.environment
|
|
}
|
|
}
|
|
|
|
# Internet Gateway
|
|
resource "aws_internet_gateway" "main" {
|
|
vpc_id = aws_vpc.main.id
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-igw"
|
|
}
|
|
}
|
|
|
|
# Public Subnets
|
|
resource "aws_subnet" "public" {
|
|
count = length(var.availability_zones)
|
|
|
|
vpc_id = aws_vpc.main.id
|
|
cidr_block = "10.0.${count.index + 1}.0/24"
|
|
availability_zone = var.availability_zones[count.index]
|
|
map_public_ip_on_launch = true
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-public-subnet-${count.index + 1}"
|
|
Type = "Public"
|
|
}
|
|
}
|
|
|
|
# Private Subnets
|
|
resource "aws_subnet" "private" {
|
|
count = length(var.availability_zones)
|
|
|
|
vpc_id = aws_vpc.main.id
|
|
cidr_block = "10.0.${count.index + 10}.0/24"
|
|
availability_zone = var.availability_zones[count.index]
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-private-subnet-${count.index + 1}"
|
|
Type = "Private"
|
|
}
|
|
}
|
|
|
|
# Security Groups
|
|
resource "aws_security_group" "web" {
|
|
name_prefix = "${var.project_name}-web-"
|
|
vpc_id = aws_vpc.main.id
|
|
|
|
ingress {
|
|
from_port = 80
|
|
to_port = 80
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
ingress {
|
|
from_port = 443
|
|
to_port = 443
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
ingress {
|
|
from_port = 22
|
|
to_port = 22
|
|
protocol = "tcp"
|
|
cidr_blocks = [var.admin_cidr]
|
|
}
|
|
|
|
egress {
|
|
from_port = 0
|
|
to_port = 0
|
|
protocol = "-1"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-web-sg"
|
|
}
|
|
}
|
|
|
|
resource "aws_security_group" "app" {
|
|
name_prefix = "${var.project_name}-app-"
|
|
vpc_id = aws_vpc.main.id
|
|
|
|
ingress {
|
|
from_port = 8080
|
|
to_port = 8080
|
|
protocol = "tcp"
|
|
security_groups = [aws_security_group.web.id]
|
|
}
|
|
|
|
ingress {
|
|
from_port = 22
|
|
to_port = 22
|
|
protocol = "tcp"
|
|
cidr_blocks = [var.admin_cidr]
|
|
}
|
|
|
|
egress {
|
|
from_port = 0
|
|
to_port = 0
|
|
protocol = "-1"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-app-sg"
|
|
}
|
|
}
|
|
|
|
# Application Load Balancer
|
|
resource "aws_lb" "main" {
|
|
name = "${var.project_name}-alb"
|
|
internal = false
|
|
load_balancer_type = "application"
|
|
security_groups = [aws_security_group.web.id]
|
|
subnets = aws_subnet.public[*].id
|
|
|
|
enable_deletion_protection = false
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-alb"
|
|
}
|
|
}
|
|
|
|
# Target Group
|
|
resource "aws_lb_target_group" "app" {
|
|
name = "${var.project_name}-tg"
|
|
port = 8080
|
|
protocol = "HTTP"
|
|
vpc_id = aws_vpc.main.id
|
|
|
|
health_check {
|
|
enabled = true
|
|
healthy_threshold = 2
|
|
unhealthy_threshold = 2
|
|
timeout = 5
|
|
interval = 30
|
|
path = "/health"
|
|
matcher = "200"
|
|
port = "traffic-port"
|
|
protocol = "HTTP"
|
|
}
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-tg"
|
|
}
|
|
}
|
|
|
|
# Launch Template
|
|
resource "aws_launch_template" "app" {
|
|
name_prefix = "${var.project_name}-"
|
|
image_id = var.ami_id
|
|
instance_type = var.instance_type
|
|
|
|
vpc_security_group_ids = [aws_security_group.app.id]
|
|
|
|
user_data = base64encode(templatefile("${path.module}/user_data.sh", {
|
|
app_name = var.project_name
|
|
environment = var.environment
|
|
}))
|
|
|
|
tag_specifications {
|
|
resource_type = "instance"
|
|
tags = {
|
|
Name = "${var.project_name}-instance"
|
|
Environment = var.environment
|
|
}
|
|
}
|
|
|
|
lifecycle {
|
|
create_before_destroy = true
|
|
}
|
|
}
|
|
|
|
# Auto Scaling Group
|
|
resource "aws_autoscaling_group" "app" {
|
|
name = "${var.project_name}-asg"
|
|
vpc_zone_identifier = aws_subnet.private[*].id
|
|
target_group_arns = [aws_lb_target_group.app.arn]
|
|
health_check_type = "ELB"
|
|
health_check_grace_period = 300
|
|
|
|
min_size = var.min_size
|
|
max_size = var.max_size
|
|
desired_capacity = var.desired_capacity
|
|
|
|
launch_template {
|
|
id = aws_launch_template.app.id
|
|
version = "$Latest"
|
|
}
|
|
|
|
tag {
|
|
key = "Name"
|
|
value = "${var.project_name}-asg"
|
|
propagate_at_launch = false
|
|
}
|
|
|
|
tag {
|
|
key = "Environment"
|
|
value = var.environment
|
|
propagate_at_launch = true
|
|
}
|
|
}
|
|
|
|
# Auto Scaling Policies
|
|
resource "aws_autoscaling_policy" "scale_up" {
|
|
name = "${var.project_name}-scale-up"
|
|
scaling_adjustment = 1
|
|
adjustment_type = "ChangeInCapacity"
|
|
cooldown = 300
|
|
autoscaling_group_name = aws_autoscaling_group.app.name
|
|
}
|
|
|
|
resource "aws_autoscaling_policy" "scale_down" {
|
|
name = "${var.project_name}-scale-down"
|
|
scaling_adjustment = -1
|
|
adjustment_type = "ChangeInCapacity"
|
|
cooldown = 300
|
|
autoscaling_group_name = aws_autoscaling_group.app.name
|
|
}
|
|
|
|
# CloudWatch Alarms
|
|
resource "aws_cloudwatch_metric_alarm" "cpu_high" {
|
|
alarm_name = "${var.project_name}-cpu-high"
|
|
comparison_operator = "GreaterThanThreshold"
|
|
evaluation_periods = "2"
|
|
metric_name = "CPUUtilization"
|
|
namespace = "AWS/EC2"
|
|
period = "300"
|
|
statistic = "Average"
|
|
threshold = "80"
|
|
alarm_description = "This metric monitors ec2 cpu utilization"
|
|
alarm_actions = [aws_autoscaling_policy.scale_up.arn]
|
|
|
|
dimensions = {
|
|
AutoScalingGroupName = aws_autoscaling_group.app.name
|
|
}
|
|
}
|
|
|
|
resource "aws_cloudwatch_metric_alarm" "cpu_low" {
|
|
alarm_name = "${var.project_name}-cpu-low"
|
|
comparison_operator = "LessThanThreshold"
|
|
evaluation_periods = "2"
|
|
metric_name = "CPUUtilization"
|
|
namespace = "AWS/EC2"
|
|
period = "300"
|
|
statistic = "Average"
|
|
threshold = "20"
|
|
alarm_description = "This metric monitors ec2 cpu utilization"
|
|
alarm_actions = [aws_autoscaling_policy.scale_down.arn]
|
|
|
|
dimensions = {
|
|
AutoScalingGroupName = aws_autoscaling_group.app.name
|
|
}
|
|
}
|
|
|
|
# RDS Database
|
|
resource "aws_db_subnet_group" "main" {
|
|
name = "${var.project_name}-db-subnet-group"
|
|
subnet_ids = aws_subnet.private[*].id
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-db-subnet-group"
|
|
}
|
|
}
|
|
|
|
resource "aws_db_instance" "main" {
|
|
identifier = "${var.project_name}-db"
|
|
|
|
engine = "postgres"
|
|
engine_version = "14.7"
|
|
instance_class = var.db_instance_class
|
|
|
|
allocated_storage = 20
|
|
max_allocated_storage = 100
|
|
storage_type = "gp2"
|
|
storage_encrypted = true
|
|
|
|
db_name = var.db_name
|
|
username = var.db_username
|
|
password = var.db_password
|
|
|
|
vpc_security_group_ids = [aws_security_group.db.id]
|
|
db_subnet_group_name = aws_db_subnet_group.main.name
|
|
|
|
backup_retention_period = 7
|
|
backup_window = "03:00-04:00"
|
|
maintenance_window = "sun:04:00-sun:05:00"
|
|
|
|
skip_final_snapshot = var.environment != "production"
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-db"
|
|
Environment = var.environment
|
|
}
|
|
}
|
|
|
|
resource "aws_security_group" "db" {
|
|
name_prefix = "${var.project_name}-db-"
|
|
vpc_id = aws_vpc.main.id
|
|
|
|
ingress {
|
|
from_port = 5432
|
|
to_port = 5432
|
|
protocol = "tcp"
|
|
security_groups = [aws_security_group.app.id]
|
|
}
|
|
|
|
egress {
|
|
from_port = 0
|
|
to_port = 0
|
|
protocol = "-1"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
tags = {
|
|
Name = "${var.project_name}-db-sg"
|
|
}
|
|
}
|
|
```
|
|
|
|
```bash
|
|
# user_data.sh
|
|
#!/bin/bash
|
|
yum update -y
|
|
|
|
# Install Docker
|
|
yum install -y docker
|
|
systemctl start docker
|
|
systemctl enable docker
|
|
usermod -a -G docker ec2-user
|
|
|
|
# Install Docker Compose
|
|
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
chmod +x /usr/local/bin/docker-compose
|
|
|
|
# Create application directory
|
|
mkdir -p /opt/${app_name}
|
|
cd /opt/${app_name}
|
|
|
|
# Create docker-compose.yml
|
|
cat > docker-compose.yml << EOF
|
|
version: '3.8'
|
|
services:
|
|
app:
|
|
image: ${app_name}:latest
|
|
ports:
|
|
- "8080:8080"
|
|
environment:
|
|
- SPRING_PROFILES_ACTIVE=${environment}
|
|
- DB_HOST=${db_host}
|
|
- DB_PORT=5432
|
|
- DB_NAME=${db_name}
|
|
- DB_USERNAME=${db_username}
|
|
- DB_PASSWORD=${db_password}
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 40s
|
|
EOF
|
|
|
|
# Start application
|
|
docker-compose up -d
|
|
```
|
|
|
|
#### 2. PaaS (Platform as a Service)
|
|
**Определение:** Предоставление платформы для разработки и развертывания приложений.
|
|
|
|
**Примеры:**
|
|
- AWS Elastic Beanstalk
|
|
- Azure App Service
|
|
- Google App Engine
|
|
|
|
**Преимущества:**
|
|
- Упрощенное развертывание
|
|
- Автоматическое масштабирование
|
|
- Управление инфраструктурой провайдером
|
|
|
|
**Технический пример - AWS Elastic Beanstalk:**
|
|
|
|
```yaml
|
|
# .ebextensions/01-packages.config
|
|
packages:
|
|
yum:
|
|
git: []
|
|
htop: []
|
|
|
|
option_settings:
|
|
aws:elasticbeanstalk:container:nodejs:
|
|
NodeCommand: "npm start"
|
|
NodeVersion: 18.19.0
|
|
aws:elasticbeanstalk:application:environment:
|
|
NODE_ENV: production
|
|
PORT: 8080
|
|
aws:elasticbeanstalk:environment:process:default:
|
|
HealthCheckPath: /health
|
|
Port: 8080
|
|
Protocol: HTTP
|
|
aws:autoscaling:launchconfiguration:
|
|
InstanceType: t3.medium
|
|
SecurityGroups: default
|
|
aws:elasticbeanstalk:environment:
|
|
LoadBalancerType: application
|
|
ServiceRole: aws-elasticbeanstalk-service-role
|
|
aws:elbv2:loadbalancer:
|
|
IdleTimeout: 60
|
|
aws:autoscaling:asg:
|
|
MinSize: 1
|
|
MaxSize: 10
|
|
aws:autoscaling:trigger:
|
|
MeasureName: CPUUtilization
|
|
Unit: Percent
|
|
LowerThreshold: 20
|
|
UpperThreshold: 80
|
|
ScaleUpIncrement: 1
|
|
ScaleDownIncrement: -1
|
|
```
|
|
|
|
```json
|
|
// package.json
|
|
{
|
|
"name": "my-app",
|
|
"version": "1.0.0",
|
|
"description": "My Node.js application",
|
|
"main": "app.js",
|
|
"scripts": {
|
|
"start": "node app.js",
|
|
"dev": "nodemon app.js",
|
|
"test": "jest"
|
|
},
|
|
"dependencies": {
|
|
"express": "^4.18.2",
|
|
"cors": "^2.8.5",
|
|
"helmet": "^7.1.0",
|
|
"morgan": "^1.10.0",
|
|
"compression": "^1.7.4",
|
|
"dotenv": "^16.3.1"
|
|
},
|
|
"devDependencies": {
|
|
"nodemon": "^3.0.2",
|
|
"jest": "^29.7.0"
|
|
},
|
|
"engines": {
|
|
"node": ">=18.0.0",
|
|
"npm": ">=8.0.0"
|
|
}
|
|
}
|
|
```
|
|
|
|
```javascript
|
|
// app.js
|
|
const express = require('express');
|
|
const cors = require('cors');
|
|
const helmet = require('helmet');
|
|
const morgan = require('morgan');
|
|
const compression = require('compression');
|
|
require('dotenv').config();
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 8080;
|
|
|
|
// Middleware
|
|
app.use(helmet());
|
|
app.use(cors());
|
|
app.use(compression());
|
|
app.use(morgan('combined'));
|
|
app.use(express.json());
|
|
app.use(express.urlencoded({ extended: true }));
|
|
|
|
// Health check endpoint
|
|
app.get('/health', (req, res) => {
|
|
res.status(200).json({
|
|
status: 'healthy',
|
|
timestamp: new Date().toISOString(),
|
|
uptime: process.uptime(),
|
|
environment: process.env.NODE_ENV || 'development'
|
|
});
|
|
});
|
|
|
|
// API routes
|
|
app.get('/api/status', (req, res) => {
|
|
res.json({
|
|
message: 'API is running',
|
|
version: '1.0.0',
|
|
environment: process.env.NODE_ENV || 'development'
|
|
});
|
|
});
|
|
|
|
// Error handling
|
|
app.use((err, req, res, next) => {
|
|
console.error(err.stack);
|
|
res.status(500).json({
|
|
error: 'Something went wrong!',
|
|
message: process.env.NODE_ENV === 'production' ? 'Internal server error' : err.message
|
|
});
|
|
});
|
|
|
|
// 404 handler
|
|
app.use('*', (req, res) => {
|
|
res.status(404).json({
|
|
error: 'Not found',
|
|
message: 'The requested resource was not found'
|
|
});
|
|
});
|
|
|
|
app.listen(PORT, '0.0.0.0', () => {
|
|
console.log(`Server is running on port ${PORT}`);
|
|
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
|
|
});
|
|
```
|
|
|
|
#### 3. SaaS (Software as a Service)
|
|
**Определение:** Предоставление готового программного обеспечения через интернет.
|
|
|
|
**Примеры:**
|
|
- Salesforce
|
|
- Microsoft 365
|
|
- Google Workspace
|
|
|
|
**Преимущества:**
|
|
- Готовое решение
|
|
- Обновления от провайдера
|
|
- Нет необходимости в установке
|
|
|
|
### Модели развертывания
|
|
|
|
#### 1. Public Cloud
|
|
- Ресурсы принадлежат провайдеру
|
|
- Общие с другими клиентами
|
|
- Примеры: AWS, Azure, GCP
|
|
|
|
#### 2. Private Cloud
|
|
- Ресурсы принадлежат организации
|
|
- Изолированная инфраструктура
|
|
- Примеры: VMware vCloud, OpenStack
|
|
|
|
#### 3. Hybrid Cloud
|
|
- Комбинация public и private cloud
|
|
- Гибкость в выборе размещения данных
|
|
- Примеры: AWS Outposts, Azure Arc
|
|
|
|
#### 4. Multi-Cloud
|
|
- Использование нескольких провайдеров
|
|
- Избежание vendor lock-in
|
|
- Примеры: AWS + Azure + GCP
|
|
|
|
### Ключевые характеристики облачных вычислений
|
|
|
|
#### 1. On-Demand Self-Service
|
|
- Автоматическое предоставление ресурсов
|
|
- Самообслуживание через портал или API
|
|
|
|
#### 2. Broad Network Access
|
|
- Доступ через стандартные сетевые протоколы
|
|
- Поддержка различных устройств
|
|
|
|
#### 3. Resource Pooling
|
|
- Объединение ресурсов для множества клиентов
|
|
- Динамическое перераспределение
|
|
|
|
#### 4. Rapid Elasticity
|
|
- Быстрое масштабирование ресурсов
|
|
- Автоматическое управление нагрузкой
|
|
|
|
#### 5. Measured Service
|
|
- Мониторинг и измерение использования
|
|
- Прозрачность затрат
|
|
|
|
### Преимущества облачных вычислений
|
|
|
|
#### 1. Экономические преимущества
|
|
- **CAPEX vs OPEX**: Переход от капитальных к операционным расходам
|
|
- **Экономия масштаба**: Снижение стоимости за счет больших объемов
|
|
- **Pay-as-you-go**: Оплата только за используемые ресурсы
|
|
|
|
#### 2. Технические преимущества
|
|
- **Масштабируемость**: Горизонтальное и вертикальное масштабирование
|
|
- **Надежность**: Высокая доступность и отказоустойчивость
|
|
- **Безопасность**: Профессиональная защита данных
|
|
|
|
#### 3. Операционные преимущества
|
|
- **Быстрое развертывание**: Ускорение time-to-market
|
|
- **Автоматизация**: Уменьшение ручной работы
|
|
- **Глобальное присутствие**: Развертывание в разных регионах
|
|
|
|
### Риски и вызовы
|
|
|
|
#### 1. Безопасность
|
|
- **Data Breaches**: Утечки данных
|
|
- **Compliance**: Соответствие регулятивным требованиям
|
|
- **Access Control**: Управление доступом
|
|
|
|
#### 2. Vendor Lock-in
|
|
- **Dependency**: Зависимость от провайдера
|
|
- **Migration**: Сложность миграции
|
|
- **Standards**: Отсутствие стандартов
|
|
|
|
#### 3. Управление затратами
|
|
- **Cost Visibility**: Видимость затрат
|
|
- **Resource Optimization**: Оптимизация ресурсов
|
|
- **Budget Control**: Контроль бюджета
|
|
|
|
### Стратегии миграции в облако
|
|
|
|
#### 1. Lift and Shift
|
|
- Перенос приложений без изменений
|
|
- Быстрая миграция
|
|
- Минимальные риски
|
|
|
|
#### 2. Replatforming
|
|
- Небольшие изменения для облака
|
|
- Улучшение производительности
|
|
- Баланс скорости и оптимизации
|
|
|
|
#### 3. Refactoring
|
|
- Переписывание для облака
|
|
- Максимальная оптимизация
|
|
- Долгосрочные преимущества
|
|
|
|
#### 4. Rebuilding
|
|
- Полная перестройка
|
|
- Cloud-native архитектура
|
|
- Максимальная эффективность
|
|
|
|
### Инструменты и технологии
|
|
|
|
#### 1. Infrastructure as Code (IaC)
|
|
- **Terraform**: Multi-cloud IaC
|
|
- **CloudFormation**: AWS-specific
|
|
- **ARM Templates**: Azure-specific
|
|
|
|
#### 2. Containerization
|
|
- **Docker**: Контейнеризация приложений
|
|
- **Kubernetes**: Оркестрация контейнеров
|
|
- **Helm**: Управление пакетами
|
|
|
|
#### 3. Monitoring and Observability
|
|
- **CloudWatch**: AWS мониторинг
|
|
- **Azure Monitor**: Azure мониторинг
|
|
- **Stackdriver**: GCP мониторинг
|
|
|
|
#### 4. Security
|
|
- **IAM**: Управление доступом
|
|
- **VPC**: Виртуальные сети
|
|
- **Encryption**: Шифрование данных
|