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,...
- 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")
}
- Lambda runtimes
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.
- 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"`
}
- 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)/.
- Deployment
sam build
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
- 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 ...."
}
Giờ hãy mở log của Cloudwatch và kiểm tra
Cảm ơn các bạn đã dành thời gian đọc bài viết của mình.
All rights reserved