Coding Gun

ทำความรู้จักกับ AWS Lambda

Serverless คือ การเลือกวิธีการ Deploy Application ลงไปบน Platform ที่เราไม่ต้องดูแล Server เอง(จริงๆแล้วมี Server แต่เราไม่ต้องเข้าไปจัดการหรือคอยดูแล Infrastructire เหล่านั้น) ซึ่งการให้บริการแบบ Serverless นั้นจะมีบริการที่แตกต่างกันออกไป เข่น

นอกจากนี้ยังมี Service อีกหลายประเภทที่ให้บริการแบบ Serverless เช่น AWS จะมี SQS(Simple Queing Service) ที่ทำหน้าที่เป็น Message Queue แบบ Serverless

ลักษณะของการเป็น Serverless คือ

  1. จ่ายเท่าที่เราใช้เท่านั้น ถ้าไม่มีการ Execution ก็ไม่ต้องจ่าย
  2. ไม่ต้องเข้าไปจัดการกับ Infrastructure ใดๆเลย
  3. Scale In และ Scale Out โดยอัตโนมัติ

AWS Lambda คือ Serverless Compute Service เป็นบริการที่ช่วยให้เราสามารถ Deploy Application หรือ Script สำหรับการทำ Automation ขึ้นไป run บน AWS โดยที่ไม่ต้องสนใจเรื่องของ Infrastructure ใดๆเลย

AWS Lambda ใช้ภาษาอะไร?

AWS Lambda นั้นไม่ใช่ภาษาใหม่แต่เป็น Platform ดังนั้นเราสามารถเลือก Runtime ที่เราต้องการนำ Code มา Run ได้ ซึ่งภาษาที่ Lambda รองรับประกอบไปด้วย

  1. NodeJS
  2. Python
  3. Ruby
  4. Java
  5. Dotnet Core
  6. Custom Runtime(เตรียม Environment เอง)

ข้อจำกัดของ AWS Lambda

การใช้งาน AWS Lambda จะมีข้อจำกัดดังนี้

  1. จะมี Timeout อยู่ที่ 3 วินาที สามารถกำหนดได้มากที่สุด 15 นาที
  2. สามารถจองหน่วยความจำได้ตั้งแต่ 128MB ถึง 10,240MB
  3. การใช้งาน CPU จะเป็นไปตามขนาดของ Memory
  4. Lambda จะไปคุยกับ Service ของ AWS ตัวไหนได้บ้างขึ้นอยู่กับการกำหนด Role ให้กับ Lambda

ตัวอย่างการนำ Lambda Fucntion มาใช้งาน

หลังจากที่เรารู้จักกับ Lambda Function มาพอสมควรแล้วลองมาดูตัวอย่างการนำ Lambda Function ไปใช้กัน

ขั้นตอนการสร้าง AWS Lambda

เราสามารถสร้าง AWS Lambda ขึ้นมาใช้งานได้ง่ายๆด้วยขั้นตอนต่างๆ ดังนี้

  1. Upload source code ไปยัง AWS Lambda
  2. สร้าง Code Trigger(ต้องมีเหตุการณ์ที่เรียก Lambda Function ขึ้นมาใช้งาน)

ตัวอย่างการเขียน Lambda Function

การเขียน Lambda Function นั้นจะเหมือนกับการเขียนโปรแกรมปกติโดยทั่วไป ซึ่งเราจะต้องสร้าง Lambda Handler ขึ้นมาเพื่อเป็นจุดเริ่มต้นของ Lambda Function

ตัวอย่างการเขียน AWS Lambda ด้วย Python

ตัวอย่างการเขียน AWS Lambda Function ด้วยภาษา Python ซึ่งการทำงานใน Lambda Function ตัวนี้ไม่มีอะไรมากเพียงแค่ รับ event object เข้ามาแสดงใน Log และแสดงข้อความ Hello AWS Lambda ออกมาทางหน้าจอ

def lambda_handler(event, context):
    print(event)
    return 'Hello Lambda!'

Event object คือ Input ที่จะถูกส่งเข้ามาเมื่อ Lambda Function ถูกเรียกขึ้นมาใช้งาน ซึ่งจะขึ้นอยู่กับว่า Lambda Function ถูก Trigger ขึ้นมาทำงานจากเหตุการณ์ไหน

ในตัวอย่างนี้จะเป็นการ Test ผ่าน Console ซึ่งจะใช้ Input เป็น JSON แบบนี้

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
}

หลังจากนั้นเราจะได้ผลลัพธ์ออกมาดังรูป

AWS Lambda Functions Console Log
ตัวอย่าง Log ที่ได้จากการรัน Lambda Function ด้านบน

ตัวอย่างการเขียน AWS Lambda ด้วย NodeJS

ตัวอย่างการเขียน Code ด้วย Javascript เพื่อสร้าง AWS Lambda Function ก็จะเหมือนกับ Python แต่จะต่างกันตรงที่ต้องสร้าง Lambda Handler เป็น Async Function

exports.handler = async (event) => {
  console.log(event);
  return 'Hello Lambda!';
};

ตัวอย่างการเขียน AWS Lambda ด้วย C#

ตัวอย่าง Code ของ AWS Lambda Fuction ที่เขียนด้วย C# ตอนสร้าง Lambda Function เราจะต้องเลือกเป็น Dotnet Runtime

using System;
using Amazon.Lambda.Core;
using Amazon.Lambda.Serialization.Json;

namespace LambdaTest
{
    class LambdaHandler
    {
        [LambdaSerializer(typeof(JsonSerializer))]
        public string handleRequest(object evt, ILambdaContext context)
        {
            context.Logger.LogLine(evt.ToString());
            return "Hello Lambda!";
        }
    }
}

ตัวอย่างการเขียน AWS Lambda ด้วย Golang

การทำงานกับภาษา Go นั้นจะต้องใช้ Custom Runtime เพราะ AWS ไม่ได้เตรียม Runtime ไว้ให้ ดังนั้นการทำงานกับภาษาที่ AWS ไม่มี Runtime มาให้ต้องมีขั้นตอนต่างๆ ดังนี้

  1. เลือก Custom Runtime (ต้องเตรียม AMI ที่สามารถ run Go ได้)
  2. ใช้ Library ชื่อ AWS Lambda Go
  3. Import Library เข้่ามาใช้งานแบบนี้
package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
	Name string `json:"name"`
}

func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) {
	if event == nil {
		return nil, fmt.Errorf("received nil event")
	}
	message := fmt.Sprintf("Hello %s!", event.Name)
	return &message, nil
}

func main() {
	lambda.Start(HandleRequest)
}

ซึ่งการใช้งาน Runtime ที่ AWS ไม่ได้เตรียมมาให้ นอกจากขั้นตอนจะยุ่งยากกว่าแล้ว Code ก็จะดูยุ่งยากกว่าด้วย ดังนั้นถ้าเป็นไปได้ให้เราเลือก ภาษา ที่ AWS มี Runtime มาให้ใช้ดีกว่า

AWS Lambda Functions Trigger

Lambda Function เป็น Event Driven ซึ่งต้องมีเหตุการณ์ที่มาเรียกให้ Lambda Function นี้ทำงาน ซึ่งเราสามารถเรียก Lambda Fucntion ได้ด้วย

  1. API Gateway เมื่อมี Http Request เข้ามายัง API Gateway ตาม Path ที่เรากำหนดไว้
  2. S3 Bucket เมื่อมีไฟล์ Upload ขึ้นมาบน S3 Bucket
  3. Dynamo DB เมื่อมีการ Insert, Update หรือ Delete Record ใน Dynamo DB(จะเหมือนกับ Trigger ใน Database แบบ RDBMS ทั่วไป)
  4. AWS SQS(Simple Queue Service) เมื่อมีการส่ง Message เข้ามาใน AWS SQS
  5. AWS Kinesis เมื่อมีการส่ง Event เข้ามาใน Kinesis stream

นอกจากนี้ยังมี Services อื่นๆอีกหลาย Services ที่สามารถ Trigger Lambda Functions ขึ้นมาใช่งาน ดังนั้นเราสามารถนำ Lambda Functions ไปใช้งานได้หลากหลายรูปแบบมากๆ อ่านวิธีการ Invoke Lambda Function อื่นๆต่อได้ที่นี่

AWS Step Functions

AWS Step Functions คือ เครื่องมือสำหรับสร้าง Workflow ซึ่งในแต่ละ Step ใน Workflow จะมีการเรียก AWS Lambda และ Services ต่างๆของ AWS ขึ้นมาทำงาน

AWS Step Fucntions
ตัวอย่าง AWS Step Functions

AWS Step Fucntions จะถูกสร้างขึ้นมาแทนที่ AWS SWF(Simple Workflow Service) ในการสร้าง Workflow เราควรจะเลือกใช้ Step Functions ก่อน AWS SWF

รู้จักกับ Lambda@Edge

Lambda@Edge คือ Extension ของ Lambda ที่ให้เราสามารถนำ Code ไป Deploy ลงใน CloudFront Edge location(ไม่ได้อยู่ใน Region เหมือน Lambda ปกติ)

ประโยชน์ของการใช้ Lambda@Edge คือเราสามารถปรับเปลี่ยน Request และ Response ของ Cloudfront ตามที่เราต้องการได้ โดยที่ Cloudfront จะมี Events ที่ Trigger lambda function ได้ดังนี้

  1. เมื่อ CloudFront รับ Request มาจากผู้ใช้
  2. ก่อนที่ CloudFront จะ Forwards request ต่อไปยัง Service ปลายทาง
  3. เมื่อ CloudFront รับ Response จาก Service ปลายทาง
  4. ก่อนที่ CloudFront จะส่งผลลัพธ์กลับไปยังผู้ใช้่

Cloudfront Events that trigger lambda function
Cloudfront Events ที่จะ Trigger ให้ Lambda function ทำงาน

ดังนั้นจะคิดถึง Lambda@Edge เมื่อต้องการเปลี่ยน Request และ Response ที่เรารับเข้าและส่งออกจาก Cloudfront

อ่านบทความอื่นๆเกี่ยวกับ Lambda ต่อได้ที่นี่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security