Nâng cấp và chuyển ứng dụng web sang AWS Serverless: Phần 1

by Marcia Villalba | ngày 14 tháng 9 năm 2022 | trong  Amazon Cognito, Amazon Simple Storage Service (S3), AWS Amplify, AWS Lambda, Serverless | Permalink |  Share

Khách hàng di chuyển lên đám mây thường muốn hưởng lợi từ kiến trúc serverless. Nhưng phương pháp tốt nhất là gì và liệu có thể thực hiện được không? Có nhiều chiến lược để thực hiện một cuộc di chuyển, nhưng lift and shift thường là cách nhanh nhất để đưa khối lượng công việc đã di chuyển vào sản xuất.

Bạn cũng có thể tự hỏi liệu có thể lift and shift một ứng dụng hiện có chạy trong môi trường truyền thống sang serverless hay không. Bài viết này sẽ chỉ cho bạn cách thực hiện điều này cho một ứng dụng web sử dụng Mongo, Express, React, và Node.js (MERN) stack. Tuy nhiên, các cuộc thảo luận trong bài viết này cũng áp dụng cho các stack khác.

Cũng đọc: Nâng cấp và chuyển ứng dụng web sang AWS Serverless: Phần 2.

Tại sao nên thực hiện di chuyển Lift and Shift?

Lift and shift, hay đôi khi được gọi là tái triển khai (rehosting) ứng dụng, là việc di chuyển ứng dụng với ít thay đổi nhất có thể. Di chuyển Lift and Shift thường cho phép bạn đưa khối lượng công việc mới vào sản xuất nhanh nhất có thể. Khi di chuyển sang môi trường serverless, Lift and Shift có thể mang một khối lượng công việc chưa nằm trong đám mây hoặc trong môi trường serverless để sử dụng các dịch vụ được quản lý và serverless nhanh chóng.

Di chuyển một khối lượng công việc không phải serverless sang serverless với Lift and Shift có thể không mang lại tất cả các lợi ích của serverless ngay lập tức, nhưng nó cho phép đội ngũ phát triển tái cấu trúc, sử dụng mô hình strangler, các phần của ứng dụng có thể hưởng lợi từ những gì công nghệ serverless mang lại.

Tại sao nên di chuyển ứng dụng web sang serverless?

Các ứng dụng web được lưu trữ trong môi trường serverless hưởng lợi nhiều nhất từ khả năng tự động mở rộng và chỉ trả tiền cho những gì bạn sử dụng của các ứng dụng serverless.

Hãy tưởng tượng bạn có một ứng dụng web cá nhân với lượng truy cập ít. Nếu bạn đang lưu trữ trong môi trường serverless, bạn không phải trả một khoản phí cố định để duy trì các máy chủ hoạt động. Ứng dụng web của bạn chỉ có vài yêu cầu và phần lớn thời gian là không hoạt động.

Lợi ích này cũng áp dụng cho trường hợp ngược lại. Đối với chủ sở hữu của một trang web thương mại điện tử nhỏ chạy trên một máy chủ, hãy tưởng tượng nếu một người có ảnh hưởng trên mạng xã hội với hàng triệu người theo dõi giới thiệu một trong những sản phẩm của họ. Đột nhiên, hàng nghìn yêu cầu đổ về và làm cho trang web không khả dụng. Nếu trang web được lưu trữ trên nền tảng serverless, ứng dụng sẽ tự động mở rộng để đáp ứng lưu lượng truy cập mà nó nhận được.

Yêu cầu cho quá trình di chuyển

Trước khi bắt đầu quá trình di chuyển, việc xác định các yêu cầu phi chức năng mà ứng dụng mới cần phải có là rất quan trọng. Những yêu cầu này sẽ giúp bạn khi phải đưa ra các quyết định kiến trúc trong quá trình di chuyển.

Dưới đây là các yêu cầu phi chức năng của quá trình di chuyển này:

  • Môi trường có khả năng tự động mở rộng đến mức tối thiểu và tự động mở rộng lên khi cần.
  • Thanh toán chi phí ít nhất có thể cho thời gian không hoạt động.
  • Cấu hình hạ tầng ít nhất có thể.
  • Tự động đảm bảo tính sẵn sàng cao của ứng dụng.
  • Thay đổi tối thiểu đối với mã nguồn gốc.

Tổng quan về ứng dụng
Bài viết blog này hướng dẫn bạn cách di chuyển một ứng dụng MERN. Ứng dụng gốc được lưu trữ trên hai máy chủ khác nhau: Một chứa cơ sở dữ liệu Mongo và một chứa các ứng dụng Node.js/Express và ReactJS.

Ứng dụng demo này mô phỏng một trang web thương mại điện tử bán hàng swag. Lớp cơ sở dữ liệu lưu trữ các sản phẩm, người dùng và lịch sử mua hàng. Lớp máy chủ xử lý logic kinh doanh thương mại điện tử, lưu trữ hình ảnh sản phẩm, và xác thực và ủy quyền người dùng. Lớp web đảm nhận tất cả các tương tác người dùng và giao tiếp với lớp máy chủ thông qua REST APIs.

Đây là những thay đổi bạn phải thực hiện để di chuyển sang môi trường serverless:

  • Di chuyển cơ sở dữ liệu: Di chuyển cơ sở dữ liệu từ tại chỗ sang MongoDB Atlas.
  • Di chuyển phần cuối: Di chuyển ứng dụng NodeJS/Express từ tại chỗ sang chức năng AWS Lambda.
  • Di chuyển ứng dụng web: Di chuyển ứng dụng web React từ tại chỗ sang AWS Amplify.
  • Di chuyển xác thực: Di chuyển xác thực được xây dựng tùy chỉnh để sử dụng Amazon Cognito.
  • Di chuyển bộ nhớ: Di chuyển bộ nhớ hình ảnh cục bộ để sử dụng Amazon S3Amazon CloudFront.

Hình ảnh sau đây hiển thị giải pháp được đề xuất cho ứng dụng được di chuyển:

Chuyển đổi cơ sở dữ liệu
Cơ sở dữ liệu hiện đã có trong một container MongoDB vanilla chứa tất cả dữ liệu cho ứng dụng này. Vì MongoDB là engine cơ sở dữ liệu cho stack của chúng ta, giải pháp khuyến nghị của họ để di chuyển sang serverless là sử dụng MongoDB Atlas. Atlas cung cấp một cluster cơ sở dữ liệu trên đám mây, tự động mở rộng và bạn chỉ phải trả tiền cho những gì bạn sử dụng.

Để bắt đầu, tạo một cluster Atlas mới, sau đó di chuyển dữ liệu từ cơ sở dữ liệu hiện có sang cơ sở dữ liệu serverless. Để di chuyển dữ liệu, bạn có thể đầu tiên dump tất cả nội dung của cơ sở dữ liệu vào một thư mục dump và sau đó restore nó lên đám mây.

mongodump --uri="mongodb://<localuser>:<localpassword>@localhost:27017"

mongorestore --uri="mongodb+srv://<user>:<password>@<clustername>.debkm.mongodb.net" .

Sau khi thực hiện điều đó, dữ liệu của bạn hiện đang ở trên đám mây. Bước tiếp theo là thay đổi chuỗi cấu hình trong máy chủ để trỏ đến cơ sở dữ liệu mới. Để thấy điều này trong thực tế, hãy xem video này, hướng dẫn chi tiết về quá trình di chuyển.

Di chuyển Backend

Di chuyển backend Node.js/Express là một trong những lớp khó khăn nhất để di chuyển sang môi trường serverless, vì lớp máy chủ là một ứng dụng Node.js chạy trên máy chủ.

Một lựa chọn cho việc di chuyển này là sử dụng AWS Fargate. Fargate là một dịch vụ container serverless cho phép bạn tự động mở rộng quy mô và bạn chỉ phải trả tiền khi sử dụng. Một lựa chọn khác là sử dụng AWS AppRunner, một dịch vụ container tự động mở rộng quy mô và bạn cũng chỉ trả tiền khi sử dụng. Tuy nhiên, không có lựa chọn nào trong số này phù hợp với yêu cầu di chuyển của chúng tôi, vì chúng không mở rộng quy mô về 0.

Một lựa chọn khác cho việc di chuyển “lift and shift” của ứng dụng Node.js này là sử dụng Lambda với AWS Lambda Web Adapter. AWS Lambda Web Adapter là một dự án mã nguồn mở cho phép bạn xây dựng các ứng dụng web với các framework quen thuộc như Express.js, Flask, SpringBoot và chạy nó trên Lambda. Bạn có thể tìm hiểu thêm về dự án này trong GitHub của nó.

Khi sử dụng dự án này, bạn có thể tạo hàm Lambda mới có ứng dụng Express/NodeJS làm mã hàm. Bạn có thể nâng và chuyển tất cả mã vào hàm. Nếu bạn muốn có hướng dẫn từng bước về cách thực hiện việc này, hãy xem video này.

const lambdaAdapterFunction = new Function(this,`${props.stage}-LambdaAdapterFunction`,

            {

                runtime: Runtime.NODEJS_16_X,

                code: Code.fromAsset('backend-app'),

                handler: 'run.sh',

                environment: {

                    AWS_LAMBDA_EXEC_WRAPPER: '/opt/bootstrap',

                    REGION: this.region,

                    ASYNC_INIT: 'true',

                },

                memorySize: 1024,

                layers: [layerLambdaAdapter],

                timeout: Duration.seconds(2),

                tracing: Tracing.ACTIVE,

            }

        );

Bước tiếp theo là tạo một HTTP endpoint cho ứng dụng server. Có ba lựa chọn để thực hiện điều này: API Gateway, Application Load Balancer (ALB) hoặc sử dụng Lambda Function URLs. Tất cả các lựa chọn này đều tương thích với Lambda Web Adapter và có thể giải quyết thách thức cho bạn.

Đối với bản demo này, chọn Function URLs, vì chúng dễ cấu hình và một Function URL sẽ chuyển tiếp tất cả các route tới server Express. API Gateway và ALB yêu cầu cấu hình nhiều hơn và có chi phí riêng, trong khi chi phí của Function URLs đã được bao gồm trong Lambda function.

Di chuyển ứng dụng web
Lớp cuối cùng để di chuyển là ứng dụng React. Cách tốt nhất để di chuyển lớp web và tuân thủ các yêu cầu di chuyển là sử dụng AWS Amplify để lưu trữ nó. AWS Amplify là một dịch vụ quản lý hoàn toàn cung cấp nhiều tính năng như lưu trữ ứng dụng web và quản lý quá trình CICD cho ứng dụng web. Nó cung cấp các thư viện client để kết nối với các tài nguyên khác nhau của AWS và nhiều tính năng khác.

Di chuyển ứng dụng React đơn giản như tạo một ứng dụng Amplify mới trong tài khoản AWS của bạn và tải ứng dụng React lên một kho mã nguồn như GitHub. Ứng dụng AWS Amplify này được kết nối với một nhánh GitHub, và khi có commit mới trong nhánh này, AWS Amplify sẽ triển khai lại mã.

Ứng dụng Amplify nhận các tham số cấu hình như Function URL endpoint (URL của server) bằng cách sử dụng các biến môi trường.

const amplifyApp = new App(this, `${props.stage}-AmplifyReactShopApp`, {

            sourceCodeProvider: new GitHubSourceCodeProvider({

                owner: config.frontend.owner,

                repository: config.frontend.repository_name,

                oauthToken: SecretValue.secretsManager('github-token'),

            }),

            environmentVariables: {

                REGION: this.region,

                SERVER_URL: props.serverURL,

            },

        });

Nếu muốn xem hướng dẫn từng bước về cách làm cho lớp web của bạn serverless, bạn có thể xem video này.

Bước tiếp theo

Tuy nhiên, nếu kiểm tra ứng dụng đã di chuyển này, bạn sẽ thấy hai vấn đề. Đầu tiên là phiên người dùng không bị dính. Mỗi lần đăng nhập, bạn lại bị đăng xuất khỏi ứng dụng một cách bất ngờ. Thứ hai là khi bạn tạo sản phẩm mới bạn không thể upload hình ảnh mới của sản phẩm đó lên.

Trong phần hai, tôi phân tích chi tiết từng vấn đề và tìm ra giải pháp. Những vấn đề này phát sinh do đặc điểm không trạng thái và bất biến của giải pháp này. Phần tiếp theo của bài viết này giải thích cách giải quyết những vấn đề này, đồng thời phân tích chi phí và hiệu suất của giải pháp.

Phần kết luận

Trong bài viết này, bạn sẽ tìm hiểu xem liệu có thể di chuyển một ứng dụng web serverless sang môi trường serverless mà không cần thay đổi nhiều mã hay không. Bạn tìm hiểu các công cụ khác nhau có thể trợ giúp bạn trong quá trình này, như AWS Lambda Web Adapter và AWS Amplify.

Nếu bạn muốn xem quá trình di chuyển đang diễn ra và tìm hiểu tất cả các bước thực hiện việc này thì có một danh sách phát chứa tất cả các hướng dẫn để bạn làm theo và tìm hiểu cách thực hiện được điều này. Đọc phần 2 ngay bây giờ.

Để biết thêm tài nguyên học tập serverless, hãy truy cập Serverless Land.

TAGS: serverless

Leave a comment