+1

Golang Serverless Deployment on AWS Lambda

Lambda function handler là phương thức trong code của bạn dùng để xử lý các sự kiện. Khi function của bạn được invoke, Lambda sẽ chạy function handler. Function sẽ chạy đến khi handler trả về response, exits hoặc times out. Mình sẽ chai sẻ về triển khai Golang lambda, đầu tiên mình sẽ chia sẽ về code base, viết empty lambda, chọn đúng architecture và cách deploy với cloud formation. Sau đó mình sẽ chia sẽ về SNS, SQS, S3 và CloudWatch,...

  1. Bắt đầu tạo một project với Go, Mình thích dùng Golang terminal, dưới đây sẽ là code mẫu đơn giản và dễ deploy để demo cho anh em.
mkdir greeting
 go mod init github.com/greeting-lambda
package main

import "fmt"

func main() {
   fmt.Println("welcome to greeting lambda")
}
  1. Lambda runtimes

image.png Go1.x sẽ bị deprecated, nên chúng ta sử dụng provided.al2 runtime, AWS Lambda runtimes hỗ trợ 2 kiến trúc:

  • arm64 → 64-bit ARM architecture (AWS Graviton2 processor)
  • X86-64 → 64-bit x86 architecture (X86 base processor)

AWS Lambda functions chạy trên Graviton 2, sử dụng kiến trúc nền tảng Arm processor được thiết kế bởi AWS, mang lại hiệu suất giá tốt hơn tới 34% so với function chạy trên x86 processor Lambda functions sử dụng kiến trúc arm64(AWS Graviton 2 processor) có thể đạt được mức giá/hiệu suất tốt hơn đáng kể so với function tương đương chạy trên kiến trúc x86_64. Hãy cân nhắc sử dụng arm64 cho các ứng dụng chuyên sâu về high-performance computing, video encoding, và simulation.

  1. Code Chúng ta sẽ triển khia các lambda function bằng Cloud Formation. Thêm một số cấu hình vào file yaml. function name mình đặt là "greeting-function", memory size là 128MB, và timeout là 60seconds (nó đủ cho chương trình của chúng ta 😃 )
Transform: AWS::Serverless-2016-10-31
Resources:

  GreetingFunction:
    Type: AWS::Serverless::Function
    Metadata:
      BuildMethod: makefile
    Properties:
      Runtime: provided.al2
      CodeUri: ./greeting-function
      Handler: bootstrap
      FunctionName: greeting-function
      Timeout: 
        - 60
      MemorySize: 128

  GreetingFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/lambda/${GreetingFunction}
      RetentionInDays: 1

vào thư mục Lúc nãy chúng ta đã tạo và thực hiện các lệnh sau theo thứ tự

-> mkdir greeting-lambda-sample

-> cd greeting-lambda-sample

-> touch template.yaml

-> mkdir greeting-function

-> touch greeting-function/Makefile

-> touch greeting-function/main.go

Hãy chắc chắn là bạn đã cài thư viện github.com/aws/aws-lambda-go/lambda

Chúng ta đã tạo một Greeting struct với thuộc tính Message. Khi Greeting lambda được invoked với giá trị của Message thì chúng ta sẽ log được Message đó ra

package main

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

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

func Handler(ctx context.Context, gEvent *Greeting) {
	log.Printf("Welcome %s", gEvent.Message)
}

type Greeting struct {
	Message string `json:"message"`
}
  1. Makefile
  • GOOS Compile cho linux thì mình có thể set GOOS là "linux"
GOOS=linux go build

Để compile cho Window mình có thể set GOOS là "windows"

GOOS=windows go build

Để compile cho macOS mình có thể set GOOS là "darwin"

GOOS=darwin go build
  • GOARCH: Kiến trúc (amd64, arm).
  • CGO_ENABLED: Nó kiểm soát Go build system có hỗ trợ cgo hay không, đầy là toolchain để chuyển mã C qua Go, Giá trị có thể là 0/1, Lưu ý serverless function không hỗ trợ cgo.
build-GreetingFunction:
	GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap
	cp ./bootstrap $(ARTIFACTS_DIR)/.
  1. Deployment

image.png

sam build

image.png

Trên AWS, truy cập Cloud Formation, Chúng ta có thể thấy thông tin thành công, Function, LogGroup, Role được tạo bởi CloudFormation image.png

  1. Test Lambda

Chúng ta đã tạo Greeting struct với một property đơn giản là message. Giờ hay mở AWS Lambda services sau đó chọn function vừa mới tạo là "greeting-function, sau đó chọn vào test. Invoke lambda thông qua chuổi json như sau

{
  "message": "hello GO ...."
}

image.png

Giờ hãy mở log của Cloudwatch và kiểm tra image.png

image.png

Cảm ơn các bạn đã dành thời gian đọc bài viết của mình.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí