Модуль 10: Облачные платформы для DevOps
☁️ Зачем изучать облачные платформы?
Облако — это не просто чужие компьютеры. Это глобальная инфраструктура с автоматическим масштабированием, 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 — вычислительные экземпляры
- 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
- 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 для изучения интеграции безопасности в процессы разработки и эксплуатации.