헤로쿠 API 사용법: 완벽한 연동 가이드 (2026년)

Ashley Innocent

Ashley Innocent

25 March 2026

헤로쿠 API 사용법: 완벽한 연동 가이드 (2026년)

Apidog 엔터프라이즈

온프레미스 배포

SSO & RBAC

SOC 2 준수

Apidog Enterprise 살펴보기

TL;DR

Heroku API는 개발자들이 배포 자동화, 애플리케이션 관리, 애드온 구성 및 인프라 확장을 프로그래밍 방식으로 수행할 수 있도록 합니다. OAuth 2.0 및 토큰 기반 인증, 앱, 다이노, 빌드, 파이프라인을 위한 RESTful 엔드포인트를 사용하며, 계정당 시간당 10,000개의 요청으로 제한됩니다. 이 가이드는 인증 설정, 핵심 엔드포인트, CI/CD 통합 및 프로덕션 배포 전략을 다룹니다.

소개

Heroku는 170개 이상의 국가에서 4백만 개 이상의 애플리케이션을 지원합니다. 배포 자동화, CI/CD 파이프라인 또는 다중 앱 관리 도구를 구축하는 개발자에게 Heroku API 통합은 선택 사항이 아니라 필수적입니다.

현실은 이렇습니다: 10개 이상의 Heroku 앱을 관리하는 팀은 수동 배포 및 구성 변경에 매주 8-12시간을 낭비합니다. 견고한 Heroku API 통합은 배포를 자동화하고, 트래픽에 따라 다이노를 확장하며, 환경 전반에 걸쳐 구성을 동기화합니다.

이 가이드는 전체 Heroku API 통합 프로세스를 안내합니다. 토큰 인증, 앱 및 다이노 관리, 빌드 파이프라인, 애드온 프로비저닝 및 오류 해결 방법을 배울 것입니다. 결국 프로덕션 준비가 된 Heroku 통합을 갖게 될 것입니다.

💡
Apidog는 API 통합 테스트를 간소화합니다. Heroku 엔드포인트를 테스트하고, 인증 흐름을 검증하고, API 응답을 검사하고, 하나의 작업 공간에서 구성 문제를 디버그할 수 있습니다. API 사양을 가져오고, 응답을 모의하고, 테스트 시나리오를 팀과 공유하세요.

Heroku API란 무엇인가요?

Heroku는 Heroku 플랫폼에서 애플리케이션 및 인프라를 관리하기 위한 RESTful 플랫폼 API를 제공합니다. 이 API는 다음을 처리합니다:

주요 기능

기능 설명
RESTful 설계 JSON 응답과 함께 표준 HTTP 메서드
토큰 인증 OAuth 2.0을 지원하는 베어러 토큰
범위 요청 대규모 결과 집합을 위한 페이지 매김
속도 제한 계정당 시간당 10,000개 요청
멱등 생성 쓰기 작업에 대한 안전한 재시도 동작
Gzip 압축 대역폭 절약을 위한 응답 압축

API 아키텍처 개요

Heroku는 버전이 지정된 REST API 구조를 사용합니다:

https://api.heroku.com/

이 API는 일관된 리소스 패턴 및 관계와 함께 JSON:API 사양을 따릅니다.

API 버전 비교

버전 상태 인증 사용 사례
플랫폼 API (v3) 현재 베어러 토큰 모든 새 통합
GitHub 통합 현재 OAuth 2.0 GitHub 연결 앱
컨테이너 레지스트리 현재 Docker 인증 컨테이너 배포

시작하기: 인증 설정

1단계: Heroku 계정 생성

API에 액세스하기 전에 Heroku 계정이 필요합니다:

  1. Heroku 웹사이트 방문
  2. 가입을 클릭하고 계정 생성
  3. 이메일 주소 확인
  4. 계정 설정 완료

2단계: Heroku CLI 설치

CLI는 API 토큰을 생성하고 명령을 테스트하는 데 도움이 됩니다:

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

# Windows
npm install -g heroku

# Linux
curl https://cli-assets.heroku.com/install.sh | sh

3단계: API 토큰 생성

Heroku CLI로 인증:

# Login to Heroku
heroku login

# This opens a browser for authentication
# After login, your token is stored locally

API 토큰 검색:

# View your current authorization token
heroku authorizations:create --short-lived

# Or create a long-lived token (for CI/CD)
heroku authorizations:create --description "CI/CD Pipeline" --expires-in "1 year"

보안 참고: 토큰은 환경 변수에 저장하고 코드에 저장하지 마세요:

# .env file
HEROKU_API_KEY="your_api_key_here"
HEROKU_APP_NAME="your-app-name"

4단계: 토큰 인증 이해

Heroku는 베어러 토큰 인증을 사용합니다:

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

모든 API 요청에는 이 헤더들이 필요합니다.

5단계: 첫 번째 API 호출

인증 테스트:

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

예상 응답:

{
  "id": "user-id-here",
  "email": "developer@example.com",
  "name": "Developer Name",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2026-03-20T14:22:00Z"
}

6단계: 코드에 인증 구현

재사용 가능한 API 클라이언트 생성:

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 Error: ${error.message}`);
  }

  return response.json();
};

// 사용법
const account = await herokuRequest('/account');
console.log(`다음으로 로그인됨: ${account.email}`);

애플리케이션 관리

새 앱 생성

프로그래밍 방식으로 Heroku 앱 생성:

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

  return response;
};

// 사용법
const app = await createApp('my-awesome-app-2026');
console.log(`앱 생성됨: ${app.name}`);
console.log(`Git URL: ${app.git_url}`);
console.log(`웹 URL: ${app.web_url}`);

예상 앱 응답

{
  "id": "app-uuid-here",
  "name": "my-awesome-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/my-awesome-app-2026.git",
  "web_url": "https://my-awesome-app-2026.herokuapp.com",
  "owner": { "email": "developer@example.com" },
  "build_stack": { "name": "heroku-24" }
}

앱 목록 보기

계정에 있는 모든 앱 가져오기:

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

// 사용법
const apps = await listApps();
apps.forEach(app => {
  console.log(`${app.name} - ${app.web_url}`);
});

앱 세부 정보 가져오기

상세 앱 정보 검색:

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

// 사용법
const app = await getApp('my-awesome-app-2026');
console.log(`스택: ${app.build_stack.name}`);
console.log(`지역: ${app.region.name}`);

앱 구성 업데이트

앱 설정 수정:

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

  return response;
};

// 사용법 - 앱 이름 변경
const updated = await updateApp('old-app-name', {
  name: 'new-app-name'
});

앱 삭제

계정에서 앱 제거:

const deleteApp = async (appName) => {
  await herokuRequest(`/apps/${appName}`, {
    method: 'DELETE'
  });

  console.log(`앱 ${appName}이 성공적으로 삭제되었습니다.`);
};

다이노 관리

다이노 확장

애플리케이션 확장 또는 축소:

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

  return response;
};

// 사용법 - 웹 다이노를 3개로 확장
const formation = await scaleDyno('my-app', 'web', 3);
console.log(`${processType} 다이노를 ${formation.quantity}개로 확장했습니다.`);

다이노 형성 가져오기

현재 다이노 구성 보기:

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

  const response = await herokuRequest(endpoint);
  return response;
};

// 사용법
const formation = await getFormation('my-app');
formation.forEach(proc => {
  console.log(`${proc.type}: ${proc.quantity} dynos (@ ${proc.size})`);
});

사용 가능한 다이노 크기

다이노 유형 사용 사례 월별 비용
에코 취미 프로젝트, 데모 $5
기본 소규모 프로덕션 앱 $7
standard-1x 표준 워크로드 $25
standard-2x 고성능 앱 $50
성능 프로덕션에 중요한 앱 $250+
프라이빗 엔터프라이즈 격리 맞춤

다이노 재시작

앱의 모든 다이노 재시작:

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

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

  console.log(`${appName}의 다이노가 재시작되었습니다.`);
};

일회성 다이노 실행

격리된 다이노에서 명령 실행:

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

  return response;
};

// 사용법 - 데이터베이스 마이그레이션 실행
const dyno = await runCommand('my-app', 'npm run migrate');
console.log(`다이노 시작됨: ${dyno.id}`);

구성 변수

구성 변수 가져오기

환경 변수 검색:

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

// 사용법
const config = await getConfigVars('my-app');
console.log(`DATABASE_URL: ${config.DATABASE_URL}`);
console.log(`NODE_ENV: ${config.NODE_ENV}`);

구성 변수 설정

환경 변수 업데이트:

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

  return response;
};

// 사용법
const updated = await setConfigVars('my-app', {
  NODE_ENV: 'production',
  API_SECRET: 'your-secret-key',
  LOG_LEVEL: 'info'
});

구성 변수 모범 사례

  1. 절대 비밀을 커밋하지 마세요 - 모든 민감한 데이터에 환경 변수를 사용하세요
  2. 환경별로 별도의 구성 사용 - 스테이징과 프로덕션에 다른 변수 사용
  3. 정기적으로 비밀 회전 - API 키와 비밀번호를 분기별로 업데이트하세요
  4. 관련 변수 접두사 - STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET

빌드 및 릴리스 관리

빌드 생성

API를 통해 코드 배포:

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

  return response;
};

// 사용법
const build = await createBuild('my-app', 'https://storage.example.com/source.tar.gz');
console.log(`빌드 시작됨: ${build.id}`);
console.log(`상태: ${build.status}`);

빌드 상태 가져오기

빌드 진행 상황 확인:

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

// 완료될 때까지 폴링
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('빌드 성공!');
      return build;
    } else if (build.status === 'failed') {
      throw new Error(`빌드 실패: ${build.output}`);
    }

    console.log(`빌드 진행 중... 시도 ${i + 1}`);
    await new Promise(resolve => setTimeout(resolve, 5000));
  }

  throw new Error('빌드 시간 초과');
};

릴리스 목록 보기

릴리스 기록 보기:

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

// 사용법
const releases = await listReleases('my-app');
releases.forEach(release => {
  console.log(`v${release.version} - ${release.description} - ${release.created_at}`);
});

이전 릴리스로 롤백

이전 버전으로 되돌리기:

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

  return response;
};

// 사용법 - 버전 42로 롤백
const rollbackRelease = await rollback('my-app', 42);
console.log(`v${rollbackRelease.version}으로 롤백되었습니다.`);

파이프라인 관리

파이프라인 생성

CI/CD 파이프라인 설정:

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

  return response;
};

// 사용법
const pipeline = await createPipeline('my-app-pipeline');
console.log(`파이프라인 생성됨: ${pipeline.id}`);

파이프라인에 앱 추가

파이프라인 단계에 앱 연결:

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;
};

// 사용법
await addAppToPipeline(pipelineId, 'my-app-dev', 'development');
await addAppToPipeline(pipelineId, 'my-app-staging', 'staging');
await addAppToPipeline(pipelineId, 'my-app-prod', 'production');

다음 단계로 슬러그 승격

파이프라인을 통해 코드 이동:

const promoteSlug = async (slugId, toApp) => {
  await herokuRequest('/promotions', {
    method: 'POST',
    body: JSON.stringify({
      from: toApp, // Source app
      to: toApp,   // Target app (next stage)
      slug: slugId
    })
  });

  console.log(`슬러그 ${slugId}를 ${toApp}으로 승격했습니다.`);
};

애드온 관리

애드온 프로비저닝

Heroku 애드온 설치:

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;
};

// 사용법 - PostgreSQL 프로비저닝
const db = await provisionAddon('my-app', 'heroku-postgresql:mini', {});
console.log(`데이터베이스 프로비저닝됨: ${db.addon.name}`);
console.log(`DATABASE_URL: ${db.addon.config_vars.DATABASE_URL}`);

인기 애드온

애드온 요금제 시작 가격 사용 사례
heroku-postgresql 미니 월 $5 프로덕션 데이터베이스
heroku-redis 미니 월 $5 캐싱, 세션
papertrail 초콜라드 월 $7 로그 집계
sentry 개발자 무료 오류 추적
mailgun 샌드박스 무료 이메일 전송
newrelic 라이트 무료 애플리케이션 모니터링

애드온 목록 보기

설치된 애드온 보기:

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

// 사용법
const addons = await listAddons('my-app');
addons.forEach(addon => {
  console.log(`${addon.plan.name} - $${addon.pricing.plan.price} - ${addon.state}`);
});

애드온 제거

애드온 제거:

const removeAddon = async (appName, addonId) => {
  await herokuRequest(`/apps/${appName}/addons/${addonId}`, {
    method: 'DELETE'
  });

  console.log(`애드온 ${addonId}가 ${appName}에서 제거되었습니다.`);
};

도메인 및 SSL 관리

사용자 지정 도메인 추가

사용자 지정 도메인 구성:

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

  return response;
};

// 사용법
const domain = await addDomain('my-app', 'api.example.com');
console.log(`CNAME 대상: ${domain.cname}`);

SSL 인증서 구성

사용자 지정 도메인에 SSL 추가:

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;
};

ACM을 이용한 자동화된 SSL

자동 인증서 관리 활성화:

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

  return response;
};

속도 제한 및 할당량

속도 제한 이해

Heroku는 API 안정성을 보호하기 위해 속도 제한을 적용합니다:

제한을 초과하면 HTTP 429 (Too Many Requests) 응답이 발생합니다.

속도 제한 처리 구현

재시도를 위해 지수 백오프 사용:

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

      // 속도 제한 헤더 확인
      const remaining = response.headers.get('RateLimit-Remaining');
      const resetTime = response.headers.get('RateLimit-Reset');

      if (remaining < 100) {
        console.warn(`남은 할당량이 적음: ${remaining}, ${resetTime}에서 재설정`);
      }

      return response;
    } catch (error) {
      if (error.message.includes('429') && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000;
        console.log(`속도 제한됨. ${delay}ms 후에 재시도합니다...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
};

속도 제한 헤더

Heroku는 모든 응답에 다음 헤더를 포함합니다:

헤더 설명
RateLimit-Limit 시간당 최대 요청 수
RateLimit-Remaining 창에 남은 요청 수
RateLimit-Reset 창이 재설정될 때의 유닉스 타임스탬프

일반적인 문제 해결

문제: 401 오류와 함께 인증 실패

증상: "유효하지 않은 자격 증명" 오류 발생.

해결책:

  1. API 키가 올바른지 확인: heroku authorizations
  2. 토큰이 만료되지 않았는지 확인 (오래 지속되는 토큰은 1년 동안 유효)
  3. 환경 변수에 추가 공백이 있는지 확인
  4. 필요한 경우 토큰 재생성: heroku authorizations:create

문제: 앱 이름이 이미 사용 중입니다.

증상: "이름이 이미 사용 중입니다" 오류 발생.

해결책:

  1. 전역적으로 고유한 이름 사용 - 팀 또는 임의의 접미사 포함
  2. UUID 기반 이름 생성: app-${Date.now()}
  3. 네임스페이스 접두사 사용: 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}`;
};

문제: 다이노 형성 실패

증상: 확장 작업에서 오류 반환.

해결책:

  1. Procfile에 프로세스 유형이 있는지 확인
  2. 계정에 사용 가능한 다이노 할당량이 있는지 확인
  3. 앱이 일시 중지되지 않았는지 확인
  4. 다이노 시간 사용량 검토: heroku ps --app=my-app

문제: 빌드가 시간 초과로 실패

증상: 빌드가 30분 후에 멈추거나 시간 초과됩니다.

해결책:

  1. 언어에 맞는 빌드팩 선택 최적화
  2. 종속성 올바르게 캐싱
  3. 대규모 빌드를 더 작은 배포로 분할
  4. 더 빠른 배포를 위해 사전 빌드된 슬러그 사용

문제: 속도 제한 초과

증상: HTTP 429 응답 수신.

해결책:

  1. 요청 대기열 구현
  2. 재시도를 위해 지수 백오프 사용
  3. 가능하면 요청 일괄 처리
  4. 속도 제한 헤더를 선제적으로 모니터링
// 간단한 속도 제한기
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;
  }
}

프로덕션 배포 체크리스트

배포 전:

모니터링 및 경고

다음 메트릭 추적:

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

// 높은 실패율에 대한 경고
const failureRate = metrics.apiCalls.failed / metrics.apiCalls.total;

if (failureRate > 0.05) {
  sendAlert('Heroku API 실패율이 5%를 초과했습니다.');
}

// 다이노 시간 사용량에 대한 경고
if (metrics.dynoHours.used > metrics.dynoHours.quota * 0.8) {
  sendAlert('다이노 시간 사용량이 80%를 초과했습니다.');
}

실제 사용 사례

자동화된 CI/CD 파이프라인

SaaS 팀은 GitHub에서 배포를 자동화합니다:

구현 흐름:

  1. GitHub 푸시가 워크플로 트리거
  2. CI에서 테스트 실행
  3. Heroku API가 소스 블롭에서 빌드 생성
  4. 스테이징을 거쳐 프로덕션으로 승격
  5. 성공/실패 시 팀에 알림

다중 환경 관리

컨설팅 회사가 50개 이상의 클라이언트 앱을 관리합니다:

주요 통합 지점:

트래픽 기반 자동 확장

전자상거래 플랫폼이 트래픽 급증을 처리합니다:

자동 확장 로직:

결론

Heroku API는 플랫폼 기능에 대한 포괄적인 액세스를 제공합니다. 주요 요점:

button

FAQ 섹션

Heroku API는 무엇에 사용되나요?

Heroku API는 애플리케이션, 다이노, 애드온 및 인프라의 프로그래밍 방식 관리를 가능하게 합니다. 일반적인 사용 사례로는 CI/CD 자동화, 다중 앱 관리 도구, 자동 확장 시스템 및 인프라 모니터링 대시보드가 있습니다.

Heroku API 키를 어떻게 얻나요?

Heroku CLI를 설치하고 heroku login을 실행한 다음 heroku authorizations:create로 권한 부여를 생성하세요. 반환된 토큰은 환경 변수에 안전하게 저장하세요.

Heroku API는 무료인가요?

예, Heroku API는 무료입니다. 하지만 프로비저닝하는 리소스(다이노, 애드온 등)에 대해서는 비용을 지불해야 합니다. API 속도 제한은 계정당 시간당 10,000개의 요청입니다.

Heroku API는 어떤 인증을 사용하나요?

Heroku는 베어러 토큰 인증을 사용합니다. 모든 요청에 Authorization: Bearer {api_key} 헤더를 포함하세요. 토큰은 단기(1시간) 또는 장기(최대 1년)일 수 있습니다.

Heroku API 속도 제한을 어떻게 처리하나요?

RateLimit-Remaining 헤더를 모니터링하고 요청 대기열을 구현하세요. HTTP 429 응답을 받을 때 지수 백오프를 사용하세요. 안전한 작동을 위해 분당 150개 요청 미만을 유지하세요.

Git 없이 배포할 수 있나요?

예. 빌드 API를 사용하여 소스 블롭 URL에서 배포할 수 있습니다. 코드를 클라우드 스토리지(S3, GCS)에 업로드하고 빌드 요청에서 URL을 참조하세요.

배포를 어떻게 자동화하나요?

파이프라인 API를 사용하여 CI/CD를 설정하세요. 빌드를 생성하고, 단계를 통해 슬러그를 승격하고, GitHub 또는 사용자 지정 CI 시스템과 통합하세요.

릴리스와 빌드의 차이점은 무엇인가요?

빌드는 소스 코드를 슬러그로 컴파일합니다. 릴리스는 슬러그와 구성 변수를 결합하여 앱의 배포 가능한 버전을 생성합니다.

실패한 배포를 어떻게 롤백하나요?

릴리스 API를 사용하여 최근 릴리스를 나열한 다음, rollback: <release_id>와 함께 /releases에 POST 요청을 보내세요. Heroku는 이전 버전의 새 릴리스를 생성합니다.

여러 Heroku 계정을 관리할 수 있나요?

예. 각 계정에 대해 별도의 API 토큰을 사용하고 HEROKU_API_KEY 환경 변수를 변경하여 토큰 간에 전환할 수 있습니다.

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요