2020.05.08

AWS Lambda & Micro Framework Chalice

Chào các bạn, MEVN rất vui khi có thể chia sẻ các kiến thức về các kỹ năng, kiến thức lập trình… đến các bạn. Trong bài này, chúng tôi sẽ giới thiệu đến các bạn cách xây dựng một serverless microservice với AWS Lambda & Micro Framework Chalice.

Trước tiên, chúng tôi sẽ giới thiệu các kiến thức cơ bản trước khi hướng dẫn các bạn xây dựng và triển khai một microservice.

1/ Microservices (Còn được gọi là Microservice Architecture)

Là một kiểu thiết kế ứng dụng bằng cách chia ứng dụng thành tập hợp nhiều dịch vụ nhỏ (microservice), mỗi dịch vụ nhỏ sẽ đảm nhận một hoặc một nhóm chức năng. Các dịch vụ nhỏ này có thể được xây dựng từ các ngôn ngữ lập trình, framework giống hoặc khác nhau, có thể sử dụng chung hoặc riêng cơ sở dữ liệu và có thể đặt ở các server chung hoặc khác nhau… 

Nghe có vẻ phức tạp hơn là chúng ta xây dựng ứng dụng thành một khối duy nhất (monolithic applications) nhỉ? Nhưng tại sao có rất nhiều dự án đang sử dụng microservices? Và tại sao nó đã và đang trở thành một xu hướng phát triển phần mềm? Chúng ta sẽ cùng phân tích các đặc điểm nổi bật của microservices và để dễ dàng giải thích, hãy tưởng tượng laptop là ứng dụng nguyên khối và PC là ứng dụng microservices.

– Dễ kiểm tra và bảo trì hơn: đang xem phim thì màn hình đen thui, phím gõ không được, loa không nghe được… bạn sử dụng PC thì sẽ kiểm tra và xử lý dễ dàng hơn đúng không.

– Liên kết giữa các thành phần ứng dụng không quá chặt chẽ: bạn cần thay phím, bạn cần thêm ram… nếu là laptop, bạn sẽ gặp khó khăn hơn khi phải kiểm tra tính tương thích đúng hãng, đúng chuẩn, nhưng với PC thì sẽ dễ dàng hơn hẳn

– Triển khai và nâng cấp các dịch vụ nhỏ một cách độc lập: tôi chỉ đủ tiền mua cái PC mà không đủ tiền mua màn hình, được thôi, cứ mua đi, về gắn vô cái tivi xài đỡ cũng được. Tôi khoái cái game này quá, mà nó yêu cầu đồ họa quá cao, oh, nếu đủ tiền thì mua cái card VGA rời mà gắn vô, nhớ coi cái nguồn nữa nhé 🙂

Và còn một số lợi điểm khác nữa, như tuỳ mô hình kinh doanh của tổ chức mà ta sẽ ưu tiên phát triển dịch vụ nào trước, một ứng dụng lớn vẫn có thể được phát triển bởi các nhóm nhỏ và sẽ giúp tổ chức nâng cao nhiều kiến thức về kỹ thuật, dịch vụ.

Ngoài ưu điểm ra thì khi thực hiện microservices tất nhiên cũng có một vài khuyết điểm, và theo cá nhân mình nghĩ thì khuyết điểm lớn nhất đáng quan tâm đó là việc kiểm soát khi ứng dụng có quá nhiều dịch vụ nhỏ.

Các bạn tham khảo Corp Site của chúng tôi https://www.marketenterprise.vn/ để hiểu rõ hơn nhé, được chia ra khá nhiều dịch vụ nhỏ để tận dụng sức mạnh của từng framework/cms, giảm thiểu chi phí phát triển những chức năng không cần thiết và quan trọng đó là nâng cao kiến thức của các thành viên trong team. 

2/ AWS Lambda

Với một dịch vụ khi đưa vào sử dụng, chúng ta phải thực hiện và theo dõi các vấn đề liên quan đến server như: configuration, cpu, ram, scale… Nếu như ứng dụng chúng ta có hàng trăm dịch vụ nhỏ khác nhau thì chi phí chăm lo cho server sẽ là một vấn đề. Và AWS Lambda sẽ giúp bạn giải quyết vấn đề trên. Vậy AWS Lambda là gì?

AWS Lambda là một dịch vụ của Amazon hỗ trợ rất tốt cho việc xây dựng serverless microservices, công việc của bạn là develop, upload source code và tạo một function trên Lambda, mọi thứ còn lại hãy để Lambda lo.

Một dịch vụ sử dụng Lambda sẽ có 2 thành phần chính: function và event. Function chính là source code mà bạn upload lên, còn event là sự kiện mà khi xảy thì sẽ gọi tự động đến function thực hiện, có khá nhiều cách tạo event: khi một hình ảnh được đưa lên S3, dữ liệu thay đổi hay call đến một api nào đó…. 

Một số lưu ý khi bạn sử dụng Lambda: 

– Hiện tại ngôn ngữ mà AWS Lambda hỗ trợ là Java, NodeJS, Python.

– Lambda function và bucket phải có cùng region

Bạn có thể tham khảo thêm ở https://aws.amazon.com/lambda/

3/ Micro Framework Chalice

Được viết bởi ngôn ngữ Python, hỗ trợ rất tốt cho việc phát triển serverless microservices và deploy ứng dụng sau khi phát triển lên AWS Lambda.

– Cung cấp công cụ để tạo, deploy và quản lý bằng command line

– Có thư viện để tích hợp và các dịch vụ khác của Amazon: Amazon API Gateway, Amazon S3, Amazon SNS, Amazon SQS…

– Có sẵn chứng thực IAM tự động

Bạn có thể tham khảo thêm ở https://github.com/aws/chalice

Sau khi đã hiểu được các kiến thức cơ bản, chúng ta cùng nhau giải viết một vấn đề thực tiễn mà chúng tôi đã trải qua: Corp Site của chúng tôi có chức năng subscriber, nơi để ứng viên có thể gửi thông tin ứng tuyển đến công ty. Khi ứng viên gửi thông tin, làm sao để nhận biết và phản hồi nhanh đến các ứng viên? Chúng tôi đang sử dụng công cụ Slack để liên lạc trong công việc, nếu có thể gửi tin nhắn tự động đến Slack khi có ứng viên sử dụng chức năng subscribe thì vấn đề sẽ được giải quyết. Chúng tôi quyết định tạo một API (có thể xem là một dịch vụ) để gửi tin nhắn đến Slack với AWS Lambda và Micro Framework Chalice. (Các bạn kéo lên xem hình kiến trúc Corp Site nhé!). Nào, chúng ta bắt đầu thôi:

Cài đặt Chalice

– Trước tiên chúng ta sẽ phải cài Python lên máy của mình đã (team mình sử dụng docker):  https://www.python.org/downloads/

– Cài đặt một môi trường ảo

$ pip install virtualenv
$ virtualenv ~/.virtualenvs/chalice-demo
$ source ~/.virtualenvs/chalice-demo/bin/activate


– Cài đặt Chalice:

$ pip install chalice
$ chalice –help  // Kiểm tra lại kết quả cài đặt


Tạo ứng dụng với Chalice

$ chalice new-project api-slack-notification

Kết quả là sẽ tạo một thư mục api-slack-notification chứa 

– .chalice: bạn có thể sử dụng thư mục này để chứa các thông tin về credential của AWS mà không dùng tới file .env

– requirements.txt: file này sẽ chứa thông tin các package mà bạn muốn thêm vào chương trình

– app.py: file này là nơi để bạn code

Mở file requirements.txt để thêm package requests: requests == 2.22.0

Code thôi, hãy mở file app.py nào:

app = Chalice(app_name='notification')

@app.route('/', methods=['POST'])
def index():
    json_body = app.current_request.json_body
    channel = json_body.get('channel')
    data = json_body.get('data')
    result = push(channel, data)
    return result.text == 'ok'

def push(channel, data):
    params = json.dumps(data)
    result = requests.post(channel, data = params, headers = {'Content-Type': 'application/json'})

 

 

Sau khi hoàn thành việc develop, các bạn có 2 cách deploy: sử dụng command line của chalice hoặc sử dụng các công cụ hỗ trợ của Amazon. 

Hy vọng rằng, bài viết này sẽ giúp các bạn thêm một kiến thức để xử lý vấn đề trong khi phát triển ứng dụng.