Kiến thức

Serverless Series (Golang) – Bài 1 – Serverless và AWS Lambda 09 tháng 03, 2022 – 462 lượt xem Golang DevOps AWS Đầu mục bài viết Bài viết liên quan Khoá học hay

Tác giả: Huỳnh Minh Quân – Người chỉ dẫn khóa học AWS: Learn AWS the Hard Way.

Xem các bài viết khác trong Series Serverless


Giới thiệu

Chào mừng tới với loạt bài Serverless. Bài trước tiên chúng ta sẽ mày mò về Serverless, AWS Lambda là gì.

Serverless là 1 trong những mẫu hình tăng trưởng phần mềm đám mây. Trước lúc mày mò về Serverless là gì, chúng ta sẽ nói về việc lúc chúng ta tăng trưởng phần mềm trên đám mây, đám mây sẽ phân phối cho chúng ta các mẫu hình tăng trưởng như thế nào.

Các mẫu hình đám mây

Trên Cloud chúng ta sẽ có 4 mẫu hình tăng trưởng như sau:

  • IaaS (Cơ sở cơ sở vật chất như 1 dịch vụ)
  • PaaS (Nền móng như 1 dịch vụ)
  • CaaS (Vùng chứa như 1 dịch vụ)
  • FaaS (Công dụng như 1 dịch vụ)

image.png

Cơ sở cơ sở vật chất như 1 dịch vụ

Đây là mẫu hình tầm thường nhất lúc chúng ta sử dụng đám mây, có thể bạn đã sử dụng nó hàng ngày nhưng chúng tôi ko trông thấy. Trong mẫu hình này, các nhà tăng trưởng Đám mây sẽ hiển thị các API tương tác với nền móng ảo hóa bên dưới, chả hạn như API tương tác với máy ảo, API tương tác với bộ nhớ, v.v. Để chúng tôi có thể tự tạo và điều hành cơ sở cơ sở vật chất của mình. trên đám mây. Tỉ dụ: Đám mây AWS hiển thị các API liên can tới EC2, cho phép bạn dễ ợt tạo và điều hành EC2 của riêng mình bằng Bảng điều khiển web hoặc AWS CLI. Trong mẫu hình này, chúng tôi sẽ tạo và tự điều hành cơ sở cơ sở vật chất của mình cũng như quy mô của nó.

Nền móng như 1 dịch vụ

Đây là mẫu hình tăng trưởng trong đấy đám mây sẽ phân phối cho chúng tôi Khung nền móng để chúng tôi tăng trưởng các phần mềm tầm thường hơn. Tỉ dụ: để khai triển 1 phần mềm web trên đám mây, đầu tiên chúng ta phải tạo EC2 (máy ảo), sau đấy chúng ta định cấu hình nhóm bảo mật để lưu lượng truy cập có thể đi vào EC2 của chúng ta, sau đấy chúng ta khai triển phần mềm trên EC2, và làm rất nhiều. hơn nữa, các nhà tăng trưởng đám mây sẽ phân phối cho chúng tôi Nền móng để làm điều đấy tốc độ hơn. Tỉ dụ: AWS có AWS Elastic Beanstalk, là Nền móng cho phép chúng ta dễ ợt khai triển 1 phần mềm web, chúng ta chỉ cần 3 cú nhấp chuột dễ dàng trên Bảng điều khiển web để có được 1 phần mềm web, thay vì 1 phần mềm web. phải đi tạo và cấu hình nhiều thứ khác.

Vùng chứa như 1 dịch vụ

Mẫu hình này dễ dàng, chúng tôi sẽ tăng trưởng phần mềm dựa trên vùng chứa và có 1 dụng cụ để điều hành các vùng chứa của chúng ta, chả hạn như Kubernetes (bạn có thể đọc loạt bài Kubernetes của tôi để thông suốt hơn về mẫu hình CaaS). AWS phân phối cho chúng tôi AWS EKS để tăng trưởng các phần mềm trên mẫu hình CaaS.

Công dụng như 1 dịch vụ

Chung cuộc và ở cấp thấp nhất, đám mây cho phép chúng tôi tăng trưởng các phần mềm chỉ dựa trên Công dụng, chúng tôi ko cần tạo và điều hành cơ sở cơ sở vật chất phức tạp, chúng tôi chỉ cần điều hành các công dụng của mình và công dụng này có thể tự động mở mang quy mô nhưng ko cần bất cứ cấu hình nào, là thành phần chính của mẫu hình Serverless của chúng tôi.

Serverless là gì?

Từ những điều trên, chúng ta có thể hiểu dễ dàng Serverless là 1 mẫu hình tăng trưởng phần mềm đám mây cho phép chúng ta xây dựng và chạy các phần mềm của mình 1 cách dễ ợt, hoàn toàn chẳng phải điều hành máy chủ.

image.png

Ích lợi của mẫu hình Serverless

Dưới đây là 4 ích lợi tôi thấy của mẫu hình Serverless:

  • Giảm chi tiêu điều hành và vận hành máy chủ, đây là công tác thường xuyên của DevOps, chúng ta có thể cắt bớt khối lượng công tác nhưng DevOps cần tiến hành. Như tạo, điều hành và giám sát EC2.
  • Tự động mở mang quy mô và tính khả dụng cao: FaaS của chúng tôi sẽ tự động mở mang quy mô theo lưu lượng truy cập, chúng tôi ko cần cấu hình nhiều trừ lúc chúng tôi muốn nó mở mang quy mô theo 1 cách nhất mực.
  • Tối ưu hóa việc sử dụng đám mây: đối với đám mây, vấn đề quan trọng nhất là tiền hàng tháng, lúc chúng ta sử dụng FaaS sẽ chỉ cần thanh toán cho mỗi công dụng được kích hoạt.
  • Cung cấp nhiều tiếng nói không giống nhau: chúng ta có thể sử dụng nhiều tiếng nói không giống nhau để viết FaaS

Điểm yếu của mẫu hình Serverless

Vì thế, cái gì có thế mạnh cũng có điểm yếu 😂, đây là điểm yếu nhưng tôi thấy trong mẫu hình Serverless:

  • Khó gỡ lỗi.
  • Khởi động nguội: mất 1 khi nếu công dụng được kích hoạt lần trước tiên hoặc công dụng hi hữu được đề xuất, sau đấy mất nhiều thời kì để chạy lại.
  • Khó tổ chức mã nguồn: do mỗi công dụng sẽ được khai triển biệt lập nên cách tổ chức mã nguồn sẽ khó hay dễ tùy thuộc vào các tiếng nói không giống nhau.
  • Khó thiết kế môi trường dành cho nhà tăng trưởng cục bộ.

Nhà phân phối đám mây ko máy chủ

3 đám mây tầm thường nhất hiện tại là AWS, GCP và Azure. Mỗi người trong số họ sẽ phân phối cho chúng tôi các dịch vụ FaaS không giống nhau:

  • AWS phân phối cho chúng tôi AWS Lambda
  • Google Cloud có các Công dụng của Google Cloud
  • Azure là Công dụng Azure của Microsoft

Trong loạt bài này, tôi sẽ sử dụng AWS và AWS Lambda.

AWS Lambda

AWS Lambda là 1 dịch vụ AWS cho phép bạn chạy và điều hành các công dụng. Đây là thành phần chính của mẫu hình Serverless. Chúng tôi sẽ viết mã trên máy cục bộ và khai triển nó đến AWS Lambda để chạy. Ngoài AWS Lambda, AWS còn phân phối cho chúng ta 1 số dịch vụ như sau để xây dựng mẫu hình Serverless:

Dịch vụ AWS

  • S3 chúng tôi sử dụng để lưu hình ảnh
  • Cổng API để chúng tôi xây dựng API REST
  • DynamoDB dành cho cơ sở dữ liệu
  • Nhận dạng để chuẩn xác
  • SQS cho hàng đợi
  • SNS cho công bố (pub-sub)

AWS Lambda được thiết kế cho kiến ​​trúc hướng sự kiện, mã của chúng tôi sẽ được kích hoạt dựa trên 1 sự kiện nhất mực, chả hạn như 1 đề xuất của người mua đối với API, tất cả các thứ tự kích hoạt đều độc lập với nhau và chúng tôi chỉ thanh toán cho nó. mỗi lúc công dụng được kích hoạt và chạy. So với EC2, chúng tôi phải trả tiền theo giờ, ngay cả lúc mã của chúng tôi trên EC2 ko xử lý bất cứ đề xuất nào cho khách hàng, chúng tôi vẫn phải thanh toán, còn Lambda thì ko.

Nguồn sự kiện

Trên AWS, Lambda sẽ được kích hoạt từ 1 số sự kiện của các dịch vụ khác như sau:

image.png

Thiết kế API REST theo mẫu hình Serverless

Sau đấy, có rất nhiều phần mềm nhưng chúng ta có thể thiết kế theo mẫu hình Serverless, phần mềm tầm thường nhất theo tôi có thể được sử dụng để xây dựng REST API và Phần mềm trang đơn, mô chừng như sau:

image.png

Chúng tôi sẽ định cấu hình Con đường 53 (dịch vụ được sử dụng để định tuyến DNS) trỏ tới CloudFront (Mạng cung ứng nội dung, được sử dụng để lưu nội dung tĩnh), CloudFront của chúng tôi sẽ lưu trữ nội dung từ S3 (nơi chúng tôi lưu trữ Phần mềm Trang đơn, có thể là React – Angular – Vue) . Lúc máy khách tải nội dung từ Phần mềm trang đơn web, trong phần mềm này, chúng tôi sẽ gọi API HTTP đến cổng API (dịch vụ được sử dụng để xây dựng API REST và hướng đề xuất tới Lambda). Lambda sẽ được kích hoạt từ cổng API, Lambda chạy và kết nối với DynamoDB, xử lý đề xuất và trả kết quả cho máy khách.

Tiếng nói AWS Lambda được cung cấp

Tại thời khắc viết bài này, Lambda cung cấp các tiếng nói sau: Java, Go, PowerShell, Node. js, C #, Python, Đá quý. Nếu bạn muốn sử dụng tiếng nói khác, nó phân phối API thời kì chạy để bạn tích hợp với tiếng nói đấy. Trong series này mình sẽ viết bằng Golang, nếu bạn muốn viết bằng NodeJS thì cứ comment nói mình sẽ viết cả phần Golang và NodeJS.

Đã nói, hiện giờ chúng tôi sẽ viết AWS Lambda trước tiên của chúng tôi.

Xin chào lambda

Để tiến hành loạt bài này, bạn cần có nick AWS. Và cần setup AWS CLI trên máy của bạn. Vui lòng tuân theo chỉ dẫn này https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html.

Sau lúc setup xong, hãy rà soát nó bằng lệnh sau:

$ aws lambda list-functions

Tiếp theo, bạn cần setup Golang trên máy tính của mình. Vui lòng tuân theo chỉ dẫn tại đây https://go.dev/doc/install.

Vậy là xong, chúng ta hãy mở đầu viết hàm Lambda trước tiên của chúng ta. Tạo 1 folder có tên xin chào-lambda và mở folder đấy. Mở terminal ngay trong folder đấy và nhập:

$ go mod init hello-lambda
go: creating new go.mod: module hello-lambda
go: lớn add module requirements and sums:
$ go mod tidy

$ go get github.com/aws/aws-lambda-go/lambda
go get: added github.com/aws/aws-lambda-go v1.27.0

Tạo 1 tệp có tên main.go với mã sau:

package main

import "github.com/aws/aws-lambda-go/lambda"

func handler() (string, error) {
	return "Welcome lớn Serverless world", nil
}

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

Chúng ta sẽ viết 1 hàm có tên là handler (bạn có thể đặt tên cho nó bất kỳ thứ gì bạn muốn) và sử dụng hàm lambda.Start (trình xử lý) để Lambda có thể chạy công dụng trên. Tiếp theo, chúng tôi sẽ xây dựng tệp main.go này thành tệp nhì phân và nén nó lại thành tệp zip để có thể tải lên AWS Lambda. Tối đa của tệp zip là 50MB.

$ go build -o hello main.go
$ zip main.zip hello

Ok, chúng ta đã xong xuôi mã. Hiện thời chúng ta sẽ đi tới AWS để tạo 1 Lambda và tải lên mã của chúng ta. Đi đến Bảng điều khiển AWS và nhập Lambda vào hộp kiếm tìm.

image.png

Đây là giao diện khách hàng Bảng điều khiển AWS lúc tôi viết, nó có thể khác trong ngày mai. Sau lúc nhập Lambda, chuyển sang tab công dụng và nhấp vào tạo công dụng. Chọn tác giả từ đầu

image.png

Trong đấy thông tin căn bản, chúng tôi nhập tên hàm là hello-lambda và chọn thời kì chạy là Go 1.x

image.png

Sau đấy, chúng ta bấm tạo công dụng. Sau lúc tạo xong, chúng ta sẽ thấy giao diện khách hàng như sau:

image.png

Sau lúc tạo xong, chúng ta mở terminal trong folder nhưng chúng ta đã tạo tệp zip code, chạy lệnh sau:

$ aws lambda update-function-code --function-name hello-lambda --zip-file fileb://./main.zip

Ok, vậy là chúng ta đã tạo xong hàm lambda trước tiên, để rà soát nó, bạn chạy lệnh sau:

$ aws lambda invoke --function-name hello-lambda --region us-west-2 response.json
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

Bạn mở file response.json sẽ thấy kết quả được lưu là “Welcome lớn Serverless world”, vậy là chúng ta đã chạy hàm AWS Lambda trước tiên rồi 😁.

Kết luận

Tương tự chúng ta đã mày mò về mẫu hình Serverless và AWS lambda. Việc thiết kế phần mềm với mẫu hình Serverless sẽ giúp chúng ta nhiều hơn trong việc điều hành máy chủ, và sử dụng AWS lambda sẽ tiết kiệm chi tiêu hơn so với sử dụng EC2. Nếu bạn muốn tôi tạo khoáng sản trên AWS bằng cách sử dụng terraform thay vì bảng điều khiển web, vui lòng bình luận bên dưới. Nếu có thắc mắc hoặc cần trả lời thêm, bạn có thể hỏi trong phần bình luận bên dưới. Mong các bạn theo dõi bộ truyện của mình 😆😁. Trong bài tiếp theo, tôi sẽ nói về cách sử dụng API Gateway để tạo REST API với Lambda.


Thông tin thêm

Serverless Series (Golang) – Bài 1 – Serverless và AWS Lambda

09 tháng 03, 2022 – 462 lượt xem

Golang DevOps AWS

Đầu mục bài viết

Bài viết liên can

Khoá học hay

#Serverless #Series #Golang #Bài #Serverless #và #AWS #Lambda09 #tháng #lượt #xem #Golang #DevOps #AWS #Đầu #mục #bài #viếtBài #viết #liên #quanKhoá #học #hay
[rule_3_plain] #Serverless #Series #Golang #Bài #Serverless #và #AWS #Lambda09 #tháng #lượt #xem #Golang #DevOps #AWS #Đầu #mục #bài #viếtBài #viết #liên #quanKhoá #học #hay
Tác giả: Huỳnh Minh Quân- giảng sư khóa học AWS : Learn AWS the Hard Way.
Xem các bài viết khác thuộc Series Serverless

Giới thiệu
Chào các bạn đến với series về Serverless. Bài trước tiên chúng ta sẽ mày mò về Serverless là gì, AWS Lambda là gì.
Serverless là 1 trong những mẫu hình tăng trưởng phần mềm trên cloud. Trước lúc ta mày mò về Serverless là gì, ta sẽ nói qua lúc ta tăng trưởng phần mềm trên cloud, cloud sẽ phân phối cho ta những mẫu hình tăng trưởng như thế nào.
Cloud models
Trên Cloud ta sẽ có 4 mẫu hình tăng trưởng như sau:

IaaS (Infrastructure as a Service)
PaaS (Platform as a Service)
CaaS (Container as a Service)
FaaS (Function as a Service)

Infrastructure as a Service
Đây là mẫu hình tầm thường nhất lúc ta sử dụng cloud, các bạn có thể đã sử dụng nó hàng ngày nhưng ta chẳng chú ý. Ở mẫu hình này nhà tăng trưởng Cloud sẽ exposes những API nhưng tương tác với virtualized platform bên dưới, như là API tương tác với máy ảo, API tương tác với storage, … Để ta có thể tự tạo và điều hành cơ sở vật chất của ta trên cloud. Tỉ dụ như là AWS Cloud exposes những API liên can đến EC2, cho phép ta tự tạo và điều hành EC2 của ta 1 cách dễ ợt bằng Web Console hoặc AWS CLI. Ở mẫu hình này thì ta sẽ tự tạo, và tự điều hành cơ sở vật chất của ta cũng như việc scale của nó.
Platform as a Service
Đây là 1 mẫu hình tăng trưởng nhưng cloud sẽ phân phối cho ta 1 Platform Framework để ta tăng trưởng phần mềm danh hơn. Tỉ dụ để khai triển 1 phần mềm web trên cloud, trước tiên ta phải tạo EC2 (máy ảo), xong rồi ta cấu hình security group để traffic có thể đi vào EC2 của ta, xong sau đấy ta deploy phần mềm trên EC2, và làm nhùng nhằng nhiều thứ nữa, thì các nhà tăng trưởng cloud sẽ phân phối cho ta các Platform để làm việc đấy tốc độ hơn. Tỉ dụ như AWS thì có AWS Elastic Beanstalk, là 1 Platform cho phép ta dễ ợt khai triển 1 phần mềm web, ta chỉ cần xài 3 cú click chuột dễ dàng trên Web Console là ta sẽ có được 1 phần mềm web, thay vì phải đi tạo và cấu hình nhùng nhằng nhiều thứ khác.
Container as a Service
Mẫu hình này thì dễ dàng là ta sẽ tăng trưởng phần mềm dựa trên container và có 1 tool để điều hành những container của chúng ta, tỉ dụ như là Kubernetes (các bạn có thể đọc series về Kubernetes của mình để hiểu hơn về mẫu hình CaaS). AWS có phân phối cho ta AWS EKS để tăng trưởng phần mềm trên mẫu hình CaaS.
Function as a Service
Chung cuộc và là cấp bé nhất, cloud cho phép ta tăng trưởng phần mềm chỉ dựa trên các Function, ta ko cần phải tạo và điều hành cơ sở vật chất phúc tạp gì hết, ta chỉ cần điều hành những function của chúng ta, và những function này có thể tự động auto scale nhưng ta ko cần phải cấu hình gì cả, đây chính là thành phần chính trong mẫu hình Serverless của chúng ta.
Serverless là gì
Từ trên ta có thể hiểu dễ dàng Serverless là mẫu hình tăng trưởng phần mềm trên cloud nhưng cho phép ta xây dựng và chạy applications của chúng ta 1 cách dễ ợt, nhưng ko cần điều hành server gì hết.

Ích lợi của mẫu hình Serverless
Đây là 4 ích lợi mình thấy của mẫu hình Serverless:

Giảm chi tiêu của việc điều hành và vận hành server, đây là công tác thường xuyên của DevOps, ta có thể giảm số lượng công tác nhưng DevOps cần phải làm. Như tạo, điều hành và monitor EC2.
Tự động scale và high-availability: FaaS của chúng ta sẽ tự động scale theo traffic, ta ko cần cấu hình gì nhiều, trừ lúc ta muốn nó scale theo 1 cách cụ thế nào đấy.
Tối ưu tiền sử dụng cloud: đối với cloud vần đề quan trọng nhất là tiền hàng tháng, lúc ta xài FaaS thì ta sẽ chỉ cần thanh toán cho từng function được trigger.
Cung cấp nhiều tiếng nói không giống nhau: ta có thể dùng nhiều tiếng nói không giống nhau để viết FaaS

Điểm yếu của mẫu hình Serverless
Thì cái nào có thế mạnh thì cũng có điểm yếu 😂, đây là những điểm yếu nhưng mình thấy ở mẫu hình Serverless:

Khó debug.
Cold starts: mất 1 khoảng thời kì nếu function được trigger lần trước tiên, hoặc function đấy ít lúc được request đến thì lúc nó chạy lại khá tốn thời kì.
Khó tổ chức source code: vì mỗi function sẽ được deploy riêng nên cách tổ chức source code sẽ khó hay dễ tùy thuộc vào tiếng nói không giống nhau.
Khó thiết kế môi trường dev local.

Serverless cloud providers
Thì 3 thằng cloud hiện nay nhưng tầm thường nhất là AWS, GCP, Azure. Từng thằng nó sẽ phân phối cho ta dịch vụ FaaS không giống nhau:

AWS thì phân phối cho ta AWS Lambda
Google Cloud thì có Google Cloud Functions
Azure thìa là Microsoft Azure Functions

Trong series này mình sẽ dùng AWS và AWS Lambda.
AWS Lambda
AWS Lambda là 1 service của AWS cho phép ta chạy và điều hành function. Đây là thành phần chính của mẫu hình Serverless. Ta sẽ viết code dưới máy local và deploy nó lên AWS Lambda để chạy. Ngoài AWS Lambda thì AWS còn phân phối cho ta 1 số dịch vụ như sau để xây dựng mẫu hình Serverless:

S3 ta dùng để lưu hình ảnh
API gateway để ta xây dựng REST API
DynamoDB cho database
Cognito dùng để Authentication
SQS phục vụ queue
SNS phục vụ notification (pub-sub)

AWS Lambda được thiết kế cho event-driven architecture, code của chúng ta sẽ được trigger dựa theo 1 event nào đấy, tỉ dụ là request của client đến API, tất cả các process trigger là độc lập vói nhau và ta chỉ thanh toán cho từng lần function được trigger và chạy. So sánh với EC2 thì ta phải thanh toán theo giờ, ngay cả lúc code trên EC2 của chúng ta ko xử lý request nào cho user cả thì ta vẫn tốn tiền trả, còn Lambda thì ko tương tự.
Source events
Trên AWS thì Lambda sẽ được trigger từ 1 số event của các service khác như sau:

Thiết kế REST API theo mẫu hình Serverless
Thì có nhiều phần mềm ta có thể thiết kế theo mẫu hình Serverless được, nhưng tầm thường nhất theo mình nghĩ có thể là dùng để xây dựng REST API và Single Page Application, mô chừng như sau:

Ta sẽ config Route 53 (service dùng để route DNS) chỉa đến CloudFront (Content Delivery Network serivce, dùng dể cache static content), CloudFront của ta sẽ cache nội dung từ S3 (nơi ta lưu Single Page Application, có thể là React – Angular – Vue). Lúc client tải nội dung từ Web Single Page Application thì trong phần mềm này ta sẽ gọi HTTP API đến API gateway (service dùng để xây dựng REST API và dẫn request đến Lambda). Lambda sẽ được trigger từ API gateway, Lambda chạy và kết mối đến DynamoDB, xử lý request và trả kết quả về cho client.
Các tiếng nói AWS Lambda cung cấp
Tại thời khắc mình viết bài này thì Lambda cung cấp các tiếng nói sau đây: Java, Go, PowerShell, Node. js, C#, Python, Đá quý. Nếu bạn muốn xài tiếng nói khác thì nó có phân phối Runtime API để bạn integrate với tiếng nói đấy. Ở trong series này mình sẽ viết bằng Golang, nếu các bạn muốn viết bằng NodeJS thì cứ comment nói mình sẽ viết cả 2 phần Golang và NodeJS.
Thì nói nhiều rồi, hiện giờ ta sẽ viết AWS Lambda trước tiên.
Hello Lambda
Để làm được series này, đề xuất bạn cần có AWS nick nhé. Và cần cài AWS CLI trên máy của bạn. Các bạn tuân theo chỉ dẫn này nha https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html.
Sau lúc cài xong thì bạn test bằng câu lệnh sau:

$ aws lambda list-functions

Tiếp theo là bạn cần cài Golang trên máy của mình. Các bạn tuân theo chỉ dẫn ở đây nha https://go.dev/doc/install.
Oke, sau lúc làm sau hết thì ta mở đầu vào việc viết Lambda function đầu tiền. Tạo 1 thư mục tên là hello-lambda và mở thư mục đấy ra. Bạn mở terminal ngay thư mục đấy và gõ:

$ go mod init hello-lambda
go: creating new go.mod: module hello-lambda
go: lớn add module requirements and sums:
$ go mod tidy

$ go get github.com/aws/aws-lambda-go/lambda
go get: added github.com/aws/aws-lambda-go v1.27.0

Tạo 1 file tên là main.go với đoạn code sau đây:

package main

import “github.com/aws/aws-lambda-go/lambda”

func handler() (string, error) {
return “Welcome lớn Serverless world”, nil
}

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

Ta sẽ viết 1 function tên là handler (ở đây bạn đặt tên gì cũng được) và dùng hàm lambda.Start(handler) để Lambda có thể chạy function trên. Tiếp theo ta sẽ build file main.go này thành binary file và zip nó lại thành 1 file zip để có thể upload được lên AWS Lambda. Maximun của file zip là 50MB nhé.

$ go build -o hello main.go
$ zip main.zip hello

Oke, ta đã sẵn sàng xong phần code. Hiện thời ta sẽ lên AWS tạo 1 Lambda và upload code của ta lên. Truy cập lên AWS Console và gõ Lambda vào khung kiếm tìm.

Này là UI của AWS Console lúc mình viết bài này, trong ngày mai có thể sẽ khác. Sau lúc vào Lambda thì bạn chuyển sang tab function và bấm create function. Chọn Author from scratch

Chỗ basic infomation ta nhập vào function name là hello-lambda và chọn runtime là Go 1.x

Sau đấy ta bấm create function. Sau lúc tạo xong thì ta sẽ thấy UI như sau:

Sau lúc tạo xong thì ta mở terminal ở thư mục nãy ta build file zip code, chạy câu lệnh sau:

$ aws lambda update-function-code –function-name hello-lambda –zip-file fileb://./main.zip

Oke, vậy là ta đã tạo được lambda function đầu tiền, để test được nó thì bạn chạy câu lệnh sau:

$ aws lambda invoke –function-name hello-lambda –region us-west-2 response.json
{
“StatusCode”: 200,
“ExecutedVersion”: “$LATEST”
}

Bạn mở file response.json lên là sẽ thấy kết quả được lưu là “Welcome lớn Serverless world”, vậy là ta đã chạy được AWS Lambda function trước tiên 😁.
Kết luận
Vậy là ta đã mày mò xong về mẫu hình Serverless và AWS lambda. Thiết kế phần mềm với mẫu hình Serverless sẽ giúp ta đỡ việc hơn trong việc điều hành server, và dùng AWS lambda sẽ tiết kiệm chi tiêu hơn so với việc sử dụng EC2. Nếu các bạn muốn mình tạo resource trên AWS bằng terraform thay vì web console thì comment ở dưới nhé. Nếu có thắc mắc hoặc cần giảng giải rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment. Mong các bạn theo dõi series của mình nhé 😆😁. Ở bài tiếp theo mình sẽ nói về cách dùng API Gateway để làm REST API với Lambda.
#Serverless #Series #Golang #Bài #Serverless #và #AWS #Lambda09 #tháng #lượt #xem #Golang #DevOps #AWS #Đầu #mục #bài #viếtBài #viết #liên #quanKhoá #học #hay
[rule_2_plain] #Serverless #Series #Golang #Bài #Serverless #và #AWS #Lambda09 #tháng #lượt #xem #Golang #DevOps #AWS #Đầu #mục #bài #viếtBài #viết #liên #quanKhoá #học #hay
[rule_2_plain] #Serverless #Series #Golang #Bài #Serverless #và #AWS #Lambda09 #tháng #lượt #xem #Golang #DevOps #AWS #Đầu #mục #bài #viếtBài #viết #liên #quanKhoá #học #hay
[rule_3_plain]

#Serverless #Series #Golang #Bài #Serverless #và #AWS #Lambda09 #tháng #lượt #xem #Golang #DevOps #AWS #Đầu #mục #bài #viếtBài #viết #liên #quanKhoá #học #hay
Tác giả: Huỳnh Minh Quân- giảng sư khóa học AWS : Learn AWS the Hard Way.
Xem các bài viết khác thuộc Series Serverless

Giới thiệu
Chào các bạn đến với series về Serverless. Bài trước tiên chúng ta sẽ mày mò về Serverless là gì, AWS Lambda là gì.
Serverless là 1 trong những mẫu hình tăng trưởng phần mềm trên cloud. Trước lúc ta mày mò về Serverless là gì, ta sẽ nói qua lúc ta tăng trưởng phần mềm trên cloud, cloud sẽ phân phối cho ta những mẫu hình tăng trưởng như thế nào.
Cloud models
Trên Cloud ta sẽ có 4 mẫu hình tăng trưởng như sau:

IaaS (Infrastructure as a Service)
PaaS (Platform as a Service)
CaaS (Container as a Service)
FaaS (Function as a Service)

Infrastructure as a Service
Đây là mẫu hình tầm thường nhất lúc ta sử dụng cloud, các bạn có thể đã sử dụng nó hàng ngày nhưng ta chẳng chú ý. Ở mẫu hình này nhà tăng trưởng Cloud sẽ exposes những API nhưng tương tác với virtualized platform bên dưới, như là API tương tác với máy ảo, API tương tác với storage, … Để ta có thể tự tạo và điều hành cơ sở vật chất của ta trên cloud. Tỉ dụ như là AWS Cloud exposes những API liên can đến EC2, cho phép ta tự tạo và điều hành EC2 của ta 1 cách dễ ợt bằng Web Console hoặc AWS CLI. Ở mẫu hình này thì ta sẽ tự tạo, và tự điều hành cơ sở vật chất của ta cũng như việc scale của nó.
Platform as a Service
Đây là 1 mẫu hình tăng trưởng nhưng cloud sẽ phân phối cho ta 1 Platform Framework để ta tăng trưởng phần mềm danh hơn. Tỉ dụ để khai triển 1 phần mềm web trên cloud, trước tiên ta phải tạo EC2 (máy ảo), xong rồi ta cấu hình security group để traffic có thể đi vào EC2 của ta, xong sau đấy ta deploy phần mềm trên EC2, và làm nhùng nhằng nhiều thứ nữa, thì các nhà tăng trưởng cloud sẽ phân phối cho ta các Platform để làm việc đấy tốc độ hơn. Tỉ dụ như AWS thì có AWS Elastic Beanstalk, là 1 Platform cho phép ta dễ ợt khai triển 1 phần mềm web, ta chỉ cần xài 3 cú click chuột dễ dàng trên Web Console là ta sẽ có được 1 phần mềm web, thay vì phải đi tạo và cấu hình nhùng nhằng nhiều thứ khác.
Container as a Service
Mẫu hình này thì dễ dàng là ta sẽ tăng trưởng phần mềm dựa trên container và có 1 tool để điều hành những container của chúng ta, tỉ dụ như là Kubernetes (các bạn có thể đọc series về Kubernetes của mình để hiểu hơn về mẫu hình CaaS). AWS có phân phối cho ta AWS EKS để tăng trưởng phần mềm trên mẫu hình CaaS.
Function as a Service
Chung cuộc và là cấp bé nhất, cloud cho phép ta tăng trưởng phần mềm chỉ dựa trên các Function, ta ko cần phải tạo và điều hành cơ sở vật chất phúc tạp gì hết, ta chỉ cần điều hành những function của chúng ta, và những function này có thể tự động auto scale nhưng ta ko cần phải cấu hình gì cả, đây chính là thành phần chính trong mẫu hình Serverless của chúng ta.
Serverless là gì
Từ trên ta có thể hiểu dễ dàng Serverless là mẫu hình tăng trưởng phần mềm trên cloud nhưng cho phép ta xây dựng và chạy applications của chúng ta 1 cách dễ ợt, nhưng ko cần điều hành server gì hết.

Ích lợi của mẫu hình Serverless
Đây là 4 ích lợi mình thấy của mẫu hình Serverless:

Giảm chi tiêu của việc điều hành và vận hành server, đây là công tác thường xuyên của DevOps, ta có thể giảm số lượng công tác nhưng DevOps cần phải làm. Như tạo, điều hành và monitor EC2.
Tự động scale và high-availability: FaaS của chúng ta sẽ tự động scale theo traffic, ta ko cần cấu hình gì nhiều, trừ lúc ta muốn nó scale theo 1 cách cụ thế nào đấy.
Tối ưu tiền sử dụng cloud: đối với cloud vần đề quan trọng nhất là tiền hàng tháng, lúc ta xài FaaS thì ta sẽ chỉ cần thanh toán cho từng function được trigger.
Cung cấp nhiều tiếng nói không giống nhau: ta có thể dùng nhiều tiếng nói không giống nhau để viết FaaS

Điểm yếu của mẫu hình Serverless
Thì cái nào có thế mạnh thì cũng có điểm yếu 😂, đây là những điểm yếu nhưng mình thấy ở mẫu hình Serverless:

Khó debug.
Cold starts: mất 1 khoảng thời kì nếu function được trigger lần trước tiên, hoặc function đấy ít lúc được request đến thì lúc nó chạy lại khá tốn thời kì.
Khó tổ chức source code: vì mỗi function sẽ được deploy riêng nên cách tổ chức source code sẽ khó hay dễ tùy thuộc vào tiếng nói không giống nhau.
Khó thiết kế môi trường dev local.

Serverless cloud providers
Thì 3 thằng cloud hiện nay nhưng tầm thường nhất là AWS, GCP, Azure. Từng thằng nó sẽ phân phối cho ta dịch vụ FaaS không giống nhau:

AWS thì phân phối cho ta AWS Lambda
Google Cloud thì có Google Cloud Functions
Azure thìa là Microsoft Azure Functions

Trong series này mình sẽ dùng AWS và AWS Lambda.
AWS Lambda
AWS Lambda là 1 service của AWS cho phép ta chạy và điều hành function. Đây là thành phần chính của mẫu hình Serverless. Ta sẽ viết code dưới máy local và deploy nó lên AWS Lambda để chạy. Ngoài AWS Lambda thì AWS còn phân phối cho ta 1 số dịch vụ như sau để xây dựng mẫu hình Serverless:

S3 ta dùng để lưu hình ảnh
API gateway để ta xây dựng REST API
DynamoDB cho database
Cognito dùng để Authentication
SQS phục vụ queue
SNS phục vụ notification (pub-sub)

AWS Lambda được thiết kế cho event-driven architecture, code của chúng ta sẽ được trigger dựa theo 1 event nào đấy, tỉ dụ là request của client đến API, tất cả các process trigger là độc lập vói nhau và ta chỉ thanh toán cho từng lần function được trigger và chạy. So sánh với EC2 thì ta phải thanh toán theo giờ, ngay cả lúc code trên EC2 của chúng ta ko xử lý request nào cho user cả thì ta vẫn tốn tiền trả, còn Lambda thì ko tương tự.
Source events
Trên AWS thì Lambda sẽ được trigger từ 1 số event của các service khác như sau:

Thiết kế REST API theo mẫu hình Serverless
Thì có nhiều phần mềm ta có thể thiết kế theo mẫu hình Serverless được, nhưng tầm thường nhất theo mình nghĩ có thể là dùng để xây dựng REST API và Single Page Application, mô chừng như sau:

Ta sẽ config Route 53 (service dùng để route DNS) chỉa đến CloudFront (Content Delivery Network serivce, dùng dể cache static content), CloudFront của ta sẽ cache nội dung từ S3 (nơi ta lưu Single Page Application, có thể là React – Angular – Vue). Lúc client tải nội dung từ Web Single Page Application thì trong phần mềm này ta sẽ gọi HTTP API đến API gateway (service dùng để xây dựng REST API và dẫn request đến Lambda). Lambda sẽ được trigger từ API gateway, Lambda chạy và kết mối đến DynamoDB, xử lý request và trả kết quả về cho client.
Các tiếng nói AWS Lambda cung cấp
Tại thời khắc mình viết bài này thì Lambda cung cấp các tiếng nói sau đây: Java, Go, PowerShell, Node. js, C#, Python, Đá quý. Nếu bạn muốn xài tiếng nói khác thì nó có phân phối Runtime API để bạn integrate với tiếng nói đấy. Ở trong series này mình sẽ viết bằng Golang, nếu các bạn muốn viết bằng NodeJS thì cứ comment nói mình sẽ viết cả 2 phần Golang và NodeJS.
Thì nói nhiều rồi, hiện giờ ta sẽ viết AWS Lambda trước tiên.
Hello Lambda
Để làm được series này, đề xuất bạn cần có AWS nick nhé. Và cần cài AWS CLI trên máy của bạn. Các bạn tuân theo chỉ dẫn này nha https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html.
Sau lúc cài xong thì bạn test bằng câu lệnh sau:

$ aws lambda list-functions

Tiếp theo là bạn cần cài Golang trên máy của mình. Các bạn tuân theo chỉ dẫn ở đây nha https://go.dev/doc/install.
Oke, sau lúc làm sau hết thì ta mở đầu vào việc viết Lambda function đầu tiền. Tạo 1 thư mục tên là hello-lambda và mở thư mục đấy ra. Bạn mở terminal ngay thư mục đấy và gõ:

$ go mod init hello-lambda
go: creating new go.mod: module hello-lambda
go: lớn add module requirements and sums:
$ go mod tidy

$ go get github.com/aws/aws-lambda-go/lambda
go get: added github.com/aws/aws-lambda-go v1.27.0

Tạo 1 file tên là main.go với đoạn code sau đây:

package main

import “github.com/aws/aws-lambda-go/lambda”

func handler() (string, error) {
return “Welcome lớn Serverless world”, nil
}

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

Ta sẽ viết 1 function tên là handler (ở đây bạn đặt tên gì cũng được) và dùng hàm lambda.Start(handler) để Lambda có thể chạy function trên. Tiếp theo ta sẽ build file main.go này thành binary file và zip nó lại thành 1 file zip để có thể upload được lên AWS Lambda. Maximun của file zip là 50MB nhé.

$ go build -o hello main.go
$ zip main.zip hello

Oke, ta đã sẵn sàng xong phần code. Hiện thời ta sẽ lên AWS tạo 1 Lambda và upload code của ta lên. Truy cập lên AWS Console và gõ Lambda vào khung kiếm tìm.

Này là UI của AWS Console lúc mình viết bài này, trong ngày mai có thể sẽ khác. Sau lúc vào Lambda thì bạn chuyển sang tab function và bấm create function. Chọn Author from scratch

Chỗ basic infomation ta nhập vào function name là hello-lambda và chọn runtime là Go 1.x

Sau đấy ta bấm create function. Sau lúc tạo xong thì ta sẽ thấy UI như sau:

Sau lúc tạo xong thì ta mở terminal ở thư mục nãy ta build file zip code, chạy câu lệnh sau:

$ aws lambda update-function-code –function-name hello-lambda –zip-file fileb://./main.zip

Oke, vậy là ta đã tạo được lambda function đầu tiền, để test được nó thì bạn chạy câu lệnh sau:

$ aws lambda invoke –function-name hello-lambda –region us-west-2 response.json
{
“StatusCode”: 200,
“ExecutedVersion”: “$LATEST”
}

Bạn mở file response.json lên là sẽ thấy kết quả được lưu là “Welcome lớn Serverless world”, vậy là ta đã chạy được AWS Lambda function trước tiên 😁.
Kết luận
Vậy là ta đã mày mò xong về mẫu hình Serverless và AWS lambda. Thiết kế phần mềm với mẫu hình Serverless sẽ giúp ta đỡ việc hơn trong việc điều hành server, và dùng AWS lambda sẽ tiết kiệm chi tiêu hơn so với việc sử dụng EC2. Nếu các bạn muốn mình tạo resource trên AWS bằng terraform thay vì web console thì comment ở dưới nhé. Nếu có thắc mắc hoặc cần giảng giải rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment. Mong các bạn theo dõi series của mình nhé 😆😁. Ở bài tiếp theo mình sẽ nói về cách dùng API Gateway để làm REST API với Lambda.

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai.

Back to top button