DEV Community

Cover image for Heroku API nutzen: Komplette Integrationsanleitung (2026)
Emre Demir
Emre Demir

Posted on • Originally published at apidog.com

Heroku API nutzen: Komplette Integrationsanleitung (2026)

Kurz gesagt

Die Heroku API ermöglicht Entwicklern die programmatische Automatisierung der Bereitstellung, Verwaltung von Anwendungen, Konfiguration von Add-ons und Skalierung der Infrastruktur. Sie verwendet OAuth 2.0 und token-basierte Authentifizierung, RESTful-Endpunkte für Apps, Dynos, Builds und Pipelines, mit Ratenbegrenzungen von 10.000 Anfragen pro Stunde und Konto. Dieser Leitfaden behandelt die Einrichtung der Authentifizierung, Kern-Endpunkte, CI/CD-Integration und Strategien für die Produktionsbereitstellung.

Teste Apidog noch heute

Einleitung

Heroku betreibt über 4 Millionen Anwendungen in mehr als 170 Ländern. Für Entwickler, die Bereitstellungsautomatisierung, CI/CD-Pipelines oder Tools zur Verwaltung mehrerer Anwendungen entwickeln, ist die Heroku-API-Integration nicht optional – sie ist unerlässlich.

Hier ist die Realität: Teams, die mehr als 10 Heroku-Apps verwalten, verlieren wöchentlich 8-12 Stunden durch manuelle Bereitstellungen und Konfigurationsänderungen. Eine solide Heroku-API-Integration automatisiert Bereitstellungen, skaliert Dynos basierend auf dem Datenverkehr und synchronisiert die Konfiguration über Umgebungen hinweg.

Dieser Leitfaden führt dich durch den gesamten Heroku-API-Integrationsprozess – von der Authentifizierung über App- und Dyno-Verwaltung bis zu Build-Pipelines, Add-on-Bereitstellung und Fehlerbehebung. Am Ende hast du eine produktionsreife Heroku-Integration.

💡 Tipp: Apidog vereinfacht das Testen der API-Integration. Teste deine Heroku-Endpunkte, validiere Authentifizierungsabläufe, prüfe API-Antworten und debugge Konfigurationsprobleme in einem Arbeitsbereich. Importiere API-Spezifikationen, modelliere Antworten und teile Testszenarien mit deinem Team.

Was ist die Heroku-API?

Heroku bietet eine RESTful-Plattform-API zur Verwaltung von Anwendungen und Infrastruktur auf der Heroku-Plattform. Die API unterstützt:

  • Erstellung, Konfiguration und Löschung von Anwendungen
  • Dyno-Skalierung und Prozessverwaltung
  • Build- und Release-Management
  • Add-on-Bereitstellung und -Konfiguration
  • Pipeline- und Promotion-Management
  • Domain- und SSL-Zertifikatsverwaltung
  • Log-Drain- und Überwachungseinrichtung
  • Team- und Kollaborationsverwaltung

Hauptmerkmale

Funktion Beschreibung
RESTful-Design Standard-HTTP-Methoden mit JSON-Antworten
Token-Authentifizierung Bearer-Token mit OAuth 2.0-Unterstützung
Bereichsanfragen Paginierung für große Ergebnismengen
Ratenbegrenzung 10.000 Anfragen pro Stunde und Konto
Idempotente Erstellungen Sicheres Wiederholungsverhalten für Schreibvorgänge
Gzip-Komprimierung Antwortkomprimierung zur Bandbreiteneinsparung

Übersicht der API-Architektur

Heroku verwendet eine versionierte REST-API-Struktur:

https://api.heroku.com/
Enter fullscreen mode Exit fullscreen mode

Die API hält sich an die JSON:API-Spezifikation mit konsistenten Ressourcen und Beziehungen.

API-Versionen im Vergleich

Version Status Authentifizierung Anwendungsfall
Plattform-API (v3) Aktuell Bearer-Token Alle neuen Integrationen
GitHub-Integration Aktuell OAuth 2.0 Mit GitHub verbundene Apps
Container-Registrierung Aktuell Docker-Authentifizierung Container-Bereitstellungen

Erste Schritte: Authentifizierung einrichten

Schritt 1: Heroku-Konto erstellen

Bevor du auf die API zugreifst, benötigst du ein Heroku-Konto:

Heroku Anmeldebildschirm

  1. Besuche die Heroku-Website
  2. Klicke auf Registrieren und erstelle dein Konto
  3. Bestätige deine E-Mail-Adresse
  4. Schließe die Kontoeinrichtung ab

Schritt 2: Heroku CLI installieren

Die Heroku CLI hilft beim Generieren von API-Tokens und Testbefehlen:

# macOS
brew tap heroku/brew && brew install heroku

# Windows
npm install -g heroku

# Linux
curl https://cli-assets.heroku.com/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

Schritt 3: API-Token generieren

Authentifiziere dich mit der Heroku CLI:

# Bei Heroku anmelden
heroku login
Enter fullscreen mode Exit fullscreen mode

Nach der Anmeldung wird dein Token lokal gespeichert. Rufe dein API-Token ab:

# Kurzlebiges Token anzeigen
heroku authorizations:create --short-lived

# Langlebiges Token (für CI/CD) erstellen
heroku authorizations:create --description "CI/CD Pipeline" --expires-in "1 year"
Enter fullscreen mode Exit fullscreen mode

Sicherheit: Speichere Tokens in Umgebungsvariablen – niemals im Code.

# .env-Datei
HEROKU_API_KEY="ihr_api_schlüssel_hier"
HEROKU_APP_NAME="ihre-app-name"
Enter fullscreen mode Exit fullscreen mode

Schritt 4: Token-Authentifizierung verstehen

Heroku verwendet Bearer-Token-Authentifizierung. Jeder Request benötigt:

Authorization: Bearer {api_key}
Accept: application/vnd.heroku+json; version=3
Enter fullscreen mode Exit fullscreen mode

Schritt 5: Ersten API-Aufruf tätigen

Teste die Authentifizierung:

curl -n https://api.heroku.com/account \
  -H "Accept: application/vnd.heroku+json; version=3" \
  -H "Authorization: Bearer $HEROKU_API_KEY"
Enter fullscreen mode Exit fullscreen mode

Erwartete Antwort:

{
  "id": "benutzer-id-hier",
  "email": "entwickler@example.com",
  "name": "Entwickler Name",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2026-03-20T14:22:00Z"
}
Enter fullscreen mode Exit fullscreen mode

Schritt 6: Authentifizierung im Code implementieren

Erstelle einen wiederverwendbaren API-Client, z.B. in JavaScript/Node.js:

const HEROKU_API_KEY = process.env.HEROKU_API_KEY;
const HEROKU_BASE_URL = 'https://api.heroku.com';

const herokuRequest = async (endpoint, options = {}) => {
  const response = await fetch(`${HEROKU_BASE_URL}${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${HEROKU_API_KEY}`,
      'Accept': 'application/vnd.heroku+json; version=3',
      'Content-Type': 'application/json',
      ...options.headers
    }
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Heroku API Fehler: ${error.message}`);
  }

  return response.json();
};

// Beispiel
const account = await herokuRequest('/account');
console.log(`Angemeldet als: ${account.email}`);
Enter fullscreen mode Exit fullscreen mode

Anwendungsverwaltung

Neue App erstellen

Programmatisch eine App anlegen:

const createApp = async (appName, region = 'us') => {
  const response = await herokuRequest('/apps', {
    method: 'POST',
    body: JSON.stringify({
      name: appName,
      region: region
    })
  });
  return response;
};

// Beispiel
const app = await createApp('meine-super-app-2026');
console.log(`App erstellt: ${app.name}`);
console.log(`Git URL: ${app.git_url}`);
console.log(`Web URL: ${app.web_url}`);
Enter fullscreen mode Exit fullscreen mode

Erwartete App-Antwort

{
  "id": "app-uuid-hier",
  "name": "meine-super-app-2026",
  "region": { "name": "us" },
  "created_at": "2026-03-25T10:00:00Z",
  "updated_at": "2026-03-25T10:00:00Z",
  "git_url": "https://git.heroku.com/meine-super-app-2026.git",
  "web_url": "https://meine-super-app-2026.herokuapp.com",
  "owner": { "email": "entwickler@example.com" },
  "build_stack": { "name": "heroku-24" }
}
Enter fullscreen mode Exit fullscreen mode

Apps auflisten

const listApps = async (limit = 50) => {
  const response = await herokuRequest(`/apps?limit=${limit}`);
  return response;
};

// Beispiel
const apps = await listApps();
apps.forEach(app => {
  console.log(`${app.name} - ${app.web_url}`);
});
Enter fullscreen mode Exit fullscreen mode

App-Details abrufen

const getApp = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}`);
  return response;
};

// Beispiel
const app = await getApp('meine-super-app-2026');
console.log(`Stack: ${app.build_stack.name}`);
console.log(`Region: ${app.region.name}`);
Enter fullscreen mode Exit fullscreen mode

App-Konfiguration aktualisieren

const updateApp = async (appName, updates) => {
  const response = await herokuRequest(`/apps/${appName}`, {
    method: 'PATCH',
    body: JSON.stringify(updates)
  });
  return response;
};

// Beispiel: App-Namen ändern
const updated = await updateApp('alter-app-name', {
  name: 'neuer-app-name'
});
Enter fullscreen mode Exit fullscreen mode

App löschen

const deleteApp = async (appName) => {
  await herokuRequest(`/apps/${appName}`, {
    method: 'DELETE'
  });
  console.log(`App ${appName} erfolgreich gelöscht`);
};
Enter fullscreen mode Exit fullscreen mode

Dyno-Verwaltung

Dynos skalieren

const scaleDyno = async (appName, processType, quantity) => {
  const response = await herokuRequest(`/apps/${appName}/formation/${processType}`, {
    method: 'PATCH',
    body: JSON.stringify({
      quantity: quantity
    })
  });
  return response;
};

// Beispiel: Web-Dynos auf 3 skalieren
const formation = await scaleDyno('meine-app', 'web', 3);
console.log(`Skaliert auf ${formation.quantity} ${processType} Dynos`);
Enter fullscreen mode Exit fullscreen mode

Dyno-Formation abrufen

const getFormation = async (appName, processType = null) => {
  const endpoint = processType
    ? `/apps/${appName}/formation/${processType}`
    : `/apps/${appName}/formation`;
  const response = await herokuRequest(endpoint);
  return response;
};

// Beispiel
const formation = await getFormation('meine-app');
formation.forEach(proc => {
  console.log(`${proc.type}: ${proc.quantity} Dynos (@ ${proc.size})`);
});
Enter fullscreen mode Exit fullscreen mode

Verfügbare Dyno-Größen

Dyno-Typ Anwendungsfall Kosten/Monat
eco Hobbyprojekte, Demos 5 $
basic Kleine Produktionsanwendungen 7 $
standard-1x Standard-Workloads 25 $
standard-2x Hochleistungsanwendungen 50 $
performance Produktionskritische Apps 250 $+
private Unternehmensisolation Benutzerdefiniert

Dynos neu starten

const restartDynos = async (appName, processType = null) => {
  const endpoint = processType
    ? `/apps/${appName}/formation/${processType}`
    : `/apps/${appName}/dynos`;

  await herokuRequest(endpoint, {
    method: 'DELETE'
  });

  console.log(`Dynos für ${appName} neu gestartet`);
};
Enter fullscreen mode Exit fullscreen mode

Einmalige Dynos ausführen

const runCommand = async (appName, command) => {
  const response = await herokuRequest(`/apps/${appName}/dynos`, {
    method: 'POST',
    body: JSON.stringify({
      command: command,
      size: 'standard-1x'
    })
  });

  return response;
};

// Beispiel: Datenbankmigration ausführen
const dyno = await runCommand('meine-app', 'npm run migrate');
console.log(`Dyno gestartet: ${dyno.id}`);
Enter fullscreen mode Exit fullscreen mode

Konfigurationsvariablen

Konfigurationsvariablen abrufen

const getConfigVars = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}/config-vars`);
  return response;
};

// Beispiel
const config = await getConfigVars('meine-app');
console.log(`DATABASE_URL: ${config.DATABASE_URL}`);
console.log(`NODE_ENV: ${config.NODE_ENV}`);
Enter fullscreen mode Exit fullscreen mode

Konfigurationsvariablen setzen

const setConfigVars = async (appName, variables) => {
  const response = await herokuRequest(`/apps/${appName}/config-vars`, {
    method: 'PATCH',
    body: JSON.stringify(variables)
  });
  return response;
};

// Beispiel
const updated = await setConfigVars('meine-app', {
  NODE_ENV: 'production',
  API_SECRET: 'ihr-geheimschlüssel',
  LOG_LEVEL: 'info'
});
Enter fullscreen mode Exit fullscreen mode

Best Practices für Konfigurationsvariablen

  1. Niemals Geheimnisse committen – Nutze Umgebungsvariablen für sensible Daten.
  2. Separate Konfigurationen pro Umgebung – Staging vs. Produktion trennen.
  3. Geheimnisse regelmäßig rotieren – API-Schlüssel vierteljährlich aktualisieren.
  4. Verwandte Variablen präfixen – z.B. STRIPE_SECRET_KEY.

Build- und Release-Management

Build erstellen

const createBuild = async (appName, sourceBlobUrl) => {
  const response = await herokuRequest(`/apps/${appName}/builds`, {
    method: 'POST',
    body: JSON.stringify({
      source_blob: {
        url: sourceBlobUrl
      }
    })
  });

  return response;
};

// Beispiel
const build = await createBuild('meine-app', 'https://storage.example.com/source.tar.gz');
console.log(`Build gestartet: ${build.id}`);
console.log(`Status: ${build.status}`);
Enter fullscreen mode Exit fullscreen mode

Build-Status abrufen

const getBuild = async (appName, buildId) => {
  const response = await herokuRequest(`/apps/${appName}/builds/${buildId}`);
  return response;
};

// Status polling
const checkBuildStatus = async (appName, buildId, maxAttempts = 30) => {
  for (let i = 0; i < maxAttempts; i++) {
    const build = await getBuild(appName, buildId);

    if (build.status === 'succeeded') {
      console.log('Build erfolgreich!');
      return build;
    } else if (build.status === 'failed') {
      throw new Error(`Build fehlgeschlagen: ${build.output}`);
    }

    console.log(`Build läuft... Versuch ${i + 1}`);
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
  throw new Error('Build-Timeout');
};
Enter fullscreen mode Exit fullscreen mode

Releases auflisten

const listReleases = async (appName, limit = 10) => {
  const response = await herokuRequest(`/apps/${appName}/releases?limit=${limit}`);
  return response;
};

// Beispiel
const releases = await listReleases('meine-app');
releases.forEach(release => {
  console.log(`v${release.version} - ${release.description} - ${release.created_at}`);
});
Enter fullscreen mode Exit fullscreen mode

Zurücksetzen auf früheres Release

const rollback = async (appName, releaseId) => {
  const response = await herokuRequest(`/apps/${appName}/releases`, {
    method: 'POST',
    body: JSON.stringify({
      rollback: releaseId
    })
  });

  return response;
};

// Beispiel: auf Version 42 zurücksetzen
const rollbackRelease = await rollback('meine-app', 42);
console.log(`Zurückgesetzt auf v${rollbackRelease.version}`);
Enter fullscreen mode Exit fullscreen mode

Pipeline-Verwaltung

Pipeline erstellen

const createPipeline = async (pipelineName) => {
  const response = await herokuRequest('/pipelines', {
    method: 'POST',
    body: JSON.stringify({
      name: pipelineName
    })
  });

  return response;
};

// Beispiel
const pipeline = await createPipeline('meine-app-pipeline');
console.log(`Pipeline erstellt: ${pipeline.id}`);
Enter fullscreen mode Exit fullscreen mode

Apps zur Pipeline hinzufügen

const addAppToPipeline = async (pipelineId, appName, stage) => {
  const response = await herokuRequest('/pipeline-couplings', {
    method: 'POST',
    body: JSON.stringify({
      pipeline: pipelineId,
      app: appName,
      stage: stage // 'development', 'staging', 'production'
    })
  });

  return response;
};

// Beispiel
await addAppToPipeline(pipelineId, 'meine-app-dev', 'development');
await addAppToPipeline(pipelineId, 'meine-app-staging', 'staging');
await addAppToPipeline(pipelineId, 'meine-app-prod', 'production');
Enter fullscreen mode Exit fullscreen mode

Slug zur nächsten Phase befördern

const promoteSlug = async (slugId, toApp) => {
  await herokuRequest('/promotions', {
    method: 'POST',
    body: JSON.stringify({
      from: toApp, // Quell-App
      to: toApp,   // Ziel-App (nächste Phase)
      slug: slugId
    })
  });

  console.log(`Slug ${slugId} zu ${toApp} befördert`);
};
Enter fullscreen mode Exit fullscreen mode

Add-On-Verwaltung

Add-Ons bereitstellen

const provisionAddon = async (appName, addonPlan, config = {}) => {
  const response = await herokuRequest('/addon-attachments', {
    method: 'POST',
    body: JSON.stringify({
      app: appName,
      plan: addonPlan,
      config: config
    })
  });

  return response;
};

// Beispiel: PostgreSQL bereitstellen
const db = await provisionAddon('meine-app', 'heroku-postgresql:mini', {});
console.log(`Datenbank bereitgestellt: ${db.addon.name}`);
console.log(`DATABASE_URL: ${db.addon.config_vars.DATABASE_URL}`);
Enter fullscreen mode Exit fullscreen mode

Beliebte Add-Ons

Add-On Plan Startpreis Anwendungsfall
heroku-postgresql mini 5 $/Monat Produktionsdatenbank
heroku-redis mini 5 $/Monat Caching, Sessions
papertrail choklad 7 $/Monat Log-Aggregation
sentry developer Kostenlos Fehlerverfolgung
mailgun sandbox Kostenlos E-Mail-Zustellung
newrelic lite Kostenlos Anwendungsüberwachung

Add-Ons auflisten

const listAddons = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}/addons`);
  return response;
};

// Beispiel
const addons = await listAddons('meine-app');
addons.forEach(addon => {
  console.log(`${addon.plan.name} - $${addon.pricing.plan.price} - ${addon.state}`);
});
Enter fullscreen mode Exit fullscreen mode

Add-Ons entfernen

const removeAddon = async (appName, addonId) => {
  await herokuRequest(`/apps/${appName}/addons/${addonId}`, {
    method: 'DELETE'
  });
  console.log(`Add-on ${addonId} von ${appName} entfernt`);
};
Enter fullscreen mode Exit fullscreen mode

Domain- und SSL-Verwaltung

Benutzerdefinierte Domains hinzufügen

const addDomain = async (appName, domainName) => {
  const response = await herokuRequest(`/apps/${appName}/domains`, {
    method: 'POST',
    body: JSON.stringify({
      hostname: domainName
    })
  });

  return response;
};

// Beispiel
const domain = await addDomain('meine-app', 'api.example.com');
console.log(`CNAME-Ziel: ${domain.cname}`);
Enter fullscreen mode Exit fullscreen mode

SSL-Zertifikate konfigurieren

const addSslCertificate = async (appName, domainId, certificateChain, privateKey) => {
  const response = await herokuRequest(`/apps/${appName}/domains/${domainId}/ssl_endpoint`, {
    method: 'PATCH',
    body: JSON.stringify({
      ssl_cert: {
        cert_chain: certificateChain,
        private_key: privateKey
      }
    })
  });

  return response;
};
Enter fullscreen mode Exit fullscreen mode

Automatisches SSL mit ACM

const enableACM = async (appName, domainName) => {
  const response = await herokuRequest(`/apps/${appName}/domains/${domainName}/sni_endpoint`, {
    method: 'POST',
    body: JSON.stringify({
      kind: 'acm'
    })
  });

  return response;
};
Enter fullscreen mode Exit fullscreen mode

Ratenbegrenzung und Quoten

Ratenbegrenzungen verstehen

Heroku setzt Ratenbegrenzungen durch, um die API-Stabilität zu schützen:

  • Standardlimit: 10.000 Anfragen pro Stunde und Konto
  • Fenster: Rollierendes 60-Minuten-Fenster
  • Zurücksetzen: Automatisch nach Ablauf

Überschreitungen führen zu HTTP 429 (Too Many Requests).

Umgang mit Ratenbegrenzungen implementieren

Exponentielles Backoff für Wiederholungsversuche:

const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await herokuRequest(endpoint, options);

      // Ratenbegrenzungs-Header prüfen
      const remaining = response.headers.get('RateLimit-Remaining');
      const resetTime = response.headers.get('RateLimit-Reset');

      if (remaining < 100) {
        console.warn(`Niedriges Restkontingent: ${remaining}, Rücksetzung um ${resetTime}`);
      }

      return response;
    } catch (error) {
      if (error.message.includes('429') && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000;
        console.log(`Ratenbegrenzung erreicht. Wiederhole in ${delay}ms...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
};
Enter fullscreen mode Exit fullscreen mode

Ratenbegrenzungs-Header

Header Beschreibung
RateLimit-Limit Maximale Anfragen pro Stunde
RateLimit-Remaining Verbleibende Anfragen im Fenster
RateLimit-Reset Unix-Zeitstempel für das Zurücksetzen

Behebung häufiger Probleme

Problem: Authentifizierung schlägt mit 401 fehl

Symptome: „Ungültige Anmeldeinformationen“-Fehler.

Lösungen:

  1. Prüfe, ob der API-Schlüssel korrekt ist: heroku authorizations
  2. Stelle sicher, dass das Token nicht abgelaufen ist
  3. Umgebungsvariablen auf Leerzeichen prüfen
  4. Token ggf. neu generieren: heroku authorizations:create

Problem: App-Name bereits vergeben

Symptome: „Name ist bereits vergeben“.

Lösungen:

  1. Globale, eindeutige Namen verwenden (Suffix/Präfix)
  2. UUID-basierte Namen generieren: app-${Date.now()}
  3. Namensschema wie teamname-appname-env
const generateUniqueAppName = (baseName) => {
  const timestamp = Date.now().toString(36);
  const random = Math.random().toString(36).substring(2, 6);
  return `${baseName}-${timestamp}-${random}`;
};
Enter fullscreen mode Exit fullscreen mode

Problem: Dyno-Formation schlägt fehl

Symptome: Skalierungsvorgänge geben Fehler zurück.

Lösungen:

  1. Prüfe, ob der Prozesstyp in der Procfile existiert
  2. Dyno-Kontingent prüfen
  3. App darf nicht gesperrt sein
  4. Dyno-Stundennutzung prüfen: heroku ps --app=meine-app

Problem: Build schlägt mit Timeout fehl

Symptome: Builds laufen in Timeout (>30 Min).

Lösungen:

  1. Buildpacks optimieren
  2. Dependencies cachen
  3. Große Builds aufteilen
  4. Vorgefertigte Slugs nutzen

Problem: Ratenbegrenzung überschritten

Symptome: HTTP 429-Antworten.

Lösungen:

  1. Request-Queuing implementieren
  2. Exponentielles Backoff bei Fehlern
  3. Anfragen bündeln, wo möglich
  4. Ratenbegrenzungs-Header überwachen
// Einfacher Ratenbegrenzer
class HerokuRateLimiter {
  constructor(requestsPerMinute = 150) {
    this.queue = [];
    this.interval = 60000 / requestsPerMinute;
    this.processing = false;
  }

  async add(requestFn) {
    return new Promise((resolve, reject) => {
      this.queue.push({ requestFn, resolve, reject });
      this.process();
    });
  }

  async process() {
    if (this.processing || this.queue.length === 0) return;

    this.processing = true;

    while (this.queue.length > 0) {
      const { requestFn, resolve, reject } = this.queue.shift();

      try {
        const result = await requestFn();
        resolve(result);
      } catch (error) {
        reject(error);
      }

      if (this.queue.length > 0) {
        await new Promise(r => setTimeout(r, this.interval));
      }
    }

    this.processing = false;
  }
}
Enter fullscreen mode Exit fullscreen mode

Checkliste für die Produktionsbereitstellung

Vor dem Go-Live:

  • [ ] Langlebige API-Tokens für CI/CD verwenden
  • [ ] Tokens sicher speichern (z.B. Vault, AWS Secrets Manager)
  • [ ] Ratenbegrenzung und Request-Queuing implementieren
  • [ ] Fehlerbehandlung hinzufügen
  • [ ] Logging für API-Aufrufe einrichten
  • [ ] Dyno-Stundennutzung überwachen
  • [ ] Log-Drains für externes Logging konfigurieren
  • [ ] Pipeline-Promotions für CI/CD einrichten
  • [ ] Automatische Zertifikatsverwaltung aktivieren
  • [ ] Backup-Strategie für Datenbanken einrichten

Überwachung und Alarmierung

Verfolge diese Metriken:

const metrics = {
  apiCalls: {
    total: 0,
    successful: 0,
    failed: 0,
    rateLimited: 0
  },
  dynoHours: {
    used: 0,
    quota: 1000
  },
  deployments: {
    successful: 0,
    failed: 0,
    avg_duration: 0
  }
};

// Alarm bei hoher Fehlerrate
const failureRate = metrics.apiCalls.failed / metrics.apiCalls.total;

if (failureRate > 0.05) {
  sendAlert('Heroku API-Fehlerrate über 5%');
}

// Alarm bei Dyno-Stundennutzung
if (metrics.dynoHours.used > metrics.dynoHours.quota * 0.8) {
  sendAlert('Dyno-Stundennutzung über 80%');
}
Enter fullscreen mode Exit fullscreen mode

Praktische Anwendungsfälle

Automatisierte CI/CD-Pipeline

Ein SaaS-Team automatisiert Bereitstellungen von GitHub:

  • Herausforderung: Manuelle Bereitstellungen verursachten Fehler und Verzögerungen
  • Lösung: GitHub Actions + Heroku API-Integration
  • Ergebnis: Bereitstellungen ohne Ausfallzeiten, 90% schnellere Releases

Implementierung:

  1. GitHub Push löst Workflow aus
  2. Tests laufen in CI
  3. Heroku API erstellt Build aus Source Blob
  4. Promotion von Staging nach Produktion
  5. Team wird benachrichtigt

Multi-Umgebungsverwaltung

Eine Beratungsfirma verwaltet 50+ Kunden-Apps:

  • Herausforderung: Manueller Konfigurationsabgleich
  • Lösung: Zentrale Konfigurationsverwaltung mit Heroku API
  • Ergebnis: Konsistente Konfigurationen, 8 Stunden/Woche gespart

Integrationspunkte:

  • Konfigurationsvariablen über Umgebungen synchronisieren
  • Automatisierte Add-on-Bereitstellung
  • Massenoperationen für Client-Onboarding

Automatische Skalierung nach Verkehr

Eine E-Commerce-Plattform meistert Verkehrsspitzen:

  • Herausforderung: Manuelle Skalierung bei Events
  • Lösung: Metrikbasierte Auto-Skalierung mit Heroku API
  • Ergebnis: Keine Ausfallzeiten bei 10x Traffic

Auto-Skalierungslogik:

  • Antwortzeiten über Metrik-API überwachen
  • Hochskalieren bei p95-Latenz > 500ms
  • Herunterskalieren bei geringer Last
  • Alarm bei anhaltend hoher Auslastung

Fazit

Die Heroku API bietet umfassenden Zugang zur Plattformfunktionalität. Die wichtigsten Punkte:

  • Bearer-Token-Authentifizierung erfordert sichere Speicherung und Rotation
  • Ratenbegrenzung (10K/h) muss proaktiv überwacht werden
  • Pipeline-Management ermöglicht robuste CI/CD-Workflows
  • Fehlerbehandlung ist kritisch für Zuverlässigkeit
  • Apidog optimiert API-Testing und Teamwork für Heroku-Integrationen

FAQ-Bereich

Wofür wird die Heroku API verwendet?

Die Heroku API ermöglicht die programmatische Verwaltung von Anwendungen, Dynos, Add-ons und Infrastruktur. Typische Anwendungsfälle: CI/CD-Automatisierung, Multi-App-Management, Auto-Skalierung, Infrastruktur-Dashboards.

Wie erhalte ich einen Heroku API-Schlüssel?

Installiere die Heroku CLI, führe heroku login aus, dann heroku authorizations:create. Speichere das Token in Umgebungsvariablen.

Ist die Heroku API kostenlos nutzbar?

Ja, die Heroku API ist kostenlos. Du bezahlst nur für bereitgestellte Ressourcen (Dynos, Add-ons). Limit: 10.000 Anfragen/Stunde/Konto.

Welche Authentifizierung verwendet die Heroku API?

Bearer-Token-Authentifizierung. Header: Authorization: Bearer {api_key}. Tokens sind kurzlebig (1h) oder langlebig (bis zu 1 Jahr).

Wie gehe ich mit Heroku API-Ratenbegrenzungen um?

Überwache den RateLimit-Remaining-Header und implementiere Request-Queuing. Verwende exponentielles Backoff bei HTTP 429. Bleibe unter 150 Anfragen/Minute.

Kann ich ohne Git bereitstellen?

Ja, nutze die Builds API und bereitstelle über eine Source Blob URL (z.B. aus S3/GCS).

Wie automatisiere ich Bereitstellungen?

Mit der Pipeline API. Erstelle Builds, befördere Slugs und integriere mit GitHub oder CI-Systemen.

Was ist der Unterschied zwischen einem Release und einem Build?

Build: Kompiliert den Code zu einem Slug.

Release: Kombiniert Slug + Konfiguration für die Bereitstellung.

Wie setze ich eine fehlgeschlagene Bereitstellung zurück?

List Releases via API, dann POST an /releases mit rollback: <release_id> – erzeugt ein neues Release mit der alten Version.

Kann ich mehrere Heroku-Konten verwalten?

Ja, nutze separate API-Tokens und setze jeweils die Umgebungsvariable HEROKU_API_KEY.

Top comments (0)