Skip to content

Cara Deploy Cloudflare Worker via GitHub Actions: Error 10000 Gara-gara API Token Salah

Terbit Terakhir diperbarui 4 menit baca

Poin penting

  • Deploy lewat GitHub Actions gagal dalam 11 detik dengan Authentication error code 10000 karena API token dibuat dari template Read All Resources.
  • Solusinya adalah template token Edit Cloudflare Workers, yang membatasi akses tulis hanya untuk resource Workers.
  • Account ID terlihat di URL dashboard dan bukan rahasia, sedangkan API token adalah kunci yang sebenarnya.
  • Seluruh pipeline hanya terdiri dari tiga file: src/index.js, wrangler.toml, dan workflow GitHub Actions yang memakai wrangler-action.
  • Menyiapkan CI sebelum kodenya menarik itu berlipat manfaatnya, karena setiap commit berikutnya ter-deploy sendiri.

Versi bahasa Inggris: I Shipped My First Cloudflare Worker via GitHub Actions in 47 Minutes (3 Were Wasted on the Wrong API Token).

Cloudflare Worker pertama saya ter-deploy dalam 47 menit. Tiga menit di antaranya habis menatap error ini di log GitHub Actions yang merah: Authentication error [code: 10000]. API token sudah ada. Account ID sudah ada. Workflow sudah saya salin dari dokumentasi resmi. Tetap gagal.

Penyebabnya satu checkbox yang tidak pernah saya pilih. Checkbox itulah alasan saya menulis artikel ini, karena semua tutorial yang saya baca berasumsi saya tidak akan salah di situ.

Apa yang Saya Bangun

Sebuah Cloudflare Worker yang mengembalikan respons JSON berisi sapaan. Logikanya cuma tiga baris. Satu file wrangler.toml. Satu workflow GitHub Actions. Push ke main, Worker langsung live di edge, selesai.

Tujuannya bukan Worker-nya. Tujuannya membuat pipeline berjalan supaya 100 commit berikutnya ter-deploy sendiri.

Setup yang Benar-benar Jalan

Ini kode Worker-nya, di src/index.js:

export default {
  async fetch(request, env, ctx) {
    return Response.json({
      message: "Hello from the edge",
      region: request.cf?.colo ?? "unknown",
    });
  },
};

Isi wrangler.toml:

name = "hello-edge"
main = "src/index.js"
compatibility_date = "2025-01-01"

Dan workflow GitHub Actions di .github/workflows/deploy.yml:

name: Deploy Worker

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

Hanya itu. Tiga file. Sekitar 25 baris termasuk baris kosong.

3 Menit yang Ingin Saya Ambil Kembali

Saat pertama kali push, Action gagal dalam 11 detik dengan Authentication error [code: 10000]. Saya kira token-nya salah paste. Saya rotate token. Error yang sama. Saya cek nama secret. Benar. Saya baca README wrangler-action dua kali. Saya mulai meragukan realitas.

Yang saya lakukan: membuat API token Cloudflare dengan template “Read All Resources” karena ingin berhati-hati. Token itu bisa membaca semuanya dan tidak bisa menulis apa pun. Padahal Wrangler perlu menulis. Solusinya adalah memakai template “Edit Cloudflare Workers”, yang membatasi akses tulis hanya untuk resource Workers dan tidak lebih.

Kenapa error-nya tidak jelas: code 10000 adalah kegagalan autentikasi generik dari Cloudflare. Pesannya tidak bilang “token Anda tidak punya izin menulis.” Pesannya cuma “auth gagal.” Tiga menit hidup saya hilang gara-gara satu checkbox.

Jebakan lain yang jarang dibahas: Account ID bukan rahasia. Ia terlihat di URL dashboard Anda. Menyimpannya sebagai GitHub secret boleh saja, tetapi itu tidak melindungi sesuatu yang sensitif. API token-lah kunci yang sebenarnya. Jangan di-commit. Jangan di-log. Rotate kalau sempat terlihat di terminal publik.

Kenapa Saya Repot Pakai CI/CD Sejak Hari Pertama

Jujur, hampir saja tidak. Dashboard Cloudflare punya tombol “Connect to Git” yang sudah cukup bagus untuk mengatur auto-deploy tanpa menulis satu baris YAML pun. Untuk pemula yang men-deploy satu Worker, itu jalur tercepat.

Saya tetap memilih GitHub Actions karena satu hal: kontrol. Pendekatan wrangler-action memungkinkan saya menambah langkah yang nanti dibutuhkan, seperti menjalankan test sebelum deploy, deploy ke staging dulu, kirim notifikasi ke Slack kalau gagal, atau menunggu persetujuan manual. Integrasi dashboard memberi saya kotak hitam. Workflow Actions memberi saya file yang bisa dibaca.

Tukarannya: setup lebih lama sekarang (sekitar 15 menit ekstra) demi fleksibilitas tanpa batas nanti. Untuk proyek belajar, itu pilihan yang tepat. Untuk situs marketing sekali jadi, klik tombolnya saja.

Deploy Pertama yang Berhasil

Log-nya menampilkan ini:

Total Upload: 0.42 KiB / gzip: 0.30 KiB
Uploaded hello-edge (1.15 sec)
Deployed hello-edge triggers (0.32 sec)
  https://hello-edge.<my-subdomain>.workers.dev

Saya klik URL-nya. Terbuka dalam 38 milidetik dari data center Singapura. Saya menulis ini dari Batam, Indonesia, jadi jaraknya kira-kira 60 km. Kode saya, di server yang berjarak 60 km dari saya, ter-deploy oleh GitHub Action yang saya tulis 47 menit sebelumnya.

Yang tidak saya duga: kepuasannya datang dari pipeline, bukan dari Worker. Push ke main, melihat centang hijau muncul di GitHub, dan tahu Worker saya sudah live secara global tanpa menyentuh dashboard Cloudflare, itulah fitur sebenarnya. Worker-nya cuma hello world. CI/CD-nya yang benar-benar saya bangun.

Pelajarannya

Tiga hal kalau Anda mau melakukan ini untuk pertama kali:

Pakai template API token “Edit Cloudflare Workers”, bukan “Read All Resources” atau token custom buatan sendiri. Template bawaan punya scope persis yang dibutuhkan wrangler. Token custom adalah cara Anda kehilangan 3 menit ke error code 10000.

Siapkan pipeline Actions sebelum kodenya menarik. Worker membosankan di balik pipeline yang jalan lebih berharga daripada Worker pintar yang di-deploy manual. Pipeline itu berlipat manfaatnya. Deploy manual tidak.

Account ID itu publik, API token tidak. Simpan keduanya sebagai secret kalau itu memudahkan, tetapi pahami mana yang penting. Satu bocor jadi jebakan kecil. Satunya lagi bocor berarti kunci diserahkan ke orang asing.

Rencana Berikutnya

Langkah selanjutnya adalah preview deploy per pull request, supaya setiap PR otomatis dapat URL *.workers.dev sendiri. Jawabannya kemungkinan job kedua di workflow dengan trigger pull_request, plus bot komentar yang memposting URL preview di PR.

Kalau Anda sudah melakukan ini dengan Workers (bukan Pages, itu mode mudah), seperti apa workflow Anda? Dan kesalahan CI/CD apa yang Anda harap ada yang memperingatkan di hari pertama?

Pertanyaan yang sering diajukan

Kenapa Wrangler gagal dengan Authentication error code 10000 di GitHub Actions?
Code 10000 adalah error autentikasi generik dari Cloudflare. Pada kasus ini token dibuat dari template Read All Resources yang tidak bisa menulis, sehingga deploy gagal.
Template API token Cloudflare mana yang dipakai untuk Workers?
Pakai template Edit Cloudflare Workers. Template ini punya scope persis yang dibutuhkan wrangler, dan token custom adalah penyebab penulis kehilangan tiga menit.
Apakah Account ID Cloudflare itu rahasia?
Bukan. Account ID terlihat di URL dashboard Anda. Menyimpannya sebagai GitHub secret tidak masalah, tetapi yang sensitif adalah API token.
Kenapa pakai GitHub Actions dan bukan tombol Connect to Git?
Kontrol. Dengan Actions Anda bisa menambah test, deploy ke staging, notifikasi Slack, atau persetujuan manual nanti, dengan biaya sekitar 15 menit setup tambahan.
Bagikan Bagikan ke X Bagikan ke LinkedIn

About the author

Portrait of Kiell Tampubolon

Security Engineer & Technical Writer

Security engineer and technical writer based in Batam, Indonesia. I review and harden MCP servers and AI agents, build security automation, and write up what holds and what fails. I also train on DNS security as a PANDI .id Academy trainer.

All writing | RSS | Markdown