본문으로 건너뛰기

서버리스 함수

Connect Base 서버리스 함수 심화 가이드입니다.

지원 런타임

런타임버전패키지 매니저
Node.js20.xnpm, yarn, pnpm
Python3.11pip
Go1.22go mod
.NET8.0nuget

Node.js 함수 작성

기본 구조

javascript
// handler.js
export async function handler(event, context) {
  const { body, headers, queryParams } = event

  // 비즈니스 로직
  const result = await processData(body)

  return {
    statusCode: 200,
    body: JSON.stringify(result)
  }
}

외부 패키지 사용

javascript
// package.json
{
  "dependencies": {
    "axios": "^1.6.0",
    "lodash": "^4.17.21"
  }
}

// handler.js
import axios from 'axios'
import _ from 'lodash'

export async function handler(event) {
  const response = await axios.get('https://api.example.com/data')
  const filtered = _.filter(response.data, { active: true })

  return {
    statusCode: 200,
    body: JSON.stringify(filtered)
  }
}

Python 함수 작성

기본 구조

python
# handler.py
def handler(event, context):
    body = event.get('body', {})

    # 비즈니스 로직
    result = process_data(body)

    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }

외부 패키지 사용

# requirements.txt
requests==2.31.0
pandas==2.1.0
python
# handler.py
import requests
import pandas as pd

def handler(event, context):
    response = requests.get('https://api.example.com/data')
    df = pd.DataFrame(response.json())

    return {
        'statusCode': 200,
        'body': df.to_json()
    }

환경 변수

설정

콘솔에서 함수 > 설정 > 환경 변수에서 추가:

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
[email protected]
SMTP_PASS=app_password

사용

javascript
// Node.js
const smtpHost = process.env.SMTP_HOST
python
# Python
import os
smtp_host = os.environ.get('SMTP_HOST')

콜드 스타트 최적화

1. 패키지 최소화

필요한 패키지만 설치:

json
// ❌ 불필요한 패키지 포함
"dependencies": {
  "aws-sdk": "^3.0.0",  // 전체 SDK
  "lodash": "^4.17.21"
}

// ✅ 필요한 것만
"dependencies": {
  "@aws-sdk/client-s3": "^3.0.0",  // S3만
  "lodash.filter": "^4.6.0"  // filter만
}

2. 전역 초기화

DB 연결 등은 핸들러 밖에서 초기화:

javascript
// ✅ 전역에서 초기화 (재사용됨)
const db = new Database(process.env.DB_URL)

export async function handler(event) {
  // db 재사용
  const result = await db.query('SELECT * FROM users')
  return { statusCode: 200, body: JSON.stringify(result) }
}

3. 번들 크기 최소화

javascript
// ❌ 전체 import
import * as _ from 'lodash'

// ✅ 필요한 함수만 import
import filter from 'lodash/filter'

에러 처리

javascript
export async function handler(event) {
  try {
    const result = await riskyOperation()

    return {
      statusCode: 200,
      body: JSON.stringify(result)
    }
  } catch (error) {
    console.error('Error:', error)  // 로그 기록

    return {
      statusCode: 500,
      body: JSON.stringify({
        error: 'Internal Server Error',
        message: error.message
      })
    }
  }
}

타임아웃 설정

기본 타임아웃: 30초 최대 타임아웃: 5분

콘솔에서 함수 > 설정 > 타임아웃에서 변경