Full Stack Developer

Aug. 29, 2020, midnight

AWS Lambda + API Gateway + S3 Tạo web đơn giản với server less

Giới thiệu về nền tảng

Trong công việc của các kỹ sư thiết kế website thì để đưa một ứng dụng web application đến được với người dùng cần phải thông qua rất nhiều bước deploy từ server cho đến cài đặt nginx hay apache ... . Tuy nhiên với những ứng dụng đơn giản và không yêu cầu xử lý quá nặng ở phần server chúng ta hoàn toàn có thể sử dụng server less để thay thế cho EC2 và Azure VM.

Và với hướng dẫn dưới đây, tôi sẽ hướng dẫn các bạn tạo một website đơn giản mà không cần sử dụng máy chủ.

Yêu cầu cần thiết.

Để bắt đầu với hướng dẫn này các bạn phải có account aws và có thể tạo được các services sau:


  1. AWS Lambda
  2. API Gateway
  3. S3 để lưu trữ HTML.

Tôi sẽ bỏ qua phần cài đặt và đi luôn vào chi tiết. ( Các bạn có thể dễ dàng cài đặt hoặc tìm kiếm các hướng dẫn config trên internet. )

1. Triển khai công cụ với AWS Lambda

Với server EC2 thì tôi đã từng viết python, Ruby, PHP, Nodejs Nhưng với lambda thì bạn có thể viết nó bằng python hoặc nodejs. Với hướng dẫn này tôi sẽ viết nó bằng python.

Với aws lambda hầu hết aws đã hỗ trợ cho bạn công cụ rất trực quan, bạn có thể dễ dàng deploy cũng như chỉnh sửa trực tiếp với những file đã tạo. Tuy nhiên với cấu trúc phức tạp hơn bạn nên triển khai deployment bằng tools. Đầu tiên chúng ta bắt đầu với hello world nhé.

Giao diện tạo lambda sẽ bắt đầu như thế này:

Chọn Create Function.

Tiếp theo các bạn đặt tên cho lambda và chọn ngôn ngữ cho lambda này.

Ở đây template helloworld đã được sau đó chỉ cần chọn ngôn ngữ, ở đây tôi sẽ tạo với python 3.7

testFunctionHelloWorld.py
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}

2. Cài đặt API Gateway

Tiếp theo, chúng ta cần cài đặt API Gateway để hàm lamda thực thi bởi HTTP REST API.

Chọn "API mới" từ "REST" trên màn hình cài đặt của API Gateway từ Bảng điều khiển AWS. Đặt tên API thích hợp.

Thêm cài đặt phương thức HTTP vào API REST đã tạo.


Hiện tại, tôi sẽ nhận nó bằng GET, vì vậy tôi đã thêm một phương thức GET.

Sau khi thêm phương thức GET, hãy chỉ định Hàm Lambda đã tạo trước đó làm điểm tích hợp.

Phương thức GET hiện được triển khai trên điểm cuối của bạn.

Bạn thực sự có thể kiểm tra hoạt động của API bằng cách nhấp vào TEST.

Theo kết quả của thử nghiệm, bạn có thể thấy rằng trạng thái: 200 = HTTP response được trả về bình thường và chuỗi ký tự của Hello World được chỉ định trong Lambda Function được trả về trong JSON.

Tiếp theo, triển khai API đã tạo và xuất bản URL mà bạn thực sự có thể truy cập. Từ hành động, giống như khi bạn tạo phương thức, lần này thực thi "Triển khai API".

Chọn môi trường triển khai (giai đoạn), nhưng không có gì lúc đầu, vì vậy hãy tạo một giai đoạn mới. Đặt nghệ danh thích hợp.

Ngoài ra, tôi đã tạo một môi trường testing ở đây và tách nó ra khỏi môi trường production

Triển khai đến giai đoạn testing, kiểm tra hoạt động, sau đó triển khai đến giai production.

Bạn có thể làm một cái gì đó như vậy


Bạn đang nghĩ ra!

Khi quá trình production hoàn tất, URL sẽ được cấp.

Nếu bạn nhấn URL này từ trình duyệt, bạn có thể thấy rằng Hàm lambda thực sự được thực thi từ API và Hello World được trả lại cho trình duyệt dưới dạng JSON. Bây giờ bạn đã hoàn thành một API REST với API Gateway.

3. Xử lý bất đồng bộ với Lambda

Chúng ta đã chuẩn bị API Getway nhưng có một vấn đề ở đây. Vơi lambda thực thi một yêu cầu chúng ta có thể cài đặt là từ 1 min đến 15 min. Nếu với một yêu cầu cần thời gian xử lý chúng ta có thể dễ dàng cài đặt với 5 min phía lambda, nhưng với API Getway, timeout là 29s.

Vì vậy với request từ API Getway, mặc dù đã gọi lambda thực thi nhiệm vụ nhưng khi hết 29s thì API Get way trả về lỗi timeout và thực thi kết thúc. 

Hmm. có vẻ đây là một vấn đề....

Có thể có nhiều giải pháp nhưng tôi lựa chọn giải pháp sau.


Đầu tiên hãy tạo một lambda function B thực hiện nhiệm vụ của lambda function A với bất đồng bộ. Với lambda function B sẽ thực thi nhiệm vụ bất đồng bộ và ngay lập tức trả kết quả về cho người gọi.

Dưới đây là một ví dụ nodejs đơn giản 

'use strict';
const FUNCTION_NAME = "HOGEHOGE";
const aws = require('aws-sdk');
aws.config.region = 'ap-northeast-1';
exports.handler = function (event, context, callback) {
var lambda = new aws.Lambda();
var params = {
FunctionName: FUNCTION_NAME,
InvokeArgs: JSON.stringify(event)
};
lambda.invokeAsync(params,function(err,data) {
if(err){
console.log(err);
context.done(err);
} else{
console.log(params);
console.log(data);
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true"
},
body: JSON.stringify({"message": "Execute async process done."})
};
context.done(null,response);
}
});
};

Ở phía API Getway, hãy gọi function B và function B gọi function A bất đồng bộ, ngay cả khi function A sẽ thực thi nhiệm vụ của function A hơn 29s, API get way vẫn nhận được response trả về từ lambda.

** Để triển khi chi tiết và cần thận, có thể bạn phải viết 1 lambda khác kiếm tra hoạt đồng của function A nhưng tôi sẽ bỏ qua phần này.

4. Lưu trữ HTML trên S3

Chúng ta đã hoàn thành hầu hết mọi công việc, Cuối cùng chúng ta cần một màn hình để hiển thị công cụ đã chuẩn bị, đây cũng chính là serverless.

Chúng ta sẽ tạo một screenshot HTML đơn giản chỉ chưa Javascript sử dụng ajax request đên API Get way. 

<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>API AJAX REQUEST</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {

var URL = "ここにAPI Gatewayの該当URL";

$("#submit").click(function() {
$("#submit").attr("disabled", "disabled");
$.ajax({
type: "GET",
url: URL,
dataType: "json",
error: function() {
alert('ERROR: EXE');
$("#submit").removeAttr("disabled");
},
success: function(res) {
alert('SUCCESS!');
$("#submit").removeAttr("disabled");
}
});
});
});
</script>
</head>
<body>
<div>
<h1>AJAX REQUEST</h1>
<div>
API Gatewayの該当エンドポイントにAjaxリクエスト(GET)を投げます。
</div>
<table border=0>
<tr>
<td></td>
<td><button id='submit'>実行</button></td>
</tr>
</table>
</div>
</body>
</HTML>

Bạn lưu nó dưới dạng index.html và upload nó lên S3, cài đặt các quyền thích hợp và publist nó.

Tất cả những gì bạn cần làm là lấy link S3 của nó.

Thêm nữa bạn có thể giới hạn nguồn IP và kết nối request đến S3 này.

Thời đại của công nghệ không máy chủ đang đến hay không ?

Có vẻ như AWS và các nhà khai thác đám mây đang đề xuất chính sách sử dụng PaaS và các dịch vụ được quản lý không sử dụng IaaS nhiều nhất có thể, bao gồm cả kiến ​​trúc không máy chủ.

Có nhiều ưu điểm khác nhau của serverless, nhưng với tư cách là một nhà phát triển (nhóm phát triển), tôi nghĩ điểm hấp dẫn nhất là việc có thể được tập trung vào ứng dụng.

Trong thời đại hiện nay, để tạo ra một dịch vụ Web, từ phần cơ sở hạ tầng, đã có rất nhiều nhiệm vụ phát triển trước ứng dụng bao gồm mạng, hệ điều hành, phần mềm trung gian và thiết lập máy chủ.

Tuy nhiên, khi IaaS trở nên khả dụng, các lớp bên dưới HĐH trở nên không cần thiết. Các vấn đề như phần mềm trung gian, hỗ trợ bảo mật (các bản vá như OS) và đảm bảo tính dự phòng vẫn là các nhiệm vụ vẫn được triển khai.

Giờ đây, với sự ra đời của các dịch vụ được quản lý (kiến trúc không máy chủ), nhiệm vụ của các nhà phát triển (nhóm) có thể được tập trung vào các ứng dụng gần 90%. Bạn không cần phải suy nghĩ về phần mềm trung gian cho các dịch vụ không có máy chủ hoặc được quản lý, và dự phòng được cung cấp ở dạng bảo mật. Đối với AWS Lambda hay bất cứ thứ gì, tất cả những gì bạn cần làm là phân bổ Vùng sẵn sàng được thực thi dư thừa.

Tất nhiên, điều quan trọng là phải nghĩ rằng serverless không phù hợp với bất cứ thứ gì, nhưng tôi nghĩ rằng không có gì mất mát bằng cách tích cực sử dụng nơi có thể áp dụng các dịch vụ không có máy chủ hoặc được quản lý.

Rốt cuộc, nếu bạn sử dụng IaaS, bạn sẽ thua.

Khuyến khích người viết

Bằng cách chia sẻ bài viết của :Jack.

0
Full Stack Developer

Aug. 29, 2020, midnight

0 Comment

Register for News