MidПрактика2 min

Cloud Storage и CDN

GCP Cloud Storage хостинг с Cloud CDN для CRC

Архитектура фронтенда CRC на GCP

Браузер → Cloud CDN → Cloud Load Balancer → Cloud Storage bucket
    ↓
Cloud DNS → External IP (Load Balancer)

Важно: В отличие от AWS и Azure, GCP требует Load Balancer для CDN. Это дороже (~$18/мес), но $300 кредитов покрывают расходы.

Cloud Storage

# Создаём бакет
gsutil mb -p PROJECT_ID -l us-central1 -b on gs://ivan-petrov-resume

# Настраиваем как static website
gsutil web set -m index.html -e error.html gs://ivan-petrov-resume

# Делаем публичным
gsutil iam ch allUsers:objectViewer gs://ivan-petrov-resume

# Загружаем файлы
gsutil -m cp -r ./frontend/* gs://ivan-petrov-resume/

# Устанавливаем Content-Type
gsutil setmeta -h "Content-Type:text/html; charset=utf-8" \
  gs://ivan-petrov-resume/index.html
gsutil setmeta -h "Content-Type:text/css" \
  gs://ivan-petrov-resume/style.css
gsutil setmeta -h "Cache-Control:max-age=3600" \
  gs://ivan-petrov-resume/index.html

Cloud CDN с Load Balancer

# Backend bucket
gcloud compute backend-buckets create crc-backend-bucket \
  --gcs-bucket-name=ivan-petrov-resume \
  --enable-cdn \
  --cache-mode=CACHE_ALL_STATIC

# URL map
gcloud compute url-maps create crc-url-map \
  --default-backend-bucket=crc-backend-bucket

# SSL certificate (managed)
gcloud compute ssl-certificates create crc-ssl-cert \
  --domains=resume.ivanpetrov.com \
  --global

# HTTPS proxy
gcloud compute target-https-proxies create crc-https-proxy \
  --url-map=crc-url-map \
  --ssl-certificates=crc-ssl-cert \
  --global

# Reserved IP
gcloud compute addresses create crc-ip --global

# Forwarding rule
gcloud compute forwarding-rules create crc-https-forwarding \
  --target-https-proxy=crc-https-proxy \
  --ports=443 \
  --address=crc-ip \
  --global

# HTTP → HTTPS redirect
gcloud compute target-http-proxies create crc-http-proxy \
  --url-map=crc-url-map

gcloud compute forwarding-rules create crc-http-forwarding \
  --target-http-proxy=crc-http-proxy \
  --ports=80 \
  --address=crc-ip \
  --global

# Получаем IP
gcloud compute addresses describe crc-ip --global --format='get(address)'

Cloud DNS

# Создаём DNS-зону
gcloud dns managed-zones create ivanpetrov-zone \
  --dns-name=ivanpetrov.com \
  --description="CRC DNS"

# A-запись на LB IP
gcloud dns record-sets create resume.ivanpetrov.com \
  --zone=ivanpetrov-zone \
  --type=A \
  --ttl=300 \
  --rrdatas=34.120.XX.XX

Firebase Hosting (альтернатива)

Для экономии используйте Firebase Hosting вместо LB + CDN:

# Установка Firebase CLI
npm install -g firebase-tools

# Инициализация
firebase init hosting
# Выберите проект, директорию frontend/

# Деплой
firebase deploy --only hosting

# Результат: https://PROJECT_ID.web.app (бесплатно!)
# Custom domain через Firebase Console

Firebase Hosting: бесплатный HTTPS, CDN, custom domain. Для CRC -- оптимальная альтернатива.

Инвалидация кэша

# Cloud CDN
gcloud compute url-maps invalidate-cdn-cache crc-url-map \
  --path "/*" \
  --async

Проверь себя

Что делает cache-mode=CACHE_ALL_STATIC в backend bucket?

Какая бесплатная альтернатива Cloud CDN рекомендуется для CRC на GCP?

Зачем создаётся отдельный HTTP → HTTPS redirect через target-http-proxy?

Что означает gsutil -m в команде загрузки файлов?

Почему GCP CDN дороже для CRC, чем AWS CloudFront и Azure CDN?