Abstraktní schéma SSR aplikace na AWS s prohlížečem, serverovým kontejnerem a databázovou vrstvou

SSR aplikace na AWS: nejrychlejší nasazení bez DevOps kolečka

SSR aplikace na AWS nasadíte nejrychleji, když nebudujete vlastní platformu. V článku projdeme praktickou volbu mezi App Runnerem, Amplify Hostingem, Fargate a Lambdou, ukážeme Docker build pro Next.js a upozorníme na místa, kde se rychlý deploy nejčastěji rozbije.

Nejrychlejší produkční cesta přes App Runner

Pro obecnou SSR aplikaci na AWS je nejkratší rozumná cesta kontejner. Aplikaci zabalíte do Docker image, uložíte do Amazon ECR a spustíte jako službu v AWS App Runner. Dostanete HTTPS endpoint, škálování, logy a health check bez ruční konfigurace clusteru.

App Runner je dobrý kompromis mezi „chci to dnes spustit“ a „nechci se za měsíc stydět za architekturu“. Oficiální popis služby najdete v dokumentaci AWS App Runner. Pro Node.js SSR je podstatné, že nasazujete běžící HTTP server, ne statický export.

Největší úspora času je v tom, co neděláte. Nezakládáte vlastní ECS cluster, nepíšete target group, neřešíte ALB listener a nelepíte TLS certifikát ručně. U malého až středního produktu tím často ušetříte půl dne až několik dnů infrastruktury.

Cena za tuto jednoduchost je menší kontrola nad síťovou a provozní vrstvou. Pokud potřebujete detailně ladit load balancer, sidecary, servisní mesh nebo komplikované privátní routování, App Runner už nemusí stačit. Pro první produkční verzi SSR aplikace ale bývá správně pragmatický.

Kdy vybrat Amplify, Fargate nebo Lambda

AWS má pro webový runtime několik cest. Rychlost nasazení není jen počet kliknutí v konzoli, ale také počet rozhodnutí, která musíte udělat správně. U SSR hostingu rozhoduje framework, provozní režim, týmová zkušenost a očekávaný růst aplikace.

Doporučujeme volit podle toho, jak moc se chcete odchýlit od výchozího chování frameworku. Čím víc vlastních runtime požadavků, tím víc se vyplatí kontejner. Čím čistší frameworkový projekt, tím víc dává smysl managed hosting typu Amplify.

Amplify Hosting pro frameworkově čistý Next.js

AWS Amplify Hosting je pravděpodobně nejrychlejší cesta, pokud máte standardní Next.js projekt, Git repozitář a nechcete psát Dockerfile. Připojíte repozitář, nastavíte build příkaz, proměnné prostředí a necháte AWS řešit runtime pro podporovaný framework.

Pro Next.js SSR je vhodné nejdřív ověřit podporované scénáře v dokumentaci AWS Amplify pro Next.js. Pokud aplikace používá nestandardní server, vlastní binárky nebo složitější monorepo build, Amplify může začít brzdit právě tam, kde App Runner zůstává přímočarý.

ECS Fargate, když potřebujete síť a kontrolu

ECS Fargate je robustnější varianta pro týmy, které už mají AWS infrastrukturu pod kontrolou. Dává smysl, když potřebujete privátní subnety, více služeb, vlastní load balancer, přesnější autoscaling nebo napojení na existující VPC pravidla.

Nevýhoda je rychlost prvního deploye. Musíte rozhodnout cluster, task definition, service, target group, security groups, IAM role a logování. U dlouhodobě provozované platformy je to v pořádku. U jedné SSR aplikace na AWS je to často zbytečný náběhový odpor.

Lambda varianta pro nepravidelný provoz

Serverless přístup přes Lambda a nástroje typu OpenNext může být vhodný pro nepravidelný provoz, menší API a projekty citlivé na platbu za nečinnost. Není to ale nejrychlejší obecná odpověď, pokud chcete prostě spustit Node.js SSR server.

Lambda architektura rozkládá aplikaci na funkce, cache, CDN a další AWS komponenty. To je silné, ale přidává povrch pro ladění. Pokud tým nemá serverless zkušenost, bude první produkční incident dražší než pár ušetřených dolarů za běžící kontejner.

Příprava SSR runtime před deployem

Než řešíte AWS, zkontrolujte runtime kontrakt aplikace. Server musí poslouchat na portu z proměnné PORT, nesmí vyžadovat lokální zápis do perzistentního souborového systému a build nesmí záviset na tajných hodnotách, které patří až do runtime.

Typický problém u SSR je záměna build-time a runtime konfigurace. Veřejné hodnoty pro klienta patří do build procesu, tajné tokeny zůstávají na serveru. Pokud se API endpoint nebo OAuth secret propíše do image, rollback i audit začínají bolet.

U Next.js doporučujeme pro kontejnerový deploy používat standalone output. Minimalizuje velikost runtime artefaktu a kopíruje jen soubory potřebné pro běh serveru. Detaily chování popisuje dokumentace Next.js standalone output.

// next.config.ts
import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  output: 'standalone',
}

export default nextConfig

Stejný princip platí i pro jiné SSR frameworky. Potřebujete jasný build artefakt a jeden start příkaz. Jestli aplikace vyžaduje ruční kroky po buildu, nejdřív je přesuňte do skriptů. Ruční postup se v produkci vždycky vrátí jako chyba v release procesu.

Dockerfile pro Next.js standalone build

Dockerfile má být nudný. V produkci nechcete kreativní shell skript, který funguje jen na notebooku jednoho vývojáře. Potřebujete vícefázový build, zamčené závislosti, minimální runtime image a start přes Node server generovaný frameworkem.

Ukázka níže počítá s Next.js standalone výstupem. Používá npm ci, kopíruje statické soubory a spouští server na portu 3000. App Runner umí port namapovat podle konfigurace služby, ale aplikace musí opravdu poslouchat tam, kde tvrdíte.

FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

FROM node:22-alpine AS builder
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=3000

RUN addgroup -S nodejs && adduser -S nextjs -G nodejs

COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]

Všimněte si, že image neobsahuje .env soubor. To je záměr. Konfigurace patří do prostředí služby nebo do secret storage, ne do kontejneru. Jeden image pak můžete bezpečně pustit ve stagingu i v produkci s jinými proměnnými.

Pokud používáte pnpm nebo Bun, princip zůstává stejný. Zamknout verzi package manageru, instalovat deterministicky, buildovat v oddělené vrstvě a do runtime kopírovat jen výsledek. U SSR aplikace na AWS řešte menší image až po tom, co máte opakovatelný deploy.

Push image do ECR a vytvoření služby

Další krok je Amazon ECR. Repository vytvoříte jednou, potom do něj posíláte verze image z lokálu nebo CI. Pro produkci preferujeme tag podle commitu, ne jen latest. Jinak nevíte, co přesně běží a co rollback vrací zpět.

Následující příkazy ukazují minimální tok přes AWS CLI. Hodnoty AWS_ACCOUNT_ID, AWS_REGION a název repository si nastavte podle účtu. Pro Apple Silicon buildy je důležitý parametr platformy, aby image seděl na linuxový runtime.

export AWS_REGION=eu-central-1
export AWS_ACCOUNT_ID=123456789012
export REPOSITORY=next-ssr-app
export IMAGE_TAG=$(git rev-parse --short HEAD)

aws ecr create-repository \
  --repository-name $REPOSITORY \
  --region $AWS_REGION || true

aws ecr get-login-password --region $AWS_REGION | \
  docker login --username AWS --password-stdin \
  $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

docker buildx build \
  --platform linux/amd64 \
  -t $REPOSITORY:$IMAGE_TAG \
  --load .

docker tag $REPOSITORY:$IMAGE_TAG \
  $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPOSITORY:$IMAGE_TAG

docker push \
  $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPOSITORY:$IMAGE_TAG

Službu v App Runneru můžete vytvořit z konzole rychleji než psát první IAM JSON ručně. Vyberete ECR image, port 3000, automatické nebo manuální deploymenty a nastavíte health check. Jakmile postup stabilizujete, přesuňte konfiguraci do Terraformu nebo AWS CDK.

Pro týmy, které u nás řeší vývoj webových aplikací, obvykle začínáme přes managed službu a infrastrukturu zpřesňujeme až podle provozu. Je to rychlejší než navrhnout ideální AWS topologii před tím, než aplikace dostane první reálné uživatele.

Konfigurace proměnných, secretů a domény

Rychlý deploy nesmí znamenat chaotickou konfiguraci. Rozdělte proměnné na veřejné, serverové a citlivé. Veřejné hodnoty s prefixem frameworku mohou být součástí klientského bundlu. Databázové URI, API klíče a podpisové secrety tam nikdy nepatří.

V App Runneru nastavíte environment variables přímo u služby, případně napojíte hodnoty ze secrets. Pro první verzi stačí konzole, ale u produkce doporučujeme mít seznam proměnných v repozitáři jako šablonu bez hodnot. Reviewer pak vidí, co aplikace očekává.

# .env.example bez tajných hodnot
NODE_ENV=production
PORT=3000
APP_BASE_URL=https://example.com
DATABASE_URL=
SESSION_SECRET=
API_TOKEN=

Doménu připojte až po ověření, že health check prochází a aplikace vrací korektní odpovědi. DNS změna se špatně ladí, když zároveň nevíte, jestli padá kontejner, route handler nebo TLS. Nejdřív testujte na výchozí App Runner URL.

U cookies zkontrolujte Secure, SameSite a doménu. SSR aplikace za proxy často potřebuje správně číst hlavičky X-Forwarded-Proto a Host. Bez toho se přihlášení tváří náhodně rozbité, hlavně mezi stagingem a produkcí.

Databáze, migrace a práce se stavem

Kontejner v managed službě berte jako dočasný výpočet, ne jako místo pro stav. Uploady patří do S3 nebo jiné objektové storage, session do podepsané cookie nebo externího úložiště, fronty do samostatné služby. Lokální disk je jen pracovní prostor.

Databázi volte podle aplikace, ne podle AWS katalogu. Pro relační data je běžná volba PostgreSQL v RDS nebo Aurora. Pro MongoDB lze použít Atlas mimo AWS správu. Důležité je síťové napojení, latence v regionu a jasný plán záloh.

Migrace nespouštějte automaticky při startu serveru, pokud se může rozběhnout více instancí. Start aplikace má být rychlý a opakovatelný. Migrační krok spusťte v CI/CD, jednorázovým jobem nebo řízeně před přepnutím nové verze.

U ORM nástrojů typu Prisma, Drizzle nebo TypeORM si ověřte, že build nevyžaduje živé připojení k produkční databázi. Generování klienta patří do buildu, destruktivní změny schématu ne. Tady se rychlé nasazení nejčastěji mění v neplánovaný výpadek.

Observabilita, rollback a bezpečné releasy

Bez logů není rychlý deploy, jen rychlý hazard. Hned od první verze nastavte strukturované serverové logy, request ID a jasné chybové zprávy bez citlivých dat. App Runner posílá logy do CloudWatch, což pro první úroveň diagnostiky stačí.

Health check nemá testovat jen to, že proces žije. Vraťte jednoduchou odpověď z endpointu, který ověří základní připravenost aplikace, ale neshazuje službu kvůli dočasně pomalé závislosti. Příliš přísný health check umí vytvořit výpadek sám o sobě.

// app/api/health/route.ts
import { NextResponse } from 'next/server'

export async function GET() {
  return NextResponse.json({ ok: true }, { status: 200 })
}

Rollback musí být jednoduchý: znovu nasadit předchozí image tag a mít kompatibilní databázové schéma. Proto nepoužívejte pouze latest. Commit SHA nebo release tag je levná pojistka, která při incidentu šetří minuty i nervy.

U produkčního provozu přidejte alert na chybovost, latenci a počet restartů. Nemusí jít hned o složitý APM stack. Důležité je, aby se tým dozvěděl o problému dřív než zákazník a aby logy obsahovaly korelační stopu napříč požadavkem.

CI/CD pipeline místo ručního klikání

Ruční deploy přes konzoli je v pořádku pro první ověření architektury. Neměl by ale zůstat jako produkční proces. Jakmile víte, že SSR aplikace na AWS běží, přesuňte build, testy, push image a update služby do CI/CD pipeline.

Minimální pipeline má čtyři kroky: instalace závislostí, test a lint, build Docker image, push do ECR. Aktualizaci App Runner služby můžete spustit automaticky podle nového image tagu nebo explicitně přes AWS CLI. Explicitní release je pomalejší, ale lépe auditovatelný.

name: deploy

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm test -- --runInBand
      - run: npm run build
      # Následuje přihlášení do AWS, docker build, tag a push do ECR.

Do CI nikdy nedávejte dlouhodobé statické AWS klíče, pokud se tomu můžete vyhnout. Lepší je OIDC napojení mezi GitHub Actions a AWS IAM rolí. Pro rychlý prototyp se statické klíče občas objeví, ale patří k dluhu, který má krátkou splatnost.

Pipeline držte blízko aplikace. Pokud je infrastruktura v Terraformu nebo CDK, oddělte změny platformy od běžného releasu image. Aplikační release má být častý a nudný, infrastrukturní změna kontrolovaná a recenzovaná pomaleji.

Co si odnést při hostingu SSR na AWS

Pokud je cílem nejrychleji nasadit SSR aplikaci na AWS a nemáte zvláštní síťové požadavky, začněte App Runnerem. Pro čistý Next.js bez Dockeru zvažte Amplify. ECS Fargate berte jako krok k větší kontrole, ne jako povinný start.

Technicky rozhoduje hlavně příprava aplikace: jasný start příkaz, správný port, oddělené secrety, žádný stav v kontejneru, verzované image a funkční rollback. Když tyto věci sedí, AWS část je relativně mechanická.

Největší chyba je stavět ideální cloudovou platformu před prvním releasem. Nasadit, změřit provoz a teprve potom přidávat složitost je u SSR aplikací zdravější postup. Rychlost má hodnotu jen tehdy, když po ní zůstane opakovatelný a bezpečný deploy.

KATEGORIE:

SDÍLET:

Časté otázky

Jak nejrychleji nasadit SSR aplikaci na AWS?
Nejrychlejší obecná cesta je zabalit aplikaci do Docker image, nahrát ho do Amazon ECR a spustit přes AWS App Runner. Nemusíte ručně stavět load balancer, ECS cluster ani TLS terminaci. Pokud jde o čistý Next.js projekt a chcete Git deploy bez vlastního kontejneru, může být ještě rychlejší AWS Amplify Hosting. App Runner ale dává lepší přenositelnost mezi frameworky.
Je pro Next.js lepší AWS Amplify, nebo App Runner?
Amplify je rychlejší, pokud máte standardní Next.js aplikaci, nechcete řešit Docker a vyhovuje vám frameworkově řízený hosting. App Runner je lepší, když chcete přesně kontrolovat runtime, build, verzi Node.js, systémové balíčky nebo stejný image provozovat i jinde. Pro klientské projekty často volíme App Runner, protože produkční chování víc odpovídá běžnému Node.js serveru.
Musí mít SSR aplikace na AWS Docker?
Nemusí. Amplify Hosting umí nasazovat podporované frameworky bez vlastního Dockerfile. Docker ale výrazně snižuje překvapení mezi lokálním, CI a produkčním prostředím. U SSR aplikací je důležité, aby build i start příkaz běžely deterministicky, aplikace poslouchala na správném portu a všechny runtime proměnné byly dodané z hostingu nebo secrets manageru.
Kolik stojí provoz SSR aplikace přes App Runner?
Cena závisí hlavně na přidělené CPU, paměti, počtu běžících instancí, vytížení a odchozím provozu. App Runner obvykle není nejlevnější varianta pro trvale vysoký provoz, ale šetří čas při správě infrastruktury. Pro první produkční nasazení nebo menší produkt bývá rozdíl v měsíčních nákladech méně důležitý než rychlost releasu a menší provozní riziko.
Jak řešit migrace databáze při deployi SSR aplikace?
Migrace nespouštějte automaticky při startu každé instance, pokud nemáte zámky a idempotentní skripty. Bezpečnější je samostatný krok v CI/CD pipeline nebo jednorázový job před přepnutím nové verze. U App Runneru lze migrace řešit mimo službu například přes CI runner, ECS task nebo ručně řízený administrátorský skript. Důležité je mít rollback plán pro schéma i aplikaci.

Komentáře (0)

Načítám komentáře...

Přidat komentář

Váš email nebude zveřejněn. Všechny komentáře procházejí schválením administrátorem.

Tento web je chráněn službou reCAPTCHA a platí Zásady ochrany osobních údajů a Smluvní podmínky společnosti Google.