Lambda มันก็แค่ฟังก์ชัน? ลองใช้ AWS Lambda สร้าง API ง่ายๆ เลยดิ!

Lambda มันก็แค่ฟังก์ชัน? ลองใช้ AWS Lambda สร้าง API ง่ายๆ เลยดิ!

ช่วงนี้ใครๆ ก็พูดถึง Serverless กันเยอะแยะเต็มไปหมด หนึ่งในนั้นที่ฮิตสุดๆ ก็คงหนีไม่พ้น AWS Lambda นี่แหละ

มันคืออะไรอ่ะ? อธิบายง่ายๆ เลยนะ มันก็คือบริการที่ให้เราเอาโค้ดฟังก์ชันของเราเนี่ย ไปโยนไว้บนคลาวด์ แล้ว AWS เค้าก็จัดการรันให้เอง ไม่ต้องไปห่วงเรื่องเซิร์ฟเวอร์ ต้องคอยอัปเดต ต้องคอยแก้แพตช์อะไรให้ปวดหัว เอาเวลาไปเขียนโค้ดดีกว่า

ทำไมถึงใช้มัน?

  1. ไม่ต้องดูแลเซิร์ฟเวอร์: อันนี้โคตรดี ไม่ต้องเสียเวลาเซ็ตอัพ Ubuntu, ลง Nginx, ติดตั้ง Python/Node.js, config อะไรเลย
  2. จ่ายตามการใช้งานจริง: รันเมื่อไหร่จ่ายเมื่อนั้น ไม่ได้รันก็ไม่เสียตังค์ ประหยัดชิบเป๋ง
  3. สเกลได้เอง: ถ้ามีคนเรียกเยอะๆ มันก็สเกลเพิ่มเครื่องให้เองอัตโนมัติ เราไม่ต้องทำอะไรเลย

มาลองทำ API ง่ายๆ ด้วย Lambda กัน

วันนี้จะลองทำ API ง่ายๆ ที่แค่ส่ง JSON กลับไปนะ จะใช้ Python เพราะมันโค้ดง่ายดี

ขั้นตอนแรก: สร้าง Lambda Function

ปกติก็เข้า AWS Console ไปเลย กดสร้าง Function แล้วเลือก Python Runtime version ที่ชอบ

โค้ด lambda_function.py จะหน้าตาประมาณนี้:

import json

def lambda_handler(event, context):
    """
    AWS Lambda handler function.
    Handles incoming requests and returns a JSON response.
    """

    print(f"Received event: {json.dumps(event, indent=2)}") # Debug: ดูว่า Event ที่ส่งมามีอะไรบ้าง

    # สมมติว่านี่คือข้อมูลที่เราอยากส่งกลับ
    data = {
        "message": "Hello from Lambda!",
        "version": "1.0.0",
        "timestamp": "2024-07-30T10:00:00Z"
    }

    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*' # CORS header, สำคัญมากสำหรับ API
        },
        'body': json.dumps(data)
    }

อธิบายโค้ดนิดนึง: lambda_handler คือฟังก์ชันหลักที่ Lambda จะเรียกใช้ event คือข้อมูลที่ส่งเข้ามา (เช่น ถ้ามาจาก API Gateway ก็จะมี path, query params, body อะไรพวกนี้) ส่วน context คือข้อมูลเกี่ยวกับ runtime ของ Lambda เอง

statusCode: อันนี้สำคัญมาก ถ้าเป็น API ก็ต้องบอกสถานะ HTTP เช่น 200 (OK), 400 (Bad Request), 500 (Server Error) headers: ถ้าทำ API มักจะต้องมี Content-Type เป็น application/json แล้วก็ Access-Control-Allow-Origin ถ้าจะให้ frontend จากโดเมนอื่นเรียกได้ ไม่งั้นติด CORS บานเลยนะจะบอกให้! body: อันนี้คือเนื้อหาที่เราจะส่งกลับไป ต้อง json.dumps ก่อนเสมอถ้าเป็น JSON นะ

ขั้นตอนสอง: ผูกกับ API Gateway

พอเรามี Lambda Function ละ ทีนี้จะเรียกมันยังไงจากข้างนอก? ก็ต้องใช้บริการอีกตัวของ AWS ที่ชื่อ API Gateway

เราสามารถสร้าง API Gateway ใหม่ แล้วผูกกับ Lambda Function ที่เราสร้างไว้ได้เลย กำหนด Path กำหนด Method (GET, POST) อะไรให้เรียบร้อย พอตั้งค่าเสร็จมันก็จะมี URL มาให้เราเรียกใช้

เช่น: https://xxxxxx.execute-api.ap-southeast-1.amazonaws.com/prod/hello

ลอง curl เรียกดู:

curl -X GET https://xxxxxx.execute-api.ap-southeast-1.amazonaws.com/prod/hello

ผลลัพธ์ที่ได้:

{
  "message": "Hello from Lambda!",
  "version": "1.0.0",
  "timestamp": "2024-07-30T10:00:00Z"
}

เยี่ยม! ได้ละ

ปัญหาที่เคยเจอจริงๆ นะ!

  • Cold Start: อันนี้เจอประจำ คือถ้า Lambda Function เรามันไม่ได้ถูกเรียกนานๆ พอมีคนเรียกครั้งแรก มันจะใช้เวลาโหลดนานกว่าปกติหน่อย แบบ 5-10 วินาทีก็มี ถ้าเป็น API ที่ต้องการความเร็วสูง อาจจะต้องคิดเยอะๆ
  • Package Size: ถ้าเราใช้ไลบรารีเยอะๆ เช่น pandas, numpy เนี่ย ขนาดไฟล์ซิปของ Lambda มันจะใหญ่มาก ทำให้ deploy ช้า แล้วก็อาจจะเจอปัญหาเรื่องพื้นที่จำกัดได้ อันนี้ต้องระวังนิดนึง

Permissions (IAM): อันนี้เป็นอะไรที่งงบ่อยมากตอนเริ่มใหม่ๆ คือ Lambda มันต้องมี Role ที่มีสิทธิ์ไปทำนู่นทำนี่ได้ เช่น ถ้าจะไปอ่านจาก S3 หรือเขียนลง DynamoDB ก็ต้องมีสิทธิ์พวกนั้น บางทีรันแล้วเจอ AccessDenied เนี่ยแหละ ตัวดีเลย!ตัวอย่าง error โง่ๆ ที่เคยเจอ:

{
  "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied",
  "errorType": "ClientError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 10, in lambda_handler",
    "    s3.get_object(Bucket='my-bucket', Key='my-file.txt')",
    "  File \"/var/runtime/botocore/client.py\", line 400, in _api_call",
    "    return self._make_api_call(operation_name, kwargs)"
  ]
}

ถ้าเจอแบบนี้คือ Lambda ไม่มีสิทธิ์ไปอ่านไฟล์ใน S3 bucket my-bucket ง่ายๆ เลยคือลืมไปเพิ่ม Permission ให้ Role ของ Lambda นั่นแหละ

ความคิดเห็นส่วนตัว:

Lambda เป็นเครื่องมือที่โคตร powerful สำหรับงานที่ไม่ซับซ้อนมาก เช่น API เล็กๆ, webhook, หรือพวก background job ที่ไม่ต้องรันตลอดเวลา แต่ถ้าจะทำระบบใหญ่ๆ แบบ Microservices ทั้งหมด อาจจะต้องคิดดีๆ เพราะมันมี Learning Curve ของมันนะเรื่อง Serverless เนี่ย แล้วก็มีเรื่อง Cost Optimization ที่ต้องศึกษาเพิ่มอีกหน่อย แต่โดยรวมแล้วถือว่าดีมาก ลองเอาไปใช้ดูสิ ไม่ได้ยากอย่างที่คิดหรอก!

Read more

ไอลีน กู: ตำนานนักสกีฟรีสไตล์ผู้พลิกโฉมวงการและความหมายของชัยชนะ

ไอลีน กู: ตำนานนักสกีฟรีสไตล์ผู้พลิกโฉมวงการและความหมายของชัยชนะ

เจาะลึกเรื่องราวของ Eileen Gu นักสกีฟรีสไตล์ผู้สร้างประวัติศาสตร์ในโอลิมปิก 2026 สถิติที่ไม่เคยมีมาก่อน ประเด็นถกเถียง และความแข็งแกร่งส่วนตัวที่ทำให้เธอก้าวสู่ระดับโลก

By ทีมงาน devdog
วันพระ: คู่มือฉบับสมบูรณ์สำหรับพุทธศาสนิกชนและผู้สนใจยุคใหม่

วันพระ: คู่มือฉบับสมบูรณ์สำหรับพุทธศาสนิกชนและผู้สนใจยุคใหม่

เจาะลึกวันพระและความสำคัญของวันมาฆบูชา 2569 ทั้งวันหยุดราชการ ธนาคาร กิจกรรมเวียนเทียนต้นไม้ และผลกระทบต่อบริการขนส่ง เตรียมตัววางแผนทำบุญและพักผ่อน

By ทีมงาน devdog
ถอดรหัสรักแท้: "บังมัดคลองตันต้นข้าว" เรื่องราวที่สะท้อนการให้อภัยและการเริ่มต้นใหม่

ถอดรหัสรักแท้: "บังมัดคลองตันต้นข้าว" เรื่องราวที่สะท้อนการให้อภัยและการเริ่มต้นใหม่

เจาะลึกงานวิวาห์ "บังมัดคลองตัน" กับ "ต้นข้าว มิสแกรนด์" พร้อมเหตุผลจากใจเจ้าสาวที่เลือกความรักเหนือกาลเวลาและคำวิจารณ์ สู่การเริ่มต้นชีวิตคู่ที่สะท้อนการให้อภัย

By ทีมงาน devdog
ไฮไลท์บอลไทยลีก 2: มหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรงสู่เส้นทางเพลย์ออฟ

ไฮไลท์บอลไทยลีก 2: มหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรงสู่เส้นทางเพลย์ออฟ

เจาะลึกไฮไลท์บอลไทยลีก 2 ของมหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรง ชัยชนะสำคัญจาก ชิตชนก และบทบาทโค้ชดุสิต สู่เส้นทางเพลย์ออฟที่น่าจับตา!

By ทีมงาน devdog