본문으로 건너뛰기 Complete AWS Lambda Complete Guide | Serverless· API Gateway

Complete AWS Lambda Complete Guide | Serverless· API Gateway

Complete AWS Lambda Complete Guide | Serverless· API Gateway

이 글의 핵심

Complete guide to building serverless apps with AWS Lambda. From function writing, API Gateway, DynamoDB, S3, EventBridge to Cold Start optimization wit...

Key Takeaways

Complete guide to building serverless apps with AWS Lambda. Covers function writing, API Gateway, DynamoDB, S3, EventBridge, and Cold Start optimization with practical examples.

Real-World Experience: Migrating from traditional servers to Lambda reduced infrastructure costs by 80% and secured infinite scalability.

Introduction: “Server Management is Burdensome”

Real-World Problem Scenarios

Scenario 1: Server crashes when traffic spikes
EC2 instances are insufficient. Lambda scales automatically. Scenario 2: Server costs are too high
24/7 running server costs are significant. Lambda charges only for usage. Scenario 3: Server management is complex
Patching, security, and monitoring are cumbersome. Lambda is managed by AWS.

1. What is AWS Lambda?

Key Features

AWS Lambda is a serverless computing service. Main Advantages:

  • No server management: Managed by AWS
  • Automatic scaling: Infinite scaling
  • Usage-based billing: Charged only for execution time
  • Event-driven: Integrates with S3, DynamoDB, etc.
  • Fast deployment: Just upload code Pricing:
  • 1 million requests per month: Free
  • After: $0.20 / 1 million requests

2. First Lambda Function

Node.js

// index.js
export const handler = async (event) => {
  console.log('Event:', JSON.stringify(event));
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Hello from Lambda!',
      input: event,
    }),
  };
};

Python

# lambda_function.py
import json
def lambda_handler(event, context):
    print(f'Event: {json.dumps(event)}')
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'message': 'Hello from Lambda!',
            'input': event
        })
    }

3. API Gateway Integration

REST API

# serverless.yml (Serverless Framework)
service: my-api
provider:
  name: aws
  runtime: nodejs20.x
  region: us-east-1
functions:
  getUsers:
    handler: handlers/users.getUsers
    events:
      - http:
          path: users
          method: get
          cors: true
  getUser:
    handler: handlers/users.getUser
    events:
      - http:
          path: users/{id}
          method: get
          cors: true
  createUser:
    handler: handlers/users.createUser
    events:
      - http:
          path: users
          method: post
          cors: true

Handler

// handlers/users.js
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
import { DynamoDBDocumentClient, ScanCommand, GetCommand, PutCommand } from '@aws-sdk/lib-dynamodb';
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
export const getUsers = async (event) => {
  const command = new ScanCommand({
    TableName: 'Users',
  });
  const result = await docClient.send(command);
  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
      'Access-Control-Allow-Origin': '*',
    },
    body: JSON.stringify(result.Items),
  };
};
export const getUser = async (event) => {
  const { id } = event.pathParameters;
  const command = new GetCommand({
    TableName: 'Users',
    Key: { id },
  });
  const result = await docClient.send(command);
  if (!result.Item) {
    return {
      statusCode: 404,
      body: JSON.stringify({ error: 'User not found' }),
    };
  }
  return {
    statusCode: 200,
    body: JSON.stringify(result.Item),
  };
};
export const createUser = async (event) => {
  const body = JSON.parse(event.body);
  const command = new PutCommand({
    TableName: 'Users',
    Item: {
      id: Date.now().toString(),
      ...body,
      createdAt: new Date().toISOString(),
    },
  });
  await docClient.send(command);
  return {
    statusCode: 201,
    body: JSON.stringify({ message: 'User created' }),
  };
};

4. DynamoDB Integration

Table Creation

# serverless.yml
resources:
  Resources:
    UsersTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: Users
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST

5. S3 Events

S3 Trigger

functions:
  processImage:
    handler: handlers/images.process
    events:
      - s3:
          bucket: my-images-bucket
          event: s3:ObjectCreated:*
          rules:
            - suffix: .jpg

Handler

// handlers/images.js
import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
import sharp from 'sharp';
const s3 = new S3Client({});
export const process = async (event) => {
  for (const record of event.Records) {
    const bucket = record.s3.bucket.name;
    const key = record.s3.object.key;
    // Get original image
    const getCommand = new GetObjectCommand({ Bucket: bucket, Key: key });
    const { Body } = await s3.send(getCommand);
    // Resize
    const resized = await sharp(Body)
      .resize(800, 600)
      .toBuffer();
    // Save
    const putCommand = new PutObjectCommand({
      Bucket: bucket,
      Key: `resized/${key}`,
      Body: resized,
    });
    await s3.send(putCommand);
  }
  return { statusCode: 200, body: 'Processed' };
};

6. EventBridge (Scheduling)

functions:
  dailyReport:
    handler: handlers/reports.daily
    events:
      - schedule:
          rate: cron(0 9 * * ? *)  # Daily at 9 AM
          enabled: true

7. Cold Start Optimization

1. Runtime Selection

provider:
  runtime: nodejs20.x  # Fast Cold Start
  # runtime: python3.12  # Slow Cold Start

2. Increase Memory

functions:
  api:
    handler: index.handler
    memorySize: 1024  # Default 128MB → 1024MB

3. Provisioned Concurrency

functions:
  api:
    handler: index.handler
    provisionedConcurrency: 2  # Always keep 2 ready

4. Bundle Optimization

// webpack.config.js
module.exports = {
  target: 'node',
  mode: 'production',
  externals: ['aws-sdk'],  // Exclude AWS SDK
  optimization: {
    minimize: true,
  },
};

8. Practical Example: Image Upload API

// handlers/upload.js
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
const s3 = new S3Client({});
export const getUploadUrl = async (event) => {
  const { filename, contentType } = JSON.parse(event.body);
  const command = new PutObjectCommand({
    Bucket: 'my-uploads-bucket',
    Key: `uploads/${Date.now()}-${filename}`,
    ContentType: contentType,
  });
  const uploadUrl = await getSignedUrl(s3, command, { expiresIn: 3600 });
  return {
    statusCode: 200,
    body: JSON.stringify({ uploadUrl }),
  };
};

Summary and Checklist

Key Summary

  • AWS Lambda: Serverless computing
  • Automatic scaling: Infinite scaling
  • Usage-based billing: Execution time only
  • API Gateway: Build REST APIs
  • DynamoDB: NoSQL database
  • S3: File storage

Implementation Checklist

  • Write Lambda functions
  • Configure API Gateway
  • Integrate DynamoDB
  • Handle S3 events
  • Optimize Cold Start
  • Set up monitoring
  • Deploy

  • Cloudflare Workers AI Guide
  • Terraform Practical Guide
  • FastAPI Complete Guide

Keywords Covered in This Article

AWS, Lambda, Serverless, API Gateway, DynamoDB, S3, Cloud

Frequently Asked Questions (FAQ)

Q. Lambda vs EC2, which is better?

A. Lambda is advantageous for intermittent traffic. EC2 is advantageous for continuous traffic. Consider cost and management convenience.

Q. How long does Cold Start take?

A. Node.js is 100-300ms, Python is 200-500ms, Java is 1-3 seconds. Can be eliminated with Provisioned Concurrency.

Q. Is there an execution time limit?

A. Maximum 15 minutes. For longer tasks, use Step Functions or ECS.

Q. Is it safe to use in production?

A. Yes, many companies including Netflix and Coca-Cola use it.


Frequently Asked Questions (FAQ)

Q. When would I use this in practice?

A. Complete guide to building serverless apps with AWS Lambda.

Q. What should I read before this?

A. Follow the previous article or related articles links at the bottom of each post to learn in sequence.

Q. Where can I study this more deeply?

A. Check cppreference and the relevant library’s official documentation. The reference links at the end of the article are also worth using.


Other articles related to this topic.


Keywords Covered in This Article (Related Search Terms)

This article covers AWS, Lambda, Serverless, API Gateway, DynamoDB, S3, Cloud.