DEV Community

Cover image for วิธีใช้ Heroku API ฉบับสมบูรณ์ คู่มือการเชื่อมต่อ (2026)
Thanawat Wongchai
Thanawat Wongchai

Posted on • Originally published at apidog.com

วิธีใช้ Heroku API ฉบับสมบูรณ์ คู่มือการเชื่อมต่อ (2026)

สรุปย่อ

Heroku API ช่วยให้นักพัฒนาสามารถปรับใช้ระบบอัตโนมัติ จัดการแอปพลิเคชัน กำหนดค่าส่วนเสริม และปรับขนาดโครงสร้างพื้นฐานได้โดยทางโปรแกรม API ใช้ OAuth 2.0 และการยืนยันตัวตนแบบโทเค็น มีปลายทาง RESTful สำหรับแอป ไดโน บิลด์ และไปป์ไลน์ โดยมีข้อจำกัดอัตราการส่งคำขอ 10,000 ครั้งต่อชั่วโมงต่อบัญชี คู่มือนี้ครอบคลุมการตั้งค่าการยืนยันตัวตน ปลายทางหลัก การรวม CI/CD และกลยุทธ์การปรับใช้ในการผลิต

ทดลองใช้ Apidog วันนี้

บทนำ

Heroku ขับเคลื่อนแอปพลิเคชันกว่า 4 ล้านรายการในกว่า 170 ประเทศ สำหรับนักพัฒนาที่สร้างระบบอัตโนมัติในการปรับใช้, ไพพ์ไลน์ CI/CD หรือเครื่องมือจัดการหลายแอป การรวม Heroku API ไม่ใช่ทางเลือก — แต่เป็นสิ่งจำเป็น

นี่คือความเป็นจริง: ทีมที่จัดการแอป Heroku มากกว่า 10 แอปเสียเวลา 8-12 ชั่วโมงต่อสัปดาห์ไปกับการปรับใช้และการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง การรวม Heroku API ที่มั่นคงจะช่วยให้การปรับใช้เป็นไปโดยอัตโนมัติ, ปรับขนาดไดโนตามปริมาณการใช้งาน และซิงโครไนซ์การกำหนดค่าในสภาพแวดล้อมต่างๆ

คู่มือนี้จะอธิบายกระบวนการรวม Heroku API ทั้งหมด คุณจะได้เรียนรู้การยืนยันตัวตนด้วยโทเค็น, การจัดการแอปและไดโน, การสร้างไพพ์ไลน์, การจัดหาส่วนเสริม และการแก้ไขปัญหาข้อผิดพลาด เมื่อจบหลักสูตรนี้ คุณจะมีการรวม Heroku ที่พร้อมใช้งานจริง

💡Apidog ทำให้การทดสอบการรวม API ง่ายขึ้น ทดสอบปลายทาง Heroku ของคุณ ตรวจสอบโฟลว์การยืนยันตัวตน ตรวจสอบการตอบสนองของ API และดีบักปัญหาการกำหนดค่าในพื้นที่ทำงานเดียว นำเข้าข้อกำหนด API จำลองการตอบสนอง และแบ่งปันสถานการณ์การทดสอบกับทีมของคุณ

Heroku API คืออะไร?

Heroku ให้ RESTful Platform API สำหรับการจัดการแอปพลิเคชันและโครงสร้างพื้นฐานบนแพลตฟอร์ม Heroku API จัดการสิ่งเหล่านี้:

  • การสร้าง การกำหนดค่า และการลบแอปพลิเคชัน
  • การปรับขนาด Dyno และการจัดการกระบวนการ
  • การจัดการ Build และ Release
  • การจัดหาส่วนเสริมและการกำหนดค่า
  • การจัดการ Pipeline และ Promotion
  • การจัดการโดเมนและใบรับรอง SSL
  • การตั้งค่า Log drain และการตรวจสอบ
  • การจัดการทีมและผู้ทำงานร่วมกัน

คุณสมบัติหลัก

คุณสมบัติ คำอธิบาย
การออกแบบ RESTful วิธีการ HTTP มาตรฐานพร้อมการตอบกลับแบบ JSON
การยืนยันตัวตนด้วยโทเค็น โทเค็น Bearer พร้อมรองรับ OAuth 2.0
การร้องขอช่วง การแบ่งหน้าสำหรับชุดผลลัพธ์ขนาดใหญ่
การจำกัดอัตรา 10,000 คำขอต่อชั่วโมงต่อบัญชี
การสร้างแบบ Idempotent ลักษณะการลองใหม่ที่ปลอดภัยสำหรับการเขียน
การบีบอัดแบบ Gzip การบีบอัดการตอบกลับเพื่อประหยัดแบนด์วิธ

ภาพรวมสถาปัตยกรรม API

Heroku ใช้โครงสร้าง REST API ที่มีการกำหนดเวอร์ชัน:

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

API เป็นไปตามข้อกำหนด JSON:API พร้อมรูปแบบและความสัมพันธ์ของทรัพยากรที่สอดคล้องกัน

เปรียบเทียบเวอร์ชัน API

เวอร์ชัน สถานะ การยืนยันตัวตน กรณีการใช้งาน
Platform API (v3) ปัจจุบัน โทเค็น Bearer การรวมระบบใหม่ทั้งหมด
การรวม GitHub ปัจจุบัน OAuth 2.0 แอปที่เชื่อมต่อกับ GitHub
Container Registry ปัจจุบัน การยืนยันตัวตน Docker การปรับใช้คอนเทนเนอร์

เริ่มต้นใช้งาน: การตั้งค่าการยืนยันตัวตน

ขั้นตอนที่ 1: สร้างบัญชี Heroku ของคุณ

ก่อนเข้าถึง API คุณต้องมีบัญชี Heroku:

  1. เยี่ยมชม เว็บไซต์ Heroku
  2. คลิก Sign Up และสร้างบัญชี
  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
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 3: สร้างโทเค็น API

ยืนยันตัวตนด้วย Heroku CLI:

# Login to Heroku
heroku login

# This opens a browser for authentication
# After login, your token is stored locally
Enter fullscreen mode Exit fullscreen mode

เรียกข้อมูลโทเค็น 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"
Enter fullscreen mode Exit fullscreen mode

ข้อควรระวังด้านความปลอดภัย: จัดเก็บโทเค็นในตัวแปรสภาพแวดล้อม ห้ามเก็บในโค้ด:

# .env file
HEROKU_API_KEY="your_api_key_here"
HEROKU_APP_NAME="your-app-name"
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 4: ทำความเข้าใจการยืนยันตัวตนด้วยโทเค็น

Heroku ใช้การยืนยันตัวตนด้วยโทเค็น Bearer:

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

คำขอ API ทุกครั้งต้องใช้ส่วนหัวเหล่านี้

ขั้นตอนที่ 5: เรียกใช้ API ครั้งแรกของคุณ

ทดสอบการยืนยันตัวตนของคุณ:

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

การตอบสนองที่คาดไว้:

{
  "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"
}
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 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();
};

// Usage
const account = await herokuRequest('/account');
console.log(`Logged in as: ${account.email}`);
Enter fullscreen mode Exit fullscreen mode

การจัดการแอปพลิเคชัน

การสร้างแอปใหม่

สร้างแอป Heroku โดยโปรแกรม:

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

  return response;
};

// Usage
const app = await createApp('my-awesome-app-2026');
console.log(`App created: ${app.name}`);
console.log(`Git URL: ${app.git_url}`);
console.log(`Web URL: ${app.web_url}`);
Enter fullscreen mode Exit fullscreen mode

การตอบสนองของแอปที่คาดไว้

{
  "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" }
}
Enter fullscreen mode Exit fullscreen mode

การแสดงรายการแอปของคุณ

เรียกดูแอปทั้งหมดในบัญชีของคุณ:

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

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

การดูรายละเอียดแอป

เรียกดูข้อมูลแอปโดยละเอียด:

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

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

การอัปเดตการกำหนดค่าแอป

แก้ไขการตั้งค่าแอป:

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

  return response;
};

// Usage - change app name
const updated = await updateApp('old-app-name', {
  name: 'new-app-name'
});
Enter fullscreen mode Exit fullscreen mode

การลบแอป

ลบแอปออกจากบัญชีของคุณ:

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

  console.log(`App ${appName} deleted successfully`);
};
Enter fullscreen mode Exit fullscreen mode

การจัดการไดโน

การปรับขนาดไดโน

ปรับขนาดแอปพลิเคชันของคุณขึ้นหรือลง:

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

  return response;
};

// Usage - scale web dynos to 3
const formation = await scaleDyno('my-app', 'web', 3);
console.log(`Scaled to ${formation.quantity} ${processType} dynos`);
Enter fullscreen mode Exit fullscreen mode

การดูการจัดรูปแบบ Dyno

ดูการกำหนดค่า dyno ปัจจุบัน:

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

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

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

ขนาด Dyno ที่มีอยู่

ประเภท Dyno กรณีการใช้งาน ค่าใช้จ่าย/เดือน
eco โครงการอดิเรก, ตัวอย่าง $5
basic แอปพลิเคชันสำหรับใช้งานจริงขนาดเล็ก $7
standard-1x เวิร์กโหลดมาตรฐาน $25
standard-2x แอปพลิเคชันประสิทธิภาพสูง $50
performance แอปพลิเคชันที่สำคัญต่อการผลิต $250+
private การแยกส่วนสำหรับองค์กร กำหนดเอง

การรีสตาร์ท Dyno

รีสตาร์ทไดโนทั้งหมดสำหรับแอป:

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

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

  console.log(`Dynos restarted for ${appName}`);
};
Enter fullscreen mode Exit fullscreen mode

การรัน Dyno แบบครั้งเดียว

รันคำสั่งในไดโนที่แยกออกมา:

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

  return response;
};

// Usage - run database migration
const dyno = await runCommand('my-app', 'npm run migrate');
console.log(`Dyno started: ${dyno.id}`);
Enter fullscreen mode Exit fullscreen mode

ตัวแปรการกำหนดค่า

การเรียกดูตัวแปรการกำหนดค่า

เรียกดูตัวแปรสภาพแวดล้อม:

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

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

การตั้งค่าตัวแปรการกำหนดค่า

อัปเดตตัวแปรสภาพแวดล้อม:

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

  return response;
};

// Usage
const updated = await setConfigVars('my-app', {
  NODE_ENV: 'production',
  API_SECRET: 'your-secret-key',
  LOG_LEVEL: 'info'
});
Enter fullscreen mode Exit fullscreen mode

แนวทางปฏิบัติที่ดีที่สุดสำหรับตัวแปรการกำหนดค่า

  1. ห้ามคอมมิตข้อมูลลับ - ใช้ตัวแปรสภาพแวดล้อมสำหรับข้อมูลที่ละเอียดอ่อนทั้งหมด
  2. ใช้การกำหนดค่าแยกกันตามสภาพแวดล้อม - ตัวแปรที่แตกต่างกันสำหรับ staging vs production
  3. หมุนเวียนข้อมูลลับเป็นประจำ - อัปเดตคีย์ API และรหัสผ่านทุกไตรมาส
  4. เพิ่มคำนำหน้าตัวแปรที่เกี่ยวข้อง - STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET

การจัดการ Build และ Release

การสร้าง Build

ปรับใช้โค้ดผ่าน API:

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

  return response;
};

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

การตรวจสอบสถานะ Build

ตรวจสอบความคืบหน้าของบิลด์:

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

// Poll until complete
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 succeeded!');
      return build;
    } else if (build.status === 'failed') {
      throw new Error(`Build failed: ${build.output}`);
    }

    console.log(`Build in progress... attempt ${i + 1}`);
    await new Promise(resolve => setTimeout(resolve, 5000));
  }

  throw new Error('Build timeout');
};
Enter fullscreen mode Exit fullscreen mode

การแสดงรายการ Release

ดูประวัติการเผยแพร่:

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

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

การย้อนกลับไปยัง Release ก่อนหน้า

ย้อนกลับไปยังเวอร์ชันก่อนหน้า:

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

  return response;
};

// Usage - rollback to version 42
const rollbackRelease = await rollback('my-app', 42);
console.log(`Rolled back to v${rollbackRelease.version}`);
Enter fullscreen mode Exit fullscreen mode

การจัดการ Pipeline

การสร้าง Pipeline

ตั้งค่าไพพ์ไลน์ CI/CD:

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

  return response;
};

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

การเพิ่มแอปไปยัง Pipeline

เชื่อมต่อแอปกับขั้นตอนไปป์ไลน์:

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

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

การโปรโมต Slug ไปยังขั้นตอนถัดไป

ย้ายโค้ดผ่านไปป์ไลน์:

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(`Promoted slug ${slugId} to ${toApp}`);
};
Enter fullscreen mode Exit fullscreen mode

การจัดการส่วนเสริม

การจัดหาส่วนเสริม

ติดตั้งส่วนเสริม 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;
};

// Usage - provision PostgreSQL
const db = await provisionAddon('my-app', 'heroku-postgresql:mini', {});
console.log(`Database provisioned: ${db.addon.name}`);
console.log(`DATABASE_URL: ${db.addon.config_vars.DATABASE_URL}`);
Enter fullscreen mode Exit fullscreen mode

ส่วนเสริมยอดนิยม

ส่วนเสริม แผน ราคาเริ่มต้น กรณีการใช้งาน
heroku-postgresql mini $5/เดือน ฐานข้อมูลสำหรับใช้งานจริง
heroku-redis mini $5/เดือน แคช, เซสชัน
papertrail choklad $7/เดือน การรวมบันทึก
sentry developer ฟรี การติดตามข้อผิดพลาด
mailgun sandbox ฟรี การส่งอีเมล
newrelic lite ฟรี การตรวจสอบแอปพลิเคชัน

การแสดงรายการส่วนเสริม

ดูส่วนเสริมที่ติดตั้ง:

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

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

การลบส่วนเสริม

ถอนการติดตั้งส่วนเสริม:

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

  console.log(`Addon ${addonId} removed from ${appName}`);
};
Enter fullscreen mode Exit fullscreen mode

การจัดการโดเมนและ SSL

การเพิ่มโดเมนที่กำหนดเอง

กำหนดค่าโดเมนที่กำหนดเอง:

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

  return response;
};

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

การกำหนดค่าใบรับรอง 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;
};
Enter fullscreen mode Exit fullscreen mode

SSL อัตโนมัติด้วย 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

การจำกัดอัตราและโควต้า

การทำความเข้าใจการจำกัดอัตรา

Heroku บังคับใช้การจำกัดอัตราเพื่อปกป้องความเสถียรของ API:

  • ขีดจำกัดมาตรฐาน: 10,000 คำขอต่อชั่วโมงต่อบัญชี
  • หน้าต่าง: หน้าต่าง 60 นาทีแบบเลื่อน
  • รีเซ็ต: อัตโนมัติหลังจากหน้าต่างผ่านไป

การเกินขีดจำกัดจะส่งผลให้เกิดการตอบสนอง HTTP 429 (Too Many Requests)

การจัดการการจำกัดอัตรา

ใช้ exponential backoff สำหรับการลองใหม่:

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

      // Check rate limit headers
      const remaining = response.headers.get('RateLimit-Remaining');
      const resetTime = response.headers.get('RateLimit-Reset');

      if (remaining < 100) {
        console.warn(`Low quota remaining: ${remaining}, resets at ${resetTime}`);
      }

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

ส่วนหัวการจำกัดอัตรา

Heroku มีส่วนหัวเหล่านี้ในการตอบกลับทุกครั้ง:

ส่วนหัว คำอธิบาย
RateLimit-Limit คำขอสูงสุดต่อชั่วโมง
RateLimit-Remaining คำขอที่เหลืออยู่ในหน้าต่าง
RateLimit-Reset การประทับเวลา Unix เมื่อหน้าต่างรีเซ็ต

การแก้ไขปัญหาทั่วไป

ปัญหา: การยืนยันตัวตนล้มเหลวด้วย 401

อาการ: ได้รับข้อผิดพลาด “Invalid credentials”

วิธีแก้ไข:

  1. ตรวจสอบคีย์ API ว่าถูกต้อง: heroku authorizations
  2. ตรวจสอบให้แน่ใจว่าโทเค็นยังไม่หมดอายุ (โทเค็นระยะยาวใช้งานได้ 1 ปี)
  3. ตรวจสอบช่องว่างพิเศษในตัวแปรสภาพแวดล้อม
  4. สร้างโทเค็นใหม่หากจำเป็น: heroku authorizations:create

ปัญหา: ชื่อแอปถูกใช้ไปแล้ว

อาการ: ได้รับข้อผิดพลาด “name is already taken”

วิธีแก้ไข:

  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}`;
};
Enter fullscreen mode Exit fullscreen mode

ปัญหา: การจัดรูปแบบ Dyno ล้มเหลว

อาการ: การดำเนินการปรับขนาดคืนค่าข้อผิดพลาด

วิธีแก้ไข:

  1. ตรวจสอบว่าประเภทกระบวนการมีอยู่ใน Procfile
  2. ตรวจสอบว่าบัญชีมีโควต้า dyno ว่างอยู่
  3. ตรวจสอบให้แน่ใจว่าแอปไม่ได้ถูกระงับ
  4. ตรวจสอบการใช้งาน dyno hour: heroku ps --app=my-app

ปัญหา: Build ล้มเหลวเนื่องจากหมดเวลา

อาการ: บิลด์ค้างหรือหมดเวลาหลังจาก 30 นาที

วิธีแก้ไข:

  1. เพิ่มประสิทธิภาพการเลือก buildpack สำหรับภาษาของคุณ
  2. แคชการพึ่งพาให้ถูกต้อง
  3. แบ่งบิลด์ขนาดใหญ่เป็นการปรับใช้ที่เล็กลง
  4. ใช้ slug ที่สร้างไว้ล่วงหน้าเพื่อการปรับใช้ที่เร็วขึ้น

ปัญหา: เกินขีดจำกัดอัตรา

อาการ: ได้รับการตอบกลับ HTTP 429

วิธีแก้ไข:

  1. ใช้การจัดคิวคำขอ
  2. ใช้ exponential backoff สำหรับการลองใหม่
  3. รวมคำขอเมื่อทำได้
  4. ตรวจสอบส่วนหัวการจำกัดอัตราล่วงหน้า
// Simple rate limiter
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

รายการตรวจสอบการปรับใช้ในการผลิต

ก่อนใช้งานจริง:

  • [ ] ใช้โทเค็น API ระยะยาวสำหรับ CI/CD
  • [ ] จัดเก็บโทเค็นในการจัดการความลับที่ปลอดภัย (Vault, AWS Secrets Manager)
  • [ ] ใช้การจำกัดอัตราและการจัดคิวคำขอ
  • [ ] เพิ่มการจัดการข้อผิดพลาดที่ครอบคลุม
  • [ ] ตั้งค่าการบันทึกสำหรับการเรียก API ทั้งหมด
  • [ ] ตรวจสอบการใช้งาน dyno hour
  • [ ] กำหนดค่า log drains สำหรับการบันทึกภายนอก
  • [ ] ตั้งค่าการโปรโมตไปป์ไลน์สำหรับ CI/CD
  • [ ] เปิดใช้งานการจัดการใบรับรองอัตโนมัติ
  • [ ] กำหนดค่ากลยุทธ์การสำรองข้อมูลสำหรับฐานข้อมูล

การตรวจสอบและการแจ้งเตือน

ติดตามเมตริกเหล่านี้:

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

// Alert on high failure rate
const failureRate = metrics.apiCalls.failed / metrics.apiCalls.total;

if (failureRate > 0.05) {
  sendAlert('Heroku API failure rate above 5%');
}

// Alert on dyno hour usage
if (metrics.dynoHours.used > metrics.dynoHours.quota * 0.8) {
  sendAlert('Dyno hour usage above 80%');
}
Enter fullscreen mode Exit fullscreen mode

กรณีการใช้งานจริง

Pipeline CI/CD อัตโนมัติ

ทีม SaaS ทำการปรับใช้ระบบอัตโนมัติจาก GitHub:

  • ความท้าทาย: การปรับใช้ด้วยตนเองทำให้เกิดข้อผิดพลาดและความล่าช้า
  • วิธีแก้ไข: GitHub Actions + การรวม Heroku API
  • ผลลัพธ์: การปรับใช้แบบไม่มี Downtime, การเผยแพร่ที่เร็วขึ้น 90%

ขั้นตอนการใช้งาน:

  1. การพุช GitHub ทริกเกอร์เวิร์กโฟลว์
  2. เรียกใช้การทดสอบใน CI
  3. Heroku API สร้างบิลด์จาก source blob
  4. โปรโมตผ่าน staging ไปยัง production
  5. แจ้งเตือนทีมเมื่อสำเร็จ/ล้มเหลว

การจัดการหลายสภาพแวดล้อม

บริษัทที่ปรึกษาจัดการแอปกว่า 50+ รายการสำหรับลูกค้า:

  • ความท้าทาย: การซิงค์การกำหนดค่าด้วยตนเองในสภาพแวดล้อมต่างๆ
  • วิธีแก้ไข: การจัดการการกำหนดค่าแบบรวมศูนย์ด้วย Heroku API
  • ผลลัพธ์: การกำหนดค่าที่สอดคล้องกัน ประหยัดเวลา 8 ชั่วโมง/สัปดาห์

จุดรวมที่สำคัญ:

  • ซิงค์ config vars ใน dev/staging/prod
  • การจัดหาส่วนเสริมอัตโนมัติ
  • การดำเนินการแบบกลุ่มสำหรับการนำลูกค้าใหม่เข้าระบบ

การปรับขนาดอัตโนมัติตามปริมาณการใช้งาน

แพลตฟอร์มอีคอมเมิร์ซจัดการกับปริมาณการใช้งานที่พุ่งสูงขึ้น:

  • ความท้าทาย: การปรับขนาดด้วยตนเองในระหว่างช่วงการขาย
  • วิธีแก้ไข: การปรับขนาดอัตโนมัติตามโหลดด้วย Heroku API
  • ผลลัพธ์: ไม่มีการหยุดทำงานในระหว่างปริมาณการใช้งานที่เพิ่มขึ้น 10 เท่า

ตรรกะการปรับขนาดอัตโนมัติ:

  • ตรวจสอบเวลาตอบสนองผ่าน Metrics API
  • ปรับขนาดขึ้นเมื่อ p95 latency > 500ms
  • ปรับขนาดลงในช่วงปริมาณการใช้งานต่ำ
  • แจ้งเตือนเมื่อมีการใช้งานสูงต่อเนื่อง

บทสรุป

Heroku API ให้การเข้าถึงฟังก์ชันการทำงานของแพลตฟอร์มอย่างครอบคลุม ประเด็นสำคัญ:

  • การยืนยันตัวตนด้วยโทเค็น Bearer ต้องมีการจัดเก็บที่ปลอดภัยและการหมุนเวียน
  • การจำกัดอัตรา (10K/ชั่วโมง) ต้องการการตรวจสอบเชิงรุก
  • การจัดการไปป์ไลน์ช่วยให้เวิร์กโฟลว์ CI/CD แข็งแกร่ง
  • การจัดการข้อผิดพลาดที่เหมาะสมช่วยให้การปรับใช้มีความน่าเชื่อถือ
  • Apidog ช่วยปรับปรุงการทดสอบ API และการทำงานร่วมกันในทีมสำหรับการรวม Heroku

ส่วนคำถามที่พบบ่อย

Heroku API ใช้สำหรับอะไร?

Heroku API ช่วยให้สามารถจัดการแอปพลิเคชัน ไดโน ส่วนเสริม และโครงสร้างพื้นฐานได้โดยโปรแกรม กรณีการใช้งานทั่วไป ได้แก่ ระบบอัตโนมัติ CI/CD เครื่องมือจัดการหลายแอป ระบบปรับขนาดอัตโนมัติ และแดชบอร์ดตรวจสอบโครงสร้างพื้นฐาน

ฉันจะรับ Heroku API key ได้อย่างไร?

ติดตั้ง Heroku CLI, รัน heroku login, จากนั้นสร้างการอนุญาตด้วย heroku authorizations:create จัดเก็บโทเค็นที่ได้รับคืนอย่างปลอดภัยในตัวแปรสภาพแวดล้อม

Heroku API ใช้งานฟรีหรือไม่?

ใช่ Heroku API ใช้งานฟรี อย่างไรก็ตาม คุณจะต้องจ่ายค่าทรัพยากรที่คุณจัดหา (ไดโน ส่วนเสริม ฯลฯ) การจำกัดอัตรา API คือ 10,000 คำขอต่อชั่วโมงต่อบัญชี

Heroku API ใช้การยืนยันตัวตนแบบใด?

Heroku ใช้การยืนยันตัวตนด้วยโทเค็น Bearer ใส่ส่วนหัว Authorization: Bearer {api_key} ในทุกคำขอ โทเค็นอาจมีอายุสั้น (1 ชั่วโมง) หรืออายุยาว (สูงสุด 1 ปี)

ฉันจะจัดการการจำกัดอัตราของ Heroku API ได้อย่างไร?

ตรวจสอบส่วนหัว RateLimit-Remaining และนำการจัดคิวคำขอมาใช้ ใช้ exponential backoff เมื่อได้รับคำตอบ HTTP 429 รักษาระดับการส่งคำขอไม่เกิน 150 ครั้งต่อนาทีเพื่อการทำงานที่ปลอดภัย

ฉันสามารถปรับใช้โดยไม่มี Git ได้หรือไม่?

ได้ ใช้ Builds API เพื่อปรับใช้จาก URL ของ source blob อัปโหลดโค้ดของคุณไปยังที่เก็บข้อมูลบนคลาวด์ (S3, GCS) และอ้างอิง URL ในคำขอบิลด์ของคุณ

ฉันจะปรับใช้ระบบอัตโนมัติได้อย่างไร?

ใช้ Pipeline API เพื่อตั้งค่า CI/CD สร้างบิลด์ โปรโมต slugs ผ่านขั้นตอนต่างๆ และรวมเข้ากับ GitHub หรือระบบ CI แบบกำหนดเอง

ความแตกต่างระหว่าง release และ build คืออะไร?

build คือการคอมไพล์ซอร์สโค้ดของคุณให้เป็น slug release คือการรวม slug เข้ากับตัวแปรการกำหนดค่าเพื่อสร้างเวอร์ชันที่สามารถปรับใช้ได้ของแอปของคุณ

ฉันจะย้อนการปรับใช้ที่ล้มเหลวได้อย่างไร?

ใช้ Releases API เพื่อแสดงรายการรีลีสล่าสุด จากนั้น POST ไปยัง /releases พร้อมกับ rollback: <release_id> Heroku จะสร้างรีลีสใหม่ในเวอร์ชันก่อนหน้า

ฉันสามารถจัดการบัญชี Heroku หลายบัญชีได้หรือไม่?

ได้ ใช้โทเค็น API แยกต่างหากสำหรับแต่ละบัญชีและสลับระหว่างกันโดยการเปลี่ยนตัวแปรสภาพแวดล้อม HEROKU_API_KEY

Top comments (0)