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

PSG vs Monaco: ศึก 100 นัดเดือด ลีกเอิง และบทเรียนที่ปาร์ค เดส์ แพร็งซ์

PSG vs Monaco: ศึก 100 นัดเดือด ลีกเอิง และบทเรียนที่ปาร์ค เดส์ แพร็งซ์

สรุปผลและวิเคราะห์เกมเดือด PSG พบ Monaco ในลีกเอิงนัดที่ 25 ซึ่งเป็นการพบกันครั้งที่ 100 ในประวัติศาสตร์ลีก ความพ่ายแพ้ 1-3 คาบ้านของ PSG และบทบาทของ Akliouche พร้อมผลกระทบต่อเส้นทางแชมเปี้ยนส์ลีก

By ทีมงาน devdog
บาเยิร์นผงาดไร้เคน! ถล่มกลัดบัค 4-1 โชว์ความลึกของทีมก่อนลุยศึก UCL

บาเยิร์นผงาดไร้เคน! ถล่มกลัดบัค 4-1 โชว์ความลึกของทีมก่อนลุยศึก UCL

บาเยิร์น มิวนิค โชว์ฟอร์มแกร่ง แม้ไม่มีแฮร์รี่ เคน ถล่ม โบรุสเซีย มึนเชนกลัดบัค 4-1 ก่อนเตรียมลุยศึกแชมเปียนส์ลีกกับอตาลันต้า!

By ทีมงาน devdog
PSG: มหาอำนาจลูกหนังฝรั่งเศส กับศึกดวลเดือดโมนาโก และเป้าหมายสู่บัลลังก์ยุโรป

PSG: มหาอำนาจลูกหนังฝรั่งเศส กับศึกดวลเดือดโมนาโก และเป้าหมายสู่บัลลังก์ยุโรป

เจาะลึกเส้นทาง PSG สู่มหาอำนาจลูกหนัง วิเคราะห์สถานการณ์ลีกเอิง เตรียมพร้อมศึกใหญ่กับโมนาโก พร้อมความมุ่งมั่นสู่แชมป์ยุโรป

By ทีมงาน devdog
ลาลีกา: มนต์เสน่ห์ฟุตบอลสเปน, นวัตกรรมเรโทร, และบิ๊กแมตช์แห่งอนาคต

ลาลีกา: มนต์เสน่ห์ฟุตบอลสเปน, นวัตกรรมเรโทร, และบิ๊กแมตช์แห่งอนาคต

สำรวจลาลีกา ฟุตบอลสเปนอันทรงเสน่ห์ พร้อมไฮไลต์บิ๊กแมตช์ 2025/26 นวัตกรรมสัปดาห์เรโทร และบทบาทต่อวัฒนธรรมและเศรษฐกิจ.

By ทีมงาน devdog