Kembali ke blog

Cara Mengatur Proxy di Aplikasi Serverless: AWS Lambda, Vercel, Cloudflare Workers

Panduan lengkap untuk mengintegrasikan proxy dalam fungsi serverless: dari pengaturan klien HTTP hingga mengatasi batasan laju dan pemblokiran geografis di AWS Lambda, Vercel Edge Functions, dan Cloudflare Workers.

📅19 Februari 2026
```html

Arsitektur serverless telah menjadi standar untuk aplikasi web modern, tetapi pengembang sering menghadapi masalah: semua permintaan dari fungsi Lambda atau Edge Functions berasal dari alamat IP pusat data penyedia cloud. Ini menyebabkan pemblokiran saat mengakses API eksternal, pengambilan data, atau otomatisasi tugas. Dalam panduan ini, kita akan membahas cara mengintegrasikan proxy ke dalam fungsi serverless untuk mengatasi batasan, batasan kecepatan, dan pemblokiran geografis.

Mengapa fungsi serverless memerlukan proxy

Platform serverless (AWS Lambda, Google Cloud Functions, Vercel, Cloudflare Workers) menjalankan kode di infrastruktur cloud, menggunakan alamat IP pusat data. Ini menciptakan beberapa masalah kritis bagi pengembang:

Masalah 1: Pemblokiran berdasarkan IP pusat data. Banyak layanan secara otomatis memblokir permintaan dari alamat IP yang dikenal dari AWS, Google Cloud, atau Azure. Misalnya, saat mengambil data dari situs e-commerce (Amazon, eBay, Wildberries) atau media sosial (Instagram API, TikTok API), fungsi Lambda Anda akan menerima HTTP 403 atau captcha pada permintaan pertama. Sistem perlindungan dari bot (Cloudflare, Akamai, DataDome) segera mengenali lalu lintas dari pusat data cloud.

Masalah 2: Pembatasan kecepatan pada level IP. Jika Anda mengembangkan aplikasi serverless dengan ribuan panggilan bersamaan, semua permintaan dapat berasal dari satu atau beberapa alamat IP AWS. API eksternal dengan cepat mencapai batas (misalnya, GitHub API — 60 permintaan/jam dari satu IP, Google Maps API — 100 permintaan/detik). Bahkan jika Anda telah membayar paket API yang diperluas, pembatasan berdasarkan IP tetap akan berlaku.

Masalah 3: Pemblokiran geografis. Fungsi serverless di wilayah us-east-1 tidak akan dapat mengakses konten yang hanya tersedia dari Rusia, Eropa, atau Asia. Ini krusial saat mengambil data dari pasar regional (Ozon, Yandex.Market), memeriksa iklan dari berbagai negara, atau menguji lokalisasi situs.

Masalah 4: IP bersama dengan pengguna lain. Di lingkungan serverless, fungsi Anda dapat menerima alamat IP yang sudah digunakan oleh klien lain dari penyedia cloud. Jika seseorang sebelumnya menyalahgunakan IP ini (spam, DDoS, pengambilan data), IP tersebut mungkin masuk dalam daftar hitam. Anda akan mendapatkan pemblokiran tanpa kesalahan dari pihak Anda.

Solusi untuk semua masalah ini adalah integrasi server proxy. Proxy memungkinkan fungsi serverless Anda mengirimkan permintaan melalui alamat IP residensial atau seluler yang terlihat seperti pengguna biasa. Ini menghilangkan pemblokiran, mengatasi batasan kecepatan, dan memberikan akses ke konten yang diblokir secara geografis.

Jenis proxy apa yang cocok untuk serverless

Pemilihan jenis proxy tergantung pada tugas aplikasi serverless Anda. Mari kita lihat tiga opsi utama dan skenario penggunaannya:

Jenis Proxy Kecepatan Anonimitas Skenario Penggunaan
Proxy Pusat Data Sangat Tinggi (10-50 ms) Rendah Mengakses API tanpa batasan ketat, memeriksa ketersediaan layanan, memantau uptime
Proxy Residensial Sedang (100-500 ms) Tinggi Pengambilan data e-commerce, bekerja dengan media sosial, mengatasi Cloudflare, akses ke konten yang diblokir secara geografis
Proxy Seluler Sedang (150-600 ms) Sangat Tinggi Bekerja dengan API seluler (Instagram, TikTok), pengujian aplikasi seluler, mengatasi perlindungan yang paling ketat

Untuk sebagian besar aplikasi serverless, disarankan untuk menggunakan proxy residensial. Mereka memberikan keseimbangan optimal antara kecepatan dan anonimitas. IP residensial terlihat seperti pengguna rumah biasa, yang memungkinkan untuk mengatasi perlindungan dari bot dan batasan kecepatan tanpa peningkatan latensi yang signifikan.

Proxy pusat data hanya cocok untuk tugas sederhana (memeriksa status HTTP, bekerja dengan API publik tanpa batasan). Proxy seluler diperlukan dalam kasus spesifik — ketika Anda bekerja dengan API seluler atau ketika anonimitas maksimum sangat penting.

Mengatur proxy di AWS Lambda

AWS Lambda adalah platform serverless yang paling populer, dan integrasi proxy di sini memerlukan pengaturan klien HTTP yang tepat. Fungsi Lambda dapat menggunakan berbagai bahasa pemrograman (Node.js, Python, Go), mari kita lihat contoh untuk yang paling umum.

Node.js (axios)

Axios adalah pustaka paling populer untuk permintaan HTTP di Node.js. Untuk mengatur proxy, gunakan parameter proxy dalam konfigurasi:

const axios = require('axios');

exports.handler = async (event) => {
  const proxyConfig = {
    host: 'proxy.example.com',
    port: 8080,
    auth: {
      username: 'your_username',
      password: 'your_password'
    },
    protocol: 'http'
  };

  try {
    const response = await axios.get('https://api.example.com/data', {
      proxy: proxyConfig,
      timeout: 10000 // 10 detik
    });

    return {
      statusCode: 200,
      body: JSON.stringify(response.data)
    };
  } catch (error) {
    console.error('Kesalahan proxy:', error.message);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: error.message })
    };
  }
};

Poin penting: simpan kredensial proxy di AWS Systems Manager Parameter Store atau AWS Secrets Manager, bukan di kode. Ini akan memastikan keamanan dan memungkinkan Anda untuk dengan mudah mengganti proxy tanpa membangun ulang fungsi.

Python (requests)

Di Python, untuk bekerja dengan proxy, gunakan pustaka requests dengan parameter proxies:

import requests
import json

def lambda_handler(event, context):
    proxies = {
        'http': 'http://username:password@proxy.example.com:8080',
        'https': 'http://username:password@proxy.example.com:8080'
    }
    
    try:
        response = requests.get(
            'https://api.example.com/data',
            proxies=proxies,
            timeout=10
        )
        
        return {
            'statusCode': 200,
            'body': json.dumps(response.json())
        }
    except requests.exceptions.RequestException as e:
        print(f'Kesalahan proxy: {str(e)}')
        return {
            'statusCode': 500,
            'body': json.dumps({'error': str(e)})
        }

Untuk proxy SOCKS5 (protokol yang lebih aman) di Python, Anda perlu menginstal pustaka tambahan requests[socks] dan mengubah format URL:

proxies = {
    'http': 'socks5://username:password@proxy.example.com:1080',
    'https': 'socks5://username:password@proxy.example.com:1080'
}

Optimasi untuk cold start

Fungsi Lambda memiliki masalah cold start — permintaan pertama setelah idle memakan waktu 1-3 detik. Saat menggunakan proxy, waktu ini meningkat. Untuk meminimalkan keterlambatan, buat klien HTTP di luar fungsi handler:

const axios = require('axios');

// Buat klien sekali saat menginisialisasi kontainer
const httpClient = axios.create({
  proxy: {
    host: 'proxy.example.com',
    port: 8080,
    auth: {
      username: process.env.PROXY_USER,
      password: process.env.PROXY_PASS
    }
  },
  timeout: 10000
});

exports.handler = async (event) => {
  // Gunakan kembali klien pada setiap panggilan
  const response = await httpClient.get('https://api.example.com/data');
  return {
    statusCode: 200,
    body: JSON.stringify(response.data)
  };
};

Pendekatan ini mengurangi waktu cold start sebesar 200-500 ms, karena konfigurasi proxy hanya dilakukan sekali saat membuat kontainer Lambda.

Integrasi proxy di Vercel Edge Functions

Vercel menawarkan dua jenis fungsi serverless: Node.js Functions (setara dengan Lambda) dan Edge Functions (dijalankan di CDN). Edge Functions beroperasi dalam runtime yang mirip dengan Cloudflare Workers, dengan batasan pada penggunaan API Node.js. Mari kita lihat kedua opsi tersebut.

Vercel Node.js Functions

Untuk Vercel Functions biasa, gunakan pendekatan yang sama seperti di AWS Lambda. Buat file api/fetch-data.js:

import axios from 'axios';

export default async function handler(req, res) {
  const proxyConfig = {
    host: process.env.PROXY_HOST,
    port: parseInt(process.env.PROXY_PORT),
    auth: {
      username: process.env.PROXY_USER,
      password: process.env.PROXY_PASS
    }
  };

  try {
    const response = await axios.get(req.query.url, {
      proxy: proxyConfig,
      timeout: 8000
    });

    res.status(200).json(response.data);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}

Tambahkan variabel lingkungan di Vercel Dashboard (Settings → Environment Variables): PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS.

Vercel Edge Functions

Edge Functions menggunakan Web Fetch API alih-alih pustaka Node.js. Proxy diatur melalui header kustom atau middleware:

export const config = {
  runtime: 'edge',
};

export default async function handler(req) {
  const proxyUrl = `http://${process.env.PROXY_USER}:${process.env.PROXY_PASS}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;
  
  // Untuk Edge Runtime, fetch dengan proxy melalui agent (memerlukan polyfill)
  // Alternatif: gunakan proxy API secara langsung
  const targetUrl = new URL(req.url).searchParams.get('target');
  
  const response = await fetch(targetUrl, {
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
  });

  return new Response(await response.text(), {
    status: response.status,
    headers: response.headers
  });
}

Batasan penting: Edge Runtime tidak mendukung agen proxy Node.js standar. Untuk bekerja dengan proxy secara penuh, disarankan untuk menggunakan Node.js Functions atau membuat server proxy perantara di server terpisah yang akan menerima permintaan dari Edge Functions.

Proxy di Cloudflare Workers

Cloudflare Workers berjalan di V8 isolates dan memiliki batasan yang lebih ketat dibandingkan Vercel Edge Functions. Cara standar untuk menghubungkan proxy melalui pustaka Node.js di sini tidak berfungsi. Ada dua pendekatan yang berhasil:

Metode 1: Tunneling HTTP CONNECT

Gunakan proxy yang mendukung metode HTTP CONNECT. Buat terowongan melalui server proxy:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const proxyUrl = 'http://proxy.example.com:8080';
  const targetUrl = 'https://api.example.com/data';
  
  const proxyAuth = btoa(`${PROXY_USER}:${PROXY_PASS}`);
  
  const response = await fetch(proxyUrl, {
    method: 'CONNECT',
    headers: {
      'Host': new URL(targetUrl).host,
      'Proxy-Authorization': `Basic ${proxyAuth}`
    }
  });

  if (response.status === 200) {
    // Terowongan telah dibuat, lakukan permintaan utama
    const finalResponse = await fetch(targetUrl, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
      }
    });
    
    return finalResponse;
  }
  
  return new Response('Koneksi proxy gagal', { status: 502 });
}

Metode ini hanya berfungsi dengan proxy HTTP yang mendukung CONNECT. Sebagian besar penyedia proxy residensial menyediakan kemampuan ini.

Metode 2: Gateway Proxy (disarankan)

Cara yang lebih andal adalah menyebarkan gateway proxy perantara di server terpisah (misalnya, di VPS atau AWS EC2). Cloudflare Worker mengirimkan permintaan ke gateway Anda, dan gateway tersebut meneruskannya melalui proxy:

// Cloudflare Worker
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const targetUrl = new URL(request.url).searchParams.get('url');
  const gatewayUrl = 'https://your-proxy-gateway.com/fetch';
  
  const response = await fetch(gatewayUrl, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': API_KEY // Melindungi gateway Anda
    },
    body: JSON.stringify({
      url: targetUrl,
      method: 'GET'
    })
  });

  return response;
}

Di sisi gateway proxy (server Node.js):

const express = require('express');
const axios = require('axios');

const app = express();
app.use(express.json());

const proxyConfig = {
  host: 'proxy.example.com',
  port: 8080,
  auth: {
    username: process.env.PROXY_USER,
    password: process.env.PROXY_PASS
  }
};

app.post('/fetch', async (req, res) => {
  if (req.headers['x-api-key'] !== process.env.API_KEY) {
    return res.status(401).json({ error: 'Tidak Terotorisasi' });
  }

  try {
    const response = await axios({
      url: req.body.url,
      method: req.body.method || 'GET',
      proxy: proxyConfig,
      timeout: 10000
    });

    res.json(response.data);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000);

Pendekatan ini menambah hop tambahan (meningkatkan latensi 50-100 ms), tetapi memberikan kompatibilitas penuh dan kontrol atas koneksi proxy.

Rotasi alamat IP di lingkungan serverless

Salah satu alasan utama menggunakan proxy adalah distribusi permintaan di antara banyak alamat IP untuk menghindari batasan kecepatan. Dalam arsitektur serverless, ada dua pendekatan untuk rotasi:

Rotasi otomatis di sisi penyedia proxy

Sebagian besar penyedia proxy residensial menawarkan rotating proxies — Anda terhubung ke satu endpoint, dan IP berubah secara otomatis pada setiap permintaan atau melalui interval yang ditentukan (misalnya, setiap 5 menit). Ini adalah opsi paling sederhana untuk serverless:

// Satu endpoint, IP berubah secara otomatis
const proxyConfig = {
  host: 'rotating.proxy.example.com',
  port: 8080,
  auth: {
    username: 'user-session-' + Date.now(), // Sesi unik
    password: 'password'
  }
};

Beberapa penyedia memungkinkan pengelolaan rotasi melalui parameter di username: user-session-random (IP baru pada setiap permintaan), user-session-sticky-300 (satu IP selama 300 detik).

Rotasi manual melalui kumpulan proxy

Jika Anda memiliki daftar proxy statis (misalnya, Anda membeli proxy khusus), Anda dapat menerapkan rotasi di tingkat aplikasi. Di lingkungan serverless, gunakan DynamoDB (AWS) atau KV Storage (Cloudflare) untuk menyimpan status:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB.DocumentClient();

const PROXY_POOL = [
  { host: 'proxy1.example.com', port: 8080 },
  { host: 'proxy2.example.com', port: 8080 },
  { host: 'proxy3.example.com', port: 8080 }
];

async function getNextProxy() {
  // Mendapatkan indeks saat ini dari DynamoDB
  const result = await dynamodb.get({
    TableName: 'ProxyRotation',
    Key: { id: 'current_index' }
  }).promise();

  const currentIndex = result.Item?.index || 0;
  const nextIndex = (currentIndex + 1) % PROXY_POOL.length;

  // Memperbarui indeks
  await dynamodb.put({
    TableName: 'ProxyRotation',
    Item: { id: 'current_index', index: nextIndex }
  }).promise();

  return PROXY_POOL[currentIndex];
}

exports.handler = async (event) => {
  const proxy = await getNextProxy();
  
  const response = await axios.get('https://api.example.com/data', {
    proxy: {
      ...proxy,
      auth: {
        username: process.env.PROXY_USER,
        password: process.env.PROXY_PASS
      }
    }
  });

  return { statusCode: 200, body: JSON.stringify(response.data) };
};

Metode ini memberikan kontrol penuh atas rotasi, tetapi memerlukan permintaan tambahan ke DynamoDB (menambah latensi 10-30 ms). Untuk aplikasi dengan beban tinggi, disarankan untuk menyimpan indeks dalam memori kontainer Lambda dan memperbaruinya setiap 100-1000 permintaan.

Penanganan kesalahan dan timeout

Proxy menambahkan titik kegagalan tambahan ke aplikasi serverless Anda. Sangat penting untuk menangani kesalahan dengan benar agar tidak kehilangan permintaan pengguna.

Kesalahan umum saat bekerja dengan proxy

Kesalahan Penyebab Solusi
ETIMEDOUT Proxy tidak merespons atau lambat Kurangi timeout menjadi 5-8 detik, tambahkan retry dengan proxy lain
ECONNREFUSED Server proxy tidak tersedia Periksa ketersediaan proxy, gunakan fallback ke proxy lain
407 Proxy Authentication Required Kredensial tidak valid Periksa username/password, pastikan IP Lambda diizinkan dalam whitelist proxy
502 Bad Gateway Proxy tidak dapat terhubung ke situs target Situs mungkin memblokir proxy, coba IP atau jenis proxy lain

Implementasi logika retry dengan fallback

Tambahkan otomatisasi percobaan ulang dengan beralih ke proxy cadangan saat terjadi kesalahan:

const axios = require('axios');

const PRIMARY_PROXY = {
  host: 'primary.proxy.com',
  port: 8080,
  auth: { username: 'user', password: 'pass' }
};

const FALLBACK_PROXY = {
  host: 'fallback.proxy.com',
  port: 8080,
  auth: { username: 'user', password: 'pass' }
};

async function fetchWithRetry(url, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const proxy = attempt === 0 ? PRIMARY_PROXY : FALLBACK_PROXY;
    
    try {
      const response = await axios.get(url, {
        proxy,
        timeout: 8000
      });
      
      return response.data;
    } catch (error) {
      console.log(`Percobaan ${attempt + 1} gagal:`, error.message);
      
      // Tidak retry pada kesalahan klien (4xx)
      if (error.response && error.response.status < 500) {
        throw error;
      }
      
      // Percobaan terakhir — lempar kesalahan
      if (attempt === maxRetries - 1) {
        throw error;
      }
      
      // Penundaan eksponensial sebelum retry
      await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, attempt)));
    }
  }
}

exports.handler = async (event) => {
  try {
    const data = await fetchWithRetry('https://api.example.com/data');
    return { statusCode: 200, body: JSON.stringify(data) };
  } catch (error) {
    return { statusCode: 500, body: JSON.stringify({ error: error.message }) };
  }
};

Implementasi ini memberikan tiga percobaan permintaan: yang pertama melalui proxy utama, yang lainnya melalui cadangan. Antara percobaan ditambahkan penundaan eksponensial (1 detik, 2 detik, 4 detik) untuk menghindari beban berlebih.

Pemantauan dan peringatan

Atur pemantauan kesalahan proxy melalui CloudWatch (AWS), Vercel Analytics, atau Sentry. Pantau metrik:

  • Persentase permintaan yang berhasil melalui proxy (harus >95%)
  • Latensi rata-rata permintaan (peningkatan dapat menunjukkan masalah dengan proxy)
  • Jumlah kesalahan timeout (jika >5% — proxy kelebihan beban atau lambat)
  • Distribusi kesalahan berdasarkan kode (407, 502, ETIMEDOUT, dll.)

Atur peringatan saat ambang batas terlampaui — ini akan memungkinkan Anda untuk segera beralih ke penyedia proxy cadangan atau mengubah konfigurasi.

Kesimpulan

Integrasi proxy ke dalam aplikasi serverless menyelesaikan masalah kritis: pemblokiran berdasarkan IP pusat data, pembatasan kecepatan, dan pemblokiran geografis. Kami telah membahas pengaturan proxy di AWS Lambda (Node.js dan Python), Vercel Functions, dan Cloudflare Workers, serta implementasi rotasi alamat IP dan penanganan kesalahan.

Rekomendasi kunci: gunakan proxy residensial untuk tugas yang memerlukan anonimitas tinggi (pengambilan data, bekerja dengan API media sosial), simpan kredensial di penyimpanan yang aman (AWS Secrets Manager, Vercel Environment Variables), implementasikan logika retry dengan fallback ke proxy cadangan, dan atur pemantauan kesalahan.

Untuk aplikasi serverless dengan persyaratan stabilitas tinggi, kami merekomendasikan menggunakan proxy residensial dengan rotasi otomatis — mereka memberikan keseimbangan optimal antara kecepatan, anonimitas, dan keandalan, meminimalkan risiko pemblokiran saat bekerja dengan API dan layanan eksternal.

```