June 11, 2025

Модуль 10: Облачные платформы для DevOps

Курс DevOps для новичков 2025


☁️ Зачем изучать облачные платформы?

Облако — это не просто чужие компьютеры. Это глобальная инфраструктура с автоматическим масштабированием, managed сервисами и pay-as-you-use моделью. Современные компании мигрируют в облако для снижения затрат, повышения гибкости и ускорения разработки.

По данным исследований 2025 года, более 94% предприятий используют облачные сервисы, а 83% рабочих нагрузок работают в облаке. Знание облачных платформ стало обязательным навыком для DevOps-инженеров.


🏆 Большая тройка облачных провайдеров

Amazon Web Services (AWS)

Лидер рынка с самой широкой экосистемой сервисов (более 200 сервисов). Первопроходец в области облачных вычислений.

Microsoft Azure

Отличная интеграция с корпоративными продуктами Microsoft. Сильные позиции в hybrid cloud решениях.

Google Cloud Platform (GCP)

Сильные позиции в машинном обучении и анализе данных. Инновационные решения для контейнеров и Kubernetes.


🔧 Основные сервисы облачных платформ

Вычислительные ресурсы

Виртуальные машины:

  • AWS EC2 — Elastic Compute Cloud
  • Azure Virtual Machines — виртуальные машины Azure
  • GCP Compute Engine — вычислительные экземпляры

Serverless вычисления:

  • AWS Lambda — выполнение кода без серверов
  • Azure Functions — событийно-ориентированные функции
  • Google Cloud Functions — легковесные функции

Контейнерные сервисы:

  • AWS ECS/EKS — управляемые контейнеры и Kubernetes
  • Azure AKS — Azure Kubernetes Service
  • GCP GKE — Google Kubernetes Engine

Хранение данных

Объектное хранилище:

  • AWS S3 — Simple Storage Service
  • Azure Blob Storage — хранилище больших объектов
  • GCP Cloud Storage — объектное хранилище Google

Базы данных:

  • AWS RDS — реляционные базы данных
  • Azure SQL Database — управляемый SQL Server
  • GCP Cloud SQL — управляемые БД

Сетевые сервисы

Виртуальные сети:

  • AWS VPC — Virtual Private Cloud
  • Azure Virtual Network — виртуальные сети Azure
  • GCP VPC — Virtual Private Cloud Google

CDN и доставка контента:

  • AWS CloudFront — глобальная сеть доставки контента
  • Azure CDN — сеть доставки контента Microsoft
  • GCP Cloud CDN — CDN от Google

🛠️ Практика с AWS

Настройка AWS CLI

# Установка AWS CLI v2
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# Проверка установки
aws --version

# Настройка credentials (нужен AWS аккаунт)
aws configure
# AWS Access Key ID: [ваш ключ]
# AWS Secret Access Key: [ваш секретный ключ]
# Default region name: us-west-2
# Default output format: json

Создание EC2 инстанса

# Создание ключевой пары
aws ec2 create-key-pair \
    --key-name devops-course-key \
    --query 'KeyMaterial' \
    --output text > devops-course-key.pem

chmod 400 devops-course-key.pem

# Создание security group
aws ec2 create-security-group \
    --group-name devops-sg \
    --description "Security group for DevOps course"

# Получение ID security group
SG_ID=$(aws ec2 describe-security-groups \
    --group-names devops-sg \
    --query 'SecurityGroups[0].GroupId' \
    --output text)

# Разрешение SSH доступа
aws ec2 authorize-security-group-ingress \
    --group-id $SG_ID \
    --protocol tcp \
    --port 22 \
    --cidr 0.0.0.0/0

# Разрешение HTTP доступа
aws ec2 authorize-security-group-ingress \
    --group-id $SG_ID \
    --protocol tcp \
    --port 80 \
    --cidr 0.0.0.0/0

# Запуск EC2 инстанса
aws ec2 run-instances \
    --image-id ami-0c02fb55956c7d316 \
    --count 1 \
    --instance-type t2.micro \
    --key-name devops-course-key \
    --security-group-ids $SG_ID \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=DevOps-Course-Server}]'

🛠️ Практические задания

Задание 10.1: Развертывание веб-приложения в AWS

# 1. Получение публичного IP созданного инстанса
INSTANCE_ID=$(aws ec2 describe-instances \
    --filters "Name=tag:Name,Values=DevOps-Course-Server" \
    --query 'Reservations[0].Instances[0].InstanceId' \
    --output text)

PUBLIC_IP=$(aws ec2 describe-instances \
    --instance-ids $INSTANCE_ID \
    --query 'Reservations[0].Instances[0].PublicIpAddress' \
    --output text)

echo "Instance IP: $PUBLIC_IP"

# 2. Подключение к серверу
ssh -i devops-course-key.pem ubuntu@$PUBLIC_IP

# 3. Установка Docker на сервере
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ubuntu

# 4. Запуск простого веб-приложения
docker run -d --name web-app -p 80:80 nginx:alpine

# 5. Проверка работы
curl http://$PUBLIC_IP

Задание 10.2: Создание S3 bucket и загрузка файлов

# Создание уникального имени bucket
BUCKET_NAME="devops-course-$(date +%s)"

# Создание S3 bucket
aws s3 mb s3://$BUCKET_NAME

# Создание тестового файла
echo "Hello from DevOps course!" > test-file.txt

# Загрузка файла в S3
aws s3 cp test-file.txt s3://$BUCKET_NAME/

# Просмотр содержимого bucket
aws s3 ls s3://$BUCKET_NAME/

# Создание статического веб-сайта
cat > index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>DevOps Course - S3 Static Website</title>
</head>
<body>
    <h1>Welcome to DevOps Course!</h1>
    <p>This website is hosted on AWS S3</p>
    <p>Deployed at: <span id="timestamp"></span></p>
    <script>
        document.getElementById('timestamp').textContent = new Date().toLocaleString();
    </script>
</body>
</html>
EOF

# Загрузка веб-сайта
aws s3 cp index.html s3://$BUCKET_NAME/ --acl public-read

# Настройка статического хостинга
aws s3 website s3://$BUCKET_NAME/ \
    --index-document index.html \
    --error-document error.html

echo "Website URL: http://$BUCKET_NAME.s3-website-us-west-2.amazonaws.com"

Задание 10.3: Serverless функция с AWS Lambda

# lambda_function.py
import json
import boto3
from datetime import datetime

def lambda_handler(event, context):
    """
    AWS Lambda функция для обработки HTTP запросов
    """
    
    # Логирование входящего события
    print(f"Received event: {json.dumps(event)}")
    
    # Получение параметров из запроса
    http_method = event.get('httpMethod', 'GET')
    path = event.get('path', '/')
    query_params = event.get('queryStringParameters') or {}
    
    # Обработка различных путей
    if path == '/health':
        return {
            'statusCode': 200,
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            },
            'body': json.dumps({
                'status': 'healthy',
                'timestamp': datetime.utcnow().isoformat(),
                'version': '1.0.0'
            })
        }
    
    elif path == '/info' and http_method == 'GET':
        return {
            'statusCode': 200,
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            },
            'body': json.dumps({
                'message': 'DevOps Course Lambda Function',
                'timestamp': datetime.utcnow().isoformat(),
                'method': http_method,
                'query_params': query_params
            })
        }
    
    else:
        return {
            'statusCode': 404,
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            },
            'body': json.dumps({
                'error': 'Not Found',
                'path': path,
                'method': http_method
            })
        }
# Создание Lambda функции
zip lambda_function.zip lambda_function.py

# Создание роли для Lambda
aws iam create-role \
    --role-name lambda-execution-role \
    --assume-role-policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }'

# Присоединение политики
aws iam attach-role-policy \
    --role-name lambda-execution-role \
    --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

# Создание Lambda функции
aws lambda create-function \
    --function-name devops-course-function \
    --runtime python3.9 \
    --role arn:aws:iam::ACCOUNT-ID:role/lambda-execution-role \
    --handler lambda_function.lambda_handler \
    --zip-file fileb://lambda_function.zip

# Тестирование функции
aws lambda invoke \
    --function-name devops-course-function \
    --payload '{"httpMethod": "GET", "path": "/health"}' \
    response.json

cat response.json

🔧 Terraform для облачной инфраструктуры

AWS инфраструктура с Terraform

# main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

# VPC
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "devops-course-vpc"
  }
}

# Internet Gateway
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "devops-course-igw"
  }
}

# Public Subnet
resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "${var.aws_region}a"
  map_public_ip_on_launch = true

  tags = {
    Name = "devops-course-public-subnet"
  }
}

# Route Table
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main.id
  }

  tags = {
    Name = "devops-course-public-rt"
  }
}

resource "aws_route_table_association" "public" {
  subnet_id      = aws_subnet.public.id
  route_table_id = aws_route_table.public.id
}

# Security Group
resource "aws_security_group" "web" {
  name_prefix = "devops-course-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 = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "devops-course-web-sg"
  }
}

# Application Load Balancer
resource "aws_lb" "main" {
  name               = "devops-course-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.web.id]
  subnets            = [aws_subnet.public.id, aws_subnet.public2.id]

  enable_deletion_protection = false

  tags = {
    Name = "devops-course-alb"
  }
}

# Auto Scaling Group
resource "aws_launch_template" "web" {
  name_prefix   = "devops-course-"
  image_id      = data.aws_ami.ubuntu.id
  instance_type = var.instance_type

  vpc_security_group_ids = [aws_security_group.web.id]

  user_data = base64encode(templatefile("${path.module}/user_data.sh", {
    app_name = "devops-course"
  }))

  tag_specifications {
    resource_type = "instance"
    tags = {
      Name = "devops-course-web-server"
    }
  }
}

resource "aws_autoscaling_group" "web" {
  name                = "devops-course-asg"
  vpc_zone_identifier = [aws_subnet.public.id]
  target_group_arns   = [aws_lb_target_group.web.arn]
  health_check_type   = "ELB"
  
  min_size         = 1
  max_size         = 3
  desired_capacity = 2

  launch_template {
    id      = aws_launch_template.web.id
    version = "$Latest"
  }

  tag {
    key                 = "Name"
    value               = "devops-course-asg-instance"
    propagate_at_launch = true
  }
}

💰 Управление затратами в облаке

AWS Cost Management

# Просмотр текущих затрат
aws ce get-cost-and-usage \
    --time-period Start=2025-01-01,End=2025-01-31 \
    --granularity MONTHLY \
    --metrics BlendedCost

# Создание бюджета
cat > budget.json << 'EOF'
{
  "BudgetName": "DevOps-Course-Budget",
  "BudgetLimit": {
    "Amount": "50",
    "Unit": "USD"
  },
  "TimeUnit": "MONTHLY",
  "CostFilters": {
    "TagKey": ["Project"],
    "TagValue": ["DevOps-Course"]
  },
  "BudgetType": "COST"
}
EOF

aws budgets create-budget \
    --account-id $(aws sts get-caller-identity --query Account --output text) \
    --budget file://budget.json

Оптимизация затрат

Лучшие практики:

  • Используйте Reserved Instances для долгосрочных нагрузок
  • Настройте Auto Scaling для динамического масштабирования
  • Регулярно проверяйте неиспользуемые ресурсы
  • Используйте Spot Instances для некритичных задач
  • Настройте lifecycle policies для S3

🔒 Безопасность в облаке

Основные принципы

Shared Responsibility Model — модель разделенной ответственности:

  • Облачный провайдер отвечает за безопасность облака
  • Клиент отвечает за безопасность в облаке

IAM (Identity and Access Management)

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::devops-course-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}

Лучшие практики безопасности

  • Принцип минимальных привилегий — предоставляйте только необходимые права
  • Multi-Factor Authentication — включите 2FA для всех аккаунтов
  • Шифрование данных — в покое и при передаче
  • Регулярный аудит — проверяйте права доступа и логи
  • Сетевая сегментация — используйте VPC и security groups

📖 Полезные ресурсы

  • AWS Free Tier — бесплатные ресурсы для изучения AWS
  • Azure Free Account — $200 кредитов для новых пользователей
  • Google Cloud Free Tier — $300 кредитов и Always Free ресурсы
  • YouTube: "AWS для DevOps инженеров" — практические видеоуроки
  • Cloud Architecture Center — паттерны облачной архитектуры

✅ Чек-лист модуля

  • Понимаю основные концепции облачных вычислений
  • Изучил основные сервисы AWS/Azure/GCP
  • Настроил AWS CLI и создал первые ресурсы
  • Развернул веб-приложение в облаке
  • Создал S3 bucket и настроил статический хостинг
  • Написал и развернул Lambda функцию
  • Использовал Terraform для создания облачной инфраструктуры
  • Настроил мониторинг затрат и бюджеты
  • Изучил основы безопасности в облаке
  • Понимаю принципы выбора облачного провайдера

🚀 Что дальше?

После освоения облачных платформ переходите к Модулю 11: DevSecOps — Безопасность в DevOps для изучения интеграции безопасности в процессы разработки и эксплуатации.