performance2025-04-12·8 min·122/348

Vercel Functions 지역 설정 (Region)

Vercel 함수의 실행 지역을 설정하여 성능을 최적화하는 방법을 알아봅니다.

Vercel Functions 지역 설정 (Region)

Introduction

Vercel 함수의 실행 지역을 설정하면 사용자와 서버 간의 지연 시간을 줄이고 성능을 향상시킬 수 있습니다. 이 글에서는 Vercel 함수의 지역 설정 방법과 최적화 전략을 알아보겠습니다.

Environment

  • Vercel 프로젝트 (Next.js 14+)
  • 글로벌 CDN: Vercel Edge Network
  • 데이터베이스: 글로벌 분산 (AWS RDS Multi-AZ)
  • 사용자: 아시아, 유럽, 북미

Problem

기본 Vercel 설정에서는 모든 함수가 단일 지역에서 실행됩니다:

# 현재 함수 실행 지역 확인
vercel inspect --url=https://your-app.vercel.app

# 출력 예시
Region: iad1 (US East)

이로 인해 아시아 사용자들에게 높은 지연 시간이 발생합니다.

Analysis

Vercel에서 지원하는 주요 리전:

  • iad1: US East (기본)
  • sfo1: US West
  • cdg1: Europe (Paris)
  • hnd1: Asia (Tokyo)
  • sin1: Asia (Singapore)

지역 선택 고려사항:

  1. 사용자 지리적 분포
  2. 데이터베이스 위치
  3. 외부 API 위치
  4. 비용 (지역별 차이)

Solution

1. vercel.json에서 리전 설정

{
  "functions": {
    "app/api/**/*.js": {
      "regions": ["iad1"]
    },
    "app/api/asia/**/*.js": {
      "regions": ["hnd1", "sin1"]
    },
    "app/api/europe/**/*.js": {
      "regions": ["cdg1"]
    }
  }
}

2. 함수별 리전 설정

// app/api/asia-endpoint/route.js
export const runtime = 'nodejs';
export const regions = ['hnd1', 'sin1'];

export async function GET() {
  return Response.json({
    message: 'This function runs in Asia',
    region: process.env.VERCEL_REGION
  });
}

3. 다중 리전 배포

// app/api/multi-region/route.js
export const runtime = 'edge';
export const config = {
  regions: ['iad1', 'sfo1', 'cdg1', 'hnd1', 'sin1']
};

export async function GET(request) {
  const region = process.env.VERCEL_REGION || 'unknown';
  
  return Response.json({
    message: `Running in ${region}`,
    timestamp: Date.now()
  });
}

4. 리전별 데이터베이스 연결

// lib/db-connection.js
import { PrismaClient } from '@prisma/client';

const databaseUrls = {
  iad1: process.env.DATABASE_URL_US_EAST,
  sfo1: process.env.DATABASE_URL_US_WEST,
  cdg1: process.env.DATABASE_URL_EUROPE,
  hnd1: process.env.DATABASE_URL_ASIA,
  sin1: process.env.DATABASE_URL_ASIA_SOUTH
};

function getDatabaseUrl() {
  const region = process.env.VERCEL_REGION || 'iad1';
  return databaseUrls[region] || databaseUrls.iad1;
}

export const prisma = new PrismaClient({
  datasources: {
    db: {
      url: getDatabaseUrl()
    }
  }
});

5. 리전 선택 알고리즘

// lib/region-selector.js
const regionCoordinates = {
  iad1: { lat: 38.9, lon: -77.0 },
  sfo1: { lat: 37.8, lon: -122.4 },
  cdg1: { lat: 48.9, lon: 2.3 },
  hnd1: { lat: 35.7, lon: 139.7 },
  sin1: { lat: 1.3, lon: 103.8 }
};

function calculateDistance(lat1, lon1, lat2, lon2) {
  const R = 6371;
  const dLat = (lat2 - lat1) * Math.PI / 180;
  const dLon = (lon2 - lon1) * Math.PI / 180;
  const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  return R * c;
}

export function selectRegion(userLat, userLon) {
  let minDistance = Infinity;
  let selectedRegion = 'iad1';
  
  for (const [region, coords] of Object.entries(regionCoordinates)) {
    const distance = calculateDistance(
      userLat, userLon,
      coords.lat, coords.lon
    );
    
    if (distance < minDistance) {
      minDistance = distance;
      selectedRegion = region;
    }
  }
  
  return selectedRegion;
}

6. 지연 시간 모니터링

// lib/latency-monitor.js
export async function measureLatency(region) {
  const start = Date.now();
  
  try {
    const response = await fetch(`https://your-app.vercel.app/api/ping?region=${region}`);
    await response.json();
    
    return Date.now() - start;
  } catch (error) {
    console.error(`Failed to measure latency for ${region}:`, error);
    return Infinity;
  }
}

export async function findOptimalRegion(userLat, userLon) {
  const regions = ['iad1', 'sfo1', 'cdg1', 'hnd1', 'sin1'];
  const latencies = {};
  
  for (const region of regions) {
    latencies[region] = await measureLatency(region);
  }
  
  const optimalRegion = Object.entries(latencies)
    .sort(([,a], [,b]) => a - b)[0][0];
  
  return { optimalRegion, latencies };
}

Lessons Learned

  1. 사용자 분석: 사용자의 지리적 분포를 분석하여 리전을 선택해야 합니다.
  2. 데이터베이스 위치: 데이터베이스 위치와 함수 리전을 일치시키면 성능이 향상됩니다.
  3. 비용 고려: 리전에 따라 비용이 다를 수 있으므로 비용 분석이 필요합니다.
  4. 모니터링: 지연 시간을 지속적으로 모니터링하여 리전을 조정해야 합니다.
  5. 테스트: 다양한 리전에서 테스트하여 최적의 설정을 찾아야 합니다.

This blog does not accept any external sponsorships, affiliate marketing, or ad revenue.