Cara Deploy Cloudflare Worker via GitHub Actions: Error 10000 Gara-gara API Token Salah
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.
About the author
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.
Artikel terkait
-
5 min read
Saya Memindai 30 Image Docker Populer. 10 Masih Percaya Root CA yang Sudah Dicabut Chrome
Checklist trust store container dengan data nyata: 30 image Docker dipindai 24 Oktober 2026. Sepertiga masih membawa emSign ECC Root CA - G3.
- Security Engineering
- Deployment
-
8 min read
Cooldown 1 Hari Memblokir 70% Rilis npm yang Dibajak di 2026. Untuk Typosquat, 7 Hari Masih Meloloskan 45%
Saya memutar ulang 11.556 paket npm dan PyPI berbahaya 2026 terhadap cooldown dependensi. Pembajakan cepat mati, typosquat tidak, dan perbaikan ikut tertunda.
- Security Engineering
- Engineering Practice
-
5 min read
UUIDv7 Bagus untuk Primary Key, Buruk sebagai Jam: 4 Tes Sebelum Migrasi
UUIDv7 bagus sebagai primary key database tapi buruk sebagai jam. Empat tes cepat, apa yang dibocorkan timestamp di dalamnya, dan aturan praktis pemakaiannya.
- Security Engineering
- Engineering Practice
All writing | RSS | Markdown