Keyring_aws mysql

Có rất nhiều cách để phát triển ứng dụng Nodejs, dù trên Cloud hay hạ tầng vật lý (on-premise). Tuy nhiên, phát triển ứng dụng ở đâu và như thế nào là điều chúng ta quan tâm. Ngoài ra, bảo mật cũng là một khía cạnh quan trọng mà nếu bỏ qua, ứng dụng của bạn sẽ không tồn tại lâu dài được và sẽ luôn có khả năng cao các thông tin quan trọng sẽ được tiết lộ cho người bên ngoài

Do đó, bài viết này sẽ hướng dẫn bạn từng bước để phát triển một ứng dụng Nodejs trên AWS một cách đầy đủ nhất, đưa ứng dụng lên máy chủ bằng cách sử dụng Docker container, RDS Amazon Aurora, Nginx với HTTPS và truy cập vào ứng dụng

1. ngăn xếp công cụ

Ứng dụng mẫu Nodejs

Một ứng dụng mẫu Nodejs với 3 API viz, status, insert và list. Các API này sẽ được sử dụng để kiểm tra trạng thái của ứng dụng, đưa dữ liệu vào cơ sở dữ liệu và cho phép gửi và hiển thị dữ liệu từ cơ sở dữ liệu

Phiên bản AWS EC2

Một phiên bản AWS EC2 được chạy trên hệ điều hành Ubuntu 20. 04 LTS được sử dụng để phát triển ứng dụng Nodejs được đóng gói (containerized). Ta sẽ tải Docker trong trường hợp này, đặt bên trên các vùng chứa sẽ được tạo ra sau. Chúng ta cũng sẽ tải MySQL Client vào instance. Máy khách MySQL yêu cầu kết nối với Phiên bản Aurora để tạo một bảng bắt buộc

AWS RDS Amazon Aurora

Dữ liệu của bạn sẽ được lưu trữ tại AWS RDS Amazon Aurora. Ta sẽ lưu trữ các trường cơ bản như tên người dùng (tên người dùng), email-id và tuổi

Amazon Aurora là một hệ thống cơ sở dữ liệu liên kết dưới dạng MySQL và PostgreSQL trên AWS

docker

Docker là một nền tảng được đóng gói (containerization) để xây dựng các Docker Images, khai thác chúng qua các container. Ta sẽ phát triển ứng dụng Nodejs trên server, Nginx, và Certbot là Docker Containers

Docker-Soạn thư

Để code các container Nodejs, Nginx hay Certbot, ta sử dụng Docker-Compose. Docker Compose giúp giảm thời gian phát triển container và quản lý thời gian tốt hơn

Nginx

Nginx được sử dụng để kích hoạt HTTPS cho ứng dụng mẫu Nodejs, điều hướng mọi yêu cầu từ người dùng tới ứng dụng Nodejs. Nó hoạt động như một proxy ngược được sử dụng để điều hướng yêu cầu của người dùng tới ứng dụng, đồng thời hỗ trợ bảo mật trong kết nối bằng việc cung cấp cấu hình để kích hoạt SSL/HTTPS

Chứng chỉ

Certbot cho phép chúng ta tự động sử dụng Let’s Encrypt để xác thực tên miền (xác thực miền – DV) và đạt chứng chỉ SSL

Miền

Ở phần cuối của tài liệu, bạn sẽ được truy cập vào ứng dụng mẫu Nodejs, sử dụng tên miền của bạn trên HTTPS, ví dụ, ứng dụng mẫu Nodejs của bạn sẽ được bảo mật trên Internet

Người phát thơ

Ta sẽ sử dụng Postman để kiểm tra các API như kiểm tra trạng thái, chèn dữ liệu, liệt kê dữ liệu từ cơ sở dữ liệu

Như đã nói ở trên, ta sẽ “triển khai một ứng dụng Nodejs trên AWS… đưa ứng dụng lên máy chủ sử dụng Docker container, RDS Amazon Aurora, Nginx với HTTPS và truy cập vào ứng dụng bằng tên miền (tên miền). ” Đầu tiên, ta sẽ cùng tìm hiểu về các tầng hạ kiến ​​trúc trước khi bắt tay thực hiện

Keyring_aws mysql
Keyring_aws mysql

2. Kiến trúc. Triển khai ứng dụng Nodejs lên máy chủ qua Docker container, RDS Amazon Aurora, Nginx với HTTPS, truy cập qua tên miền

Triển khai ứng dụng Nodejs lên phiên bản EC2 bằng Docker sẽ khả dụng trên cổng 3000. Ứng dụng mẫu Nodejs này sẽ truy xuất dữ liệu từ phiên bản RDS Amazon Aurora được tạo ra từ các VPC tương tự như trên phiên bản EC2. Một phiên bản Amazon Aurora DB sẽ được bảo mật và được truy cập trong cùng một VPC. Ứng dụng Nodejs được phát triển khai trên phiên bản EC2 có thể được truy cập bằng cách sử dụng IP công khai trên cổng 3000, tuy nhiên chúng tôi sẽ không làm như vậy

Truy cập vào các ứng dụng trên cổng không chuẩn là điều kiện không khuyến khích, liệu chúng ta sẽ có Nginx được vận hành như một proxy dự trữ, kích hoạt cổng SSL. Người dùng sẽ cố gắng truy cập vào ứng dụng bằng cách sử dụng tên miền và các yêu cầu này sẽ được chuyển sang Nginx. Nginx sẽ kiểm tra yêu cầu dựa trên API, rồi chuyển yêu cầu đó cho ứng dụng Nodejs. Yêu cầu này sẽ dừng lại với SSL, đánh dấu cho kết quả làm việc giữa máy khách và máy chủ khi đã được bảo mật hoàn toàn

Dưới đây là sơ đồ kiến ​​trúc hạ tầng giúp ta hình dung về cách phát triển khai thác ứng dụng Nodejs trên AWS

Keyring_aws mysql
Keyring_aws mysql

3. Điều kiện tiên quyết

Trước khi ta bắt tay vào phát triển ứng dụng Nodejs trên AWS, hãy đảm bảo rằng ta đã hoàn thành các điều kiện đầu tiên được giải quyết dưới đây

  1. Có một tài khoản AWS
  2. Có PostMan hoặc phần mềm thay thế cho máy để kiểm tra API
  3. Một tên miền đã đăng ký được khai báo trên tài khoản AWS

4. Tạo Ubuntu 20. 04 Phiên bản LTS EC2 trên AWS

Truy cập vào trang web https. //AWS. amazon. com/console/ and login to your account

Sau khi đăng nhập thành công, nhấn vào thanh tìm kiếm và nhập EC2. Nhấp vào kết quả để truy cập bảng điều khiển của EC2 và bắt đầu tạo một phiên bản EC2

Keyring_aws mysql
Keyring_aws mysql

Tại đây, nhấn vào “Khởi chạy phiên bản” để cấu hình và tạo một phiên bản EC2

Keyring_aws mysql
Keyring_aws mysql

Chọn AMI “Máy chủ Ubuntu 20. 04 LTS”

Keyring_aws mysql
Keyring_aws mysql

Chúng tôi khuyên bạn nên chọn t3. small for the own test, it will enough 2 CPUs and 2GB RAM. You can choose the instance tùy chọn theo nhu cầu

Keyring_aws mysql
Keyring_aws mysql

Bạn có thể giữ cài đặt sẵn có và tiếp tục khai thác. Tại đây, tôi đã chọn VPC mặc định, nếu muốn bạn có thể chọn VPC khác. Ghi nhớ rằng, ở đây chúng ta sẽ tạo một instance trên Public Subnet

Keyring_aws mysql
Keyring_aws mysql

Tốt nhất, bạn nên chọn dung lượng lớn hơn khoảng 30GB. The other section can be default

Keyring_aws mysql
Keyring_aws mysql

Chọn các thẻ như “Tên” “Môi trường” tùy theo lựa chọn của bạn. Bạn cũng có thể bỏ qua phần này

Keyring_aws mysql
Keyring_aws mysql

Cho phép kết nối tới cổng 22 chỉ qua IP của bạn. Nếu bạn cho phép kết nối từ 0. 0. 0. 0/0. , ví dụ của bạn sẽ được truy cập bởi bất kỳ ai qua cổng 22

Keyring_aws mysql
Keyring_aws mysql

Kiểm tra lại cấu hình, sau đó nhấn vào “Khởi chạy” nếu bạn thấy mọi thứ đã sẵn sàng để tạo một phiên bản

Keyring_aws mysql
Keyring_aws mysql

Trước khi một phiên bản được tạo ra, nó cần một cặp khóa. Bạn có thể tạo một cặp khóa mới hoặc sử dụng một cặp khóa có sẵn. Click vào “Launch instance” để bắt đầu bước khởi tạo một instance

Keyring_aws mysql
Keyring_aws mysql

Truy cập bảng điều khiển và kiểm tra phiên bản của bạn. Nhấp vào nút “Xem phiên bản”

Tại đây, bạn có thể thấy instance đã được tạo và đang trong giai đoạn “Initiating”. Trong khoảng 1-2 phút, bạn sẽ thấy phiên bản bắt đầu chạy

Trong khoảng thời gian đó, ta sẽ cùng tạo một phiên bản RDS nhé

Keyring_aws mysql
Keyring_aws mysql

5. Tạo RDS Aurora với MySql Instance trên AWS

Một lần nữa, nhấn vào thanh tìm kiếm ở đầu trang, và lần này chúng ta sẽ tìm “RDS”. Click vào kết quả để truy cập vào bảng điều khiển của RDS

Keyring_aws mysql
Keyring_aws mysql

Tại trang chủ của RDS, nhấn vào “Tạo cơ sở dữ liệu” để cấu hình và tạo một phiên bản RDS

Keyring_aws mysql
Keyring_aws mysql

Chọn “Easy create” cho phương thức, “Amazon Aurora” cho loại công cụ, “Dev/Test” cho kích thước phiên bản DB

Keyring_aws mysql
Keyring_aws mysql

Kéo xuống một chút và chọn “Số nhận dạng cụm DB” như “my-Nodejs-database”. Bạn có thể đặt một tùy chọn tên khác, khi nó chỉ là cái tên được gán cho phiên bản RDS. Tuy nhiên, ta nên sử dụng cái tên trùng nhau để không lộn xộn trong các bước sau đó

Đồng thời, đặt tên người dùng chính là “admin”, cài đặt mật khẩu, rồi nhấn vào “Tạo cơ sở dữ liệu”

Đây là bước quyết định đầu tiên để tạo ra một phiên bản RDS Amazon Aurora. Lưu ý rằng trên môi trường production và live thì bạn không được đặt tên người dùng và mật khẩu đơn giản

Keyring_aws mysql
Keyring_aws mysql

Tại đây, bạn có thể thấy instance đang trong quá trình “khởi tạo”. Trong vòng 5-10 phút tới, instance will run

Keyring_aws mysql
Keyring_aws mysql

Tại đây, ta cần lưu ý

  • Phiên bản RDS Amazon Aurora sẽ ở trạng thái riêng tư theo mặc định, có nghĩa là ta không thể truy cập nó từ bên ngoài mà chỉ ở bên trong VPC
  • Phiên bản EC2 và phiên bản RDS thuộc về một VPC chung
  • Phiên bản RDS có thể tiếp cận với phiên bản EC2

6. Cài đặt phụ thuộc trên EC2 Instance

Bây giờ, bạn có thể kết nối với Instance mà bạn vừa tạo ra.  

Máy khách MySql

Ta sẽ cần một ứng dụng khách MySQL để kết nối với phiên bản RDS Amazon Aurora và tạo cơ sở dữ liệu bên trong nó. Kết nối với phiên bản EC2 và thực hiện các lệnh từ đó

  1. cập nhật sudo apt
  2. sudo apt cài đặt mysql-client

Tạo bảng

Ta cần có một bảng trong phiên bản RDS Amazon Aurora để lưu trữ dữ liệu từ các ứng dụng. Để tạo bảng, hãy kết nối với phiên bản RDS Amazon Aurora bằng cách sử dụng máy chủ MySQL mà bạn đã tải xuống phiên bản EC2 ở bước đầu tiên

Sao chép Điểm cuối cơ sở dữ liệu từ phiên bản Amazon Aurora

Keyring_aws mysql
Keyring_aws mysql

Thi hành lệnh tiếp theo với giá trị chính

  1. mysql -u -p -h

Sau đó, lệnh của bạn sẽ xuất hiện như sau

  1. mysql -u admin -padmin1234 -h cơ sở dữ liệu my-Nodejs. cụm-cxxjkzcl1hwb. eu-tây-3. số thứ tự. amazonAWS. com

Một khi bạn đã kết nối với phiên bản Amazon RDS Aurora, hãy thực hiện tiếp các lệnh sao để tạo một bảng có tên “người dùng”

hiển thị cơ sở dữ liệu;

dùng chính;

TẠO BẢNG NẾU KHÔNG TỒN TẠI người dùng(id int NOT NULL AUTO_INCREMENT, tên người dùng varchar(30), email varchar(255), age int, PRIMARY KEY(id));

chọn * từ người dùng;

Bạn có thể nhìn vào ảnh chụp màn hình bên dưới để xem các lệnh đã chạy thế nào

Keyring_aws mysql
Keyring_aws mysql

Tạo đường dẫn thư mục ứng dụng (Application Directory)

Bây giờ chúng ta sẽ tạo một đường dẫn có thể giúp ta lưu trữ codebase và các tệp cấu hình

  1. pwd
  2. cd /home/ubuntu/
  3. mkdir Nodejs-docker
  4. cd Nodejs-docker

Sao chép kho lưu trữ phần mã trên phiên bản EC2

Clone phần Github Repository đang chứa toàn bộ code của bạn. Đây là một bước không bắt buộc. Nếu bạn đã sao chép toàn bộ tệp từ kho lưu trữ sang thư mục ứng dụng, bạn không cần phải tạo thêm tệp trong các bước sau nữa. Tuy nhiên, bạn vẫn cần tạo một số thay đổi nhất định

  1. pwd
  2. cd /home/ubuntu/
  3. bản sao git https. //github. com/shivalkarrahul/DevOps. git
  4. cp /home/ubuntu/DevOps/AWS/Nodejs-docker/* /home/ubuntu/Nodejs-docker

7. Triển khai ứng dụng Deploy Nodejs trên phiên bản AWS EC2 sử dụng Docker container, RDS Amazon Aurora, Nginx with HTTPS và truy cập ứng dụng qua tên miền

Tại sao cần sử dụng Docker trên phiên bản EC2?

Docker là một công cụ được đóng gói (containerization) để đóng các gói phần mềm trở thành “hình ảnh” có thể sử dụng để tạo các container Docker. Docker giúp ta tạo lập, chia sẻ và khai thác các ứng dụng một cách dễ dàng

Bước đầu tiên để “Docker hóa” chính là tải Docker

Tải Docker

  1. Kiểm tra phiên bản Linux hiện tại

mèo/etc/vấn đề

  1. Cập nhật chỉ mục gói apt

sudo apt-get cập nhật

  1. Tải các gói cho phép apt sử dụng kho lưu trữ trên HTTPS

sudo apt-get cài đặt apt-transport-https ca-chứng chỉ curl gnupg lsb-release

  1. Add key GPG of Docker

cuộn tròn -fsSL https. //Tải xuống. người đóng tàu. com/linux/ubuntu/gpg. sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring. gpg

  1. Thiết lập cho kho lưu trữ ổn định

echo “deb [arch=amd64 được ký bởi=/usr/share/keyrings/docker-archive-keyring. gpg] https. //Tải xuống. người đóng tàu. com/linux/ubuntu  $(lsb_release -cs) ổn định”. sudo tee /etc/apt/sources. danh sách. d/docker. danh sách > /dev/null

  1. Cập nhật chỉ mục gói apt

sudo apt-get cập nhật

  1. Tải về phiên bản mới nhất của Docker Engine và containerd

sudo apt-get cài đặt docker-ce docker-ce-cli containerd. io

  1. Kiểm tra phiên bản Docker hiện tại

docker-version

  1. Quản lý Docker với tư cách là người dùng không root
    1. Tạo nhóm 'docker'

sudo groupadd docker

  1. Thêm người dùng vào docker nhóm

sudo usermod -aG docker

  1. Thoát

lối ra

  1. Đăng nhập lại vào terminal
  2. Xác thực việc bạn có thể chạy lệnh docker mà không cần sudo

docker chạy hello-world

  1. Sau khi chạy các lệnh ở trên, bạn sẽ thấy đầu ra như hình bên dưới

Keyring_aws mysql
Keyring_aws mysql

  1. Dưới đây là màn hình sau khi các lệnh ở trên được chạy

Keyring_aws mysql
Keyring_aws mysql

Docker hóa ứng dụng Nodejs trên phiên bản EC2

Sau khi tải về Docker, bước tiếp theo bạn cần ứng dụng “docker hóa” của bạn. Docker hóa một ứng dụng Nodejs có thể hiểu là viết một Dockerfile theo hướng dẫn để tạo một Docker Image

Ta sẽ cùng tạo một Dockerfile và một ví dụ mẫu cho ứng dụng Nodejs

  1. pwd
  2. cd /home/ubuntu/Nodejs-docker
  3. Tạo Dockerfile và dán đoạn sau vào đó, ngoài ra, bạn cũng có thể sao chép nội dung từ đây

vim Dockerfile

# Nút hình ảnh cơ sở. 12. 18. 4-núi cao

TỪ nút. 12. 18. 4-núi cao

# Đặt thư mục làm việc thành /app

WORKDIR / ứng dụng

#Đặt ĐƯỜNG /app/node_modules/. thùng rác

ĐƯỜNG ENV /ứng dụng/node_modules/. thùng rác. $PATH

#Sao chép gói. json trong ảnh

SAO CHÉP gói. json. /

#Cài đặt gói

CHẠY npm install express –save

CHẠY npm cài đặt mysql –save

#Sao chép ứng dụng

SAO CHÉP. . /

#Expose cổng ứng dụng

TIẾP XÚC 3000

#Khởi động ứng dụng

CMD [“nút”, “chỉ mục. js”]

  1. Tạo chỉ mục. js và dán vào phần sau, hoặc bạn có thể sao chép đoạn mã bên dưới. Đây sẽ là ví dụ mẫu cho ứng dụng Nodejs của bạn

chỉ số vim. js

const express = require('express');

ứng dụng const = express();

cổng const = 3000;

const mysql = yêu cầu('mysql');

const con = mysql. tạo kết nối ({

chủ nhà.  

“cơ sở dữ liệu-Nodejs của tôi. cụm-cxxjkzcl1hwb. eu-tây3. số thứ tự. amazonAWS. com”,

người sử dụng. "quản trị viên",

mật khẩu mở khóa. “quản trị1234”

});

ứng dụng. get(‘/status’, (req, res) => res. gửi ({trạng thái. “Tôi đang chạy”}));

ứng dụng. lắng nghe (cổng, () => bảng điều khiển. log(`Ứng dụng Nodejs Dockerized đang lắng nghe trên cổng ${port}. `));

ứng dụng. post(‘/insert’, (req, res) => {

nếu (yêu cầu. truy vấn. tên người dùng && yêu cầu. truy vấn. email && yêu cầu. truy vấn. tuổi tác) {

bảng điều khiển. log('Đã nhận lệnh gọi chèn');

lừa đảo. kết nối (chức năng (err) {

lừa đảo. truy vấn (`CHÈN VÀO chính. người dùng (tên người dùng, email, tuổi) GIÁ TRỊ (‘${req. truy vấn. tên người dùng}', '${req. truy vấn. email}’, ‘${req. truy vấn. tuổi}')`, chức năng (err, kết quả, trường) {

nếu (err) res. gửi (lỗi);

nếu (kết quả) res. gửi ({tên người dùng. yêu cầu. truy vấn. tên người dùng, email. yêu cầu. truy vấn. email, tuổi. yêu cầu. truy vấn. tuổi tác});

bảng điều khiển if (trường). nhật ký (trường);

});

});

} khác {

bảng điều khiển. log('Đã xảy ra sự cố, Thiếu tham số');

}

});

ứng dụng. get(‘/list’, (req, res) => {

bảng điều khiển. log('Đã nhận cuộc gọi danh sách');

lừa đảo. kết nối (chức năng (err) {

lừa đảo. truy vấn (`CHỌN * TỪ chính. người dùng`, chức năng (err, kết quả, trường)

{

nếu (err) res. gửi (lỗi);

nếu (kết quả) res. gửi (kết quả);

});

});

});

Ở tệp phía trên, hãy thay thế giá trị của các biến dưới đây bằng một ứng dụng vào trong phiên bản RDS Amazon Aurora của bạn

  • chủ nhà. “cơ sở dữ liệu-Nodejs của tôi. cụm-cxxjkzcl1hwb. eu-tây-3. số thứ tự. amazonAWS. com”
  • người sử dụng. "quản trị viên"
  • mật khẩu mở khóa. “quản trị1234”
  1. Tạo gói. json và dán vào phần sau, hoặc bạn có thể sao chép phần mã bên dưới

gói vim. json

{

"Tên". “Nodejs-docker”,

"phiên bản". “12. 18. 4",

"sự mô tả". “Nodejs trên ec2 sử dụng docker container”,

"chính". "mục lục. js”,

"kịch bản". {

"kiểm tra". “tiếng vang \”Lỗi. không có bài kiểm tra nào được chỉ định \” && thoát 1″

},

"tác giả". “Rahul Shivalkar”,

"giấy phép". "LÀ C"

}

Cập nhật AWS Security Group

Để truy cập vào ứng dụng, ta cần thêm một quy tắc vào trong Nhóm bảo mật để cho phép các kết nối vào cổng 3000. Như tôi đã nói ở trên, tôi có thể truy cập vào các ứng dụng trên cổng 3000, nhưng tôi không khuyến mãi. Bạn có thể đọc tiếp để hiểu rõ hơn về các khuyến nghị của người viết

  1. Truy cập vào Bảng điều khiển EC2, chọn phiên bản, chuyển sang phòng thí nghiệm “Bảo mật”, sau đó nhấn vào liên kết của Nhóm bảo mật

Keyring_aws mysql
Keyring_aws mysql

  1. Chọn tab “Quy tắc gửi đến” và nhấn vào nút “Chỉnh sửa quy tắc gửi đến”

Keyring_aws mysql
Keyring_aws mysql

  1. Add a rule (quy tắc) cho phép kết nối bên ngoài từ “Mylp” qua cổng “3000”

Keyring_aws mysql
Keyring_aws mysql

Triển khai server Nodejs trên EC2 Server (Instance)

  1. Ta sẽ cùng tạo một docker image từ đoạn mã đã có
    1. cd /home/ubuntu/Nodejs-docker
    2. xây dựng docker -t Nodejs

Keyring_aws mysql
Keyring_aws mysql

  1. Create a container using image ta vừa tạo và đưa nó sang cổng 3000.  

docker run –name Nodejs -d -p 3000. 3000 nút

  1. You can see code is running

docker ps

  1. Bạn thậm chí có thể kiểm tra nhật ký của vùng chứa

nhật ký docker Nodejs

Keyring_aws mysql
Keyring_aws mysql

Giờ ta có Nodejs App Docker Container đang khởi động.  

  1. Bạn có thể truy cập vào ứng dụng của mình thông qua trình duyệt trên cổng 3000
  • Kiểm tra trạng thái của kết nối trên /status api sử dụng trình duyệt. http://:3000/status

Keyring_aws mysql
Keyring_aws mysql

  • Bạn có thể thêm một vài dữ liệu trong ứng dụng thông qua /chèn api sử dụng ứng dụng Người đưa thư bằng cách gọi yêu cầu POST.  

http://:3000/insert?username=abc&[email protected]&age=2

Keyring_aws mysql
Keyring_aws mysql

  • Bạn có thể liệt kê các dữ liệu từ ứng dụng bằng cách sử dụng /list api từ trình duyệt. http://:3000/list

Keyring_aws mysql
Keyring_aws mysql

  1. Hoặc bạn có thể sử dụng lệnh curl bên trong phiên bản EC2 để kiểm tra trạng thái, thêm dữ liệu, liệt kê dữ liệu

curl -XGET “http://:3000/list”

curl -XPOST “http://:3000/insert?username=abc&[email protected]&age=26″

  1. Stop and remove container

docker dừng Nodejs

docker rm Nodejs

Trong phần này, ta đã cố gắng kết nối trực tiếp các API có sẵn cho ứng dụng bằng cách sử dụng IP công cộng. Cổng của phiên bản EC2. Tuy nhiên, chúng tôi không khuyến khích việc tiếp xúc với các cổng không chuẩn hướng tới thế giới bên ngoài trong Security Group. Đồng thời, chúng tôi đã cố gắng truy cập ứng dụng thông qua giao thức HTTP, nghĩa là việc kết nối từ trình duyệt ứng dụng đến một cách không được bảo mật và bất kỳ kẻ tấn công nào cũng có thể đọc các gói mạng

Để tránh tình trạng này diễn ra, chúng tôi khuyên bạn nên sử dụng Nginx

Thiết lập Nginx

Chúng ta sẽ tạo một cấu hình Nginx sử dụng bên trong Nginx container thông qua Docker Volume. Đồng thời, ta sẽ tạo một tệp và sao chép các nội dung bên dưới vào trong

  1. cd /home/ubuntu/Nodejs-docker
  2. mkdir nginx-conf
  3. vim nginx-conf/nginx. conf

người phục vụ {

nghe 80;

nghe [. ]. 80;

vị trí ~ /. nổi tiếng/acme-thử thách {

chấp nhận tất cả;

gốc/var/www/html;

}

địa điểm / {

viết lại ^ https. //$host$request_uri?

}

}

người phục vụ {

nghe 443 ssl http2;

        lắng nghe [. ]. 443 ssl http2;

server_name Nodejs. devopslee. com www. Nodejs. devopslee. com;

server_tokens tắt;

ssl_certificate /etc/letsencrypt/live/Nodejs. devopslee. com/chuỗi đầy đủ. pem;

ssl_certificate_key /etc/letsencrypt/live/Nodejs. devopslee. com/khóa riêng. pem;

ssl_buffer_size 8k;

ssl_dhparam /etc/ssl/certs/dhparam-2048. pem;

ssl_protocols TLSv1. 2 TLSv1. 1 TLSv1;

bật ssl_prefer_server_ciphers;

ssl_ciphers ECDH+AESGCM. ECDH+AES256. ECDH+AES128. DH+3DES. ADH. AECDH. MĐ5;

ssl_ecdh_curve secp384r1;

tắt ssl_session_tickets;

ssl_dập ghim vào;

ssl_stapling_verify bật;

giải quyết 8. 8. 8. số 8;

địa điểm / {

try_files $uri @Nodejs;

}

vị trí @Nodejs {

proxy_pass http. //Nodejs. 3000;

add_header X-Frame-Options luôn luôn “SAMEORIGIN”;

add_header X-XSS-Protection “1;

add_header X-Content-Type-Options “nosniff” luôn;

add_header Referrer-Policy luôn luôn “không giới thiệu-khi-hạ cấp”;

add_header Nội dung-Bảo mật-Chính sách “dữ liệu mặc định-src *. 'unsafe-eval' 'unsafe-inline'” luôn luôn;

        }

gốc/var/www/html;

chỉ mục chỉ số. chỉ mục html. chỉ mục htm. nginx-debian. Html;

}

In the file on on, you can change at 3 line side under under. Replace subdomain section. tên miền, ví dụ như Nodejs. devopslee with you want

  1. server_name Nodejs. devopslee. com www. Nodejs. devopslee. com;
  2. ssl_certificate /etc/letsencrypt/live/Nodejs. devopslee. com/chuỗi đầy đủ. pem;
  3. ssl_certificate_key /etc/letsencrypt/live/Nodejs. devopslee. com/khóa riêng. pem;

Tại sao ta cần Nginx ở trước dịch vụ của nodejs?

Ứng dụng Nodejs sẽ chạy trên cổng 3000 không chuẩn. Nodejs cung cấp một lối đi cho phép ta sử dụng HTTPS;

Để giải quyết vấn đề này, ta cần có Nginx trước khi chấm dứt SSL và chuyển tiếp người dùng yêu cầu tới Nodejs. Nginx là một loại máy chủ đặc biệt có thể hoạt động như một proxy ngược, cân bằng tải (bộ cân bằng tải), proxy thư và bộ đệm HTTP. Tại đây, chúng ta sẽ sử dụng Nginx làm proxy ngược để chuyển hướng các yêu cầu về ứng dụng Nodejs và có kết thúc SSL

Tại sao ta không sử dụng Apache?

Apache cũng là một máy chủ web và có thể hoạt động như một proxy ngược. Nó cũng hỗ trợ chấm dứt SSL. Tuy nhiên, có một vài điểm khác biệt giữa Nginx và Apache. Làm một vài lý do, phần lớn mọi người sẽ chọn Nginx thay vì Apache. Chúng ta có thể xác định thông qua một vài lý do bên dưới

  1. Nginx có quy trình đơn giản, xử lý bất đồng bộ (không đồng bộ) và có kiến ​​trúc dựa trên sự kiện. Trong khi đó Apache luôn cố gắng tạo ra quy trình mới, tạo ra luồng mới cho mọi yêu cầu trong mọi kết nối
  2. Nginx có dung lượng nhẹ, có thể mở rộng và dễ dàng cấu hình. Apache dù có nhiều tính năng tốt nhưng tương đối khó học

Docker-Soạn thư

Ở bước này, ta sẽ tải docker-compose

  1. Tải phần mở rộng mới nhất của Docker Compose

cuộn tròn sudo -L “https. //github. com/docker/soạn thảo/phát hành/tải xuống/1. 29. 2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose

  1. Áp dụng các lệnh có thể thực thi cho docker-compose mà ta vừa tải xuống ở bước trên

Sudo chmod +x /usr/local/bin/docker-compose

  1. Kiểm tra xem ta đã tải xuống thành công chưa bằng cách kiểm tra phiên bản của docker-compose

docker-compose –version

  1. Tạo một tệp docker-compose. yaml, or you can sao chép các nội dung bên dưới

cd /home/ubuntu/Nodejs-docker

vim docker-soạn thảo. yml

phiên bản. '3'

dịch vụ

Nodejs

xây dựng

định nghĩa bài văn.

dockerfile. Dockerfile

hình ảnh. Nodejs

container_name. Nodejs

khởi động lại. trừ khi dừng lại

mạng lưới

– mạng ứng dụng

máy chủ web

hình ảnh. nginx. đường chính-alpine

container_name. máy chủ web

khởi động lại. trừ khi dừng lại

cổng

– “80. 80”

– “443. 443”

tập

– gốc web. /var/www/html

–. /nginx-conf. /etc/nginx/conf. d

– certbot-v.v. /etc/letsencrypt

– certbot-var. /var/lib/letsencrypt

– dhparam. /etc/ssl/certs

phụ thuộc

– Nodejs

mạng lưới

– mạng ứng dụng

certbot

hình ảnh. certbot/certbot

container_name. certbot

tập

– certbot-v.v. /etc/letsencrypt

– certbot-var. /var/lib/letsencrypt

– gốc web. /var/www/html

phụ thuộc

- máy chủ web

yêu cầu. certonly –webroot –webroot-path=/var/www/html –email [email được bảo vệ] –agree-tos –no-eff-email –staging -d Nodejs. devopslee. com  -d www. Nodejs. devopslee. com

#yêu cầu. certonly –webroot –webroot-path=/var/www/html –email [email được bảo vệ] –agree-tos –no-eff-email –force-renewal -d Nodejs. devopslee. com  -d www. Nodejs. devopslee. com

tập

certbot-vv

certbot-var

web-root

người lái xe. địa phương

driver_opts

loại hình. không ai

      thiết bị. /home/ubuntu/Nodejs-docker/views/

o. trói buộc

dhparam

người lái xe. địa phương

driver_opts

loại hình. không ai

thiết bị. /home/ubuntu/Nodejs-docker/dhparam/

o. trói buộc

mạng lưới

mạng ứng dụng

người lái xe. cầu

In the file on on, you can change the lines under under. Change subdomain subdomain. tên miền, ví dụ như Nodejs. devopsleee với phần mà bạn muốn. Change IP to email of your own

–email EMAIL, Email dùng để đăng ký và liên hệ khôi phục

yêu cầu. certonly –webroot –webroot-path=/var/www/html –email [email được bảo vệ] –agree-tos –no-eff-email –staging -d Nodejs. devopslee. com  -d www. Nodejs. devopslee. com

Cập nhật Nhóm bảo mật AWS

Lần này, ta sẽ chuyển cổng 80 và cận 443 trong nhóm bảo mật, gắn với phiên bản EC2. Đồng thời, loại bỏ cổng 3000 không còn cần thiết – lúc này ứng dụng của bạn đã hoạt động qua cổng 443

Keyring_aws mysql
Keyring_aws mysql

Bao gồm các thay đổi trong DNS

Tại đây, tôi đã tạo một tên miền phụ “Nodejs. devopslee. com” sẽ được sử dụng để truy cập ứng dụng mẫu Nodejs, sử dụng tên miền thay vì truy cập bằng IP

Bạn có thể tạo một tên miền phụ trên AWS nếu bạn đã có sẵn một tên miền

Keyring_aws mysql
Keyring_aws mysql

Tạo 2 “type A Recordsets” trên vùng đang quản trị với giá trị là IP công khai của phiên bản EC2. Một Recordset sẽ trở thành tên miền phụ. miền. com và cái còn lại sẽ là www. tên miền phụ. miền. com

Ở đây, tôi đã tạo ra Nodejs. devopslee. com và www. Nodejs. devopslee. com, cả hai đều trỏ về IP công khai của phiên bản EC2.

Lưu ý. Tôi đã không gán bất kỳ IP đàn hồi nào cho phiên bản EC2. Tôi khuyên bạn nên chỉ định một IP đàn hồi và sử dụng nó trong Recordset, sau đó khi bạn khởi động lại phiên bản EC2, bạn không cần phải cập nhật IP trong Recordset nữa, IP công khai thường sẽ thay đổi sau khi phiên bản EC2 được khởi động lại

Bây giờ, chúng ta sẽ sao chép giá trị của “Type NS Recordset”, thứ mà chúng ta sẽ cần trong các bước tiếp theo

Keyring_aws mysql
Keyring_aws mysql

Truy cập vùng lưu trữ của tên miền, tạo một “bản ghi” mới với tên miền phụ. miền. com, thêm các giá trị NS mà bạn sao chép vào bước trên

Keyring_aws mysql
Keyring_aws mysql

Bây giờ bạn đã có một tên miền phụ có thể truy cập vào ứng dụng của bạn

Trong trường hợp của tôi, tôi có thể sử dụng Nodejs. devopslee. com để truy cập vào ứng dụng Nodejs. Bước tiếp theo, ta sẽ đảm bảo an toàn cho ứng dụng web Nodejs

Bao gồm chứng chỉ SSL

Ta sẽ tạo một key có thể sử dụng trong Nginx

  1. cd /home/ubuntu/Nodejs-docker
  2. lượt xem mkdir
  3. mkdir dhparam
  4. Sudo openssl dhparam -out /home/ubuntu/Nodejs-docker/dhparam/dhparam-2048. phút 2048

Triển khai ứng dụng Nodejs trên phiên bản EC2

Chúng ta đã có sẵn để khởi động ứng dụng Nodejs bằng cách sử dụng docker-compose. Docker-compose sẽ khởi động ứng dụng Nodejs trên cổng 3000, Nginx với SSL trên cổng 80 và 443. Nginx sẽ điều hướng các yêu cầu về ứng dụng Nodejs khi được truy cập với tên miền. Nó cũng sẽ có một ứng dụng khách certbox cho phép sở hữu chứng chỉ

  1. docker-compose  lên

Sau khi bạn nhập lệnh phía trên, bạn sẽ thấy các đầu ra như bên dưới. Bạn sẽ thấy một dòng tin nhắn với nội dung “Đã nhận được chứng chỉ thành công”

Lưu ý. command docker-compose side on sẽ làm cho các container chạy và gắn kết với thiết bị đầu cuối. Ta sẽ không sử dụng lựa chọn -d để tách chúng ta khỏi thiết bị đầu cuối

Keyring_aws mysql
Keyring_aws mysql

Giờ đây, bạn đã sẵn sàng. Vui lòng nhấn vào URL trên trình duyệt và bạn đã có sẵn ứng dụng Nodejs trên HTTPS

Keyring_aws mysql
Keyring_aws mysql

Bạn cũng có thể thử truy cập vào ứng dụng thông qua lệnh curl

  1. Listing data from application

cuộn tròn https. //Nodejs. devopslee. com/danh sách

  1. Add a entry into in application

cuộn tròn -XPOST “https. //Nodejs. devopslee. com/insert?username=abc&[email protected]&age=28“

  1. Một lần nữa, hãy liệt kê các dữ liệu để xác thực việc xem dữ liệu ở bước (2) đã được thêm vào hay chưa

cuộn tròn https. //Nodejs. devopslee. com/danh sách

Keyring_aws mysql
Keyring_aws mysql

  1. Kiểm tra trạng thái của ứng dụng

https. //Nodejs. devopslee. com/trạng thái

  1. Click vào URL trên trình duyệt để có một danh sách các mục nhập trong cơ sở dữ liệu

https. //Nodejs. devopslee. com/danh sách

Keyring_aws mysql
Keyring_aws mysql

Tự động gia hạn chứng chỉ SSL

Với chứng chỉ mà ta đã tạo, sử dụng Let's Encrypt, sẽ có giá trị trong 90 ngày. Do đó, ta cần có phương án để cập nhật chứng chỉ tự động, giúp ta thoát khỏi việc giữ chứng chỉ hết hiệu lực

Để tự động hóa quy trình này, ta sẽ tạo một tập lệnh giúp ta cập nhật chứng chỉ và một cronjob để lên lịch chạy tập lệnh

  1. Create a script with -dry-run to check script

chứng chỉ gia hạn vim. sh

#. /bin/bash

COMPOSE=”/usr/local/bin/docker-compose –no-ansi”

DOCKER=”/usr/bin/docker”

cd /home/ubuntu/Nodejs-docker/

$COMPOSE chạy certbot gia hạn –dry-run && $COMPOSE kill -s Máy chủ web SIGHUP

Hệ thống $DOCKER prune -af

Keyring_aws mysql
Keyring_aws mysql

  1. Thay quyền truy cập của script sang cho phép nó khởi động

chứng chỉ gia hạn chmod 774. sh

  1. Create a cronjob

Sudo crontab -e

*/5 * * * * /home/ubuntu/Nodejs-docker/renew-cert. sh >> /var/log/cron. nhật ký 2>&1

  1. Listing of the cronjobs

Sudo crontab -l

Keyring_aws mysql
Keyring_aws mysql

  1. Kiểm tra nhật ký của cronjob sau 5 phút, khi chúng ta đã cài đặt để cronjob hoạt động 5 phút một lần

đuôi -f /var/log/cron. lo

Keyring_aws mysql
Keyring_aws mysql

Trong ảnh chụp màn hình phía trên, bạn có thể thấy dòng tin nhắn “Mô phỏng gia hạn chứng chỉ hiện có…. ”. Đó là bởi vì ta đã nêu rõ lựa chọn “-dry-run” trong kịch bản

  1. Loại bỏ lựa chọn “–dry-run” trong tập lệnh

chứng chỉ gia hạn vim. sh

#. /bin/bash

COMPOSE=”/usr/local/bin/docker-compose –no-ansi”

DOCKER=”/usr/bin/docker”

cd /home/ubuntu/Nodejs-docker/

$COMPOSE chạy certbot gia hạn && $COMPOSE kill -s Máy chủ web SIGHUP

Hệ thống $DOCKER prune -af

Keyring_aws mysql
Keyring_aws mysql

Lần này, bạn không còn thấy tin nhắn kia nữa. Tập lệnh sẽ kiểm tra xem chúng ta có cần cập nhật chứng chỉ hay không, và nếu cần, nó sẽ tự động cập nhật or sẽ không hiển thị thông báo “Chứng chỉ chưa đến hạn gia hạn”

Keyring_aws mysql
Keyring_aws mysql

8. Bước tiếp theo sau khi triển khai ứng dụng Nodejs trên AWS?

Ta đã hoàn thành việc cài đặt ứng dụng Nodejs sử dụng Docker trên phiên bản AWS EC2. Tuy nhiên, có một vài điều ta cần lưu ý khi muốn phát triển các ứng dụng khác cho môi trường sản xuất hay bất kỳ môi trường nào khác. Ở bước tiếp theo, chúng ta sẽ sử dụng một Dàn nhạc như ECS hoặc EKS để quản lý ứng dụng Nodejs trong giai đoạn sản xuất. Nhân rộng, tự động mở rộng, cân bằng tải, định tuyến đường truyền, quản lý sức khỏe vùng chứa sẽ không tự động xuất hiện với Docker và Docker-compose. Để quản lý container và kiến ​​trúc vi dịch vụ, bạn cần các công cụ điều phối container như ECS hay EKS

Ngoài ra, ta không sử dụng bất kỳ kho lưu trữ Docker nào để lưu trữ các Docker Image cho ứng dụng Nodejs. Bạn có thể sử dụng AWS ECR, một bộ chứa được quản lý hoàn toàn

Kết luận

Để phát triển ứng dụng Nodejs trên AWS, chúng ta không nhất thiết phải tạo một ứng dụng Nodejs và khai thác chúng trên phiên bản EC2 với một cơ sở dữ liệu tự quản lý. Có rất nhiều khía cạnh như Container hóa ứng dụng Nodejs, Chấm dứt SSL, tên miền cho ứng dụng sẽ cần phải cân nhắc khi bạn muốn tăng tốc cho giai đoạn phát triển giai đoạn phát triển phần mềm, bảo mật, tăng độ tin cậy và dự án dữ liệu

Trong bài viết này, ta đã cùng khám phá các bước để “docker hóa” một ứng dụng Nodejs mẫu, sử dụng AWS RDS Amazon Aurora và triển khai ứng dụng Nodejs trên phiên bản EC2 bằng Docker và Docker-compose. Kích hoạt SSL Termination to sub-domain để truy cập vào ứng dụng Nodejs. Ta cũng đi qua các bước để tự động hóa việc cấp phép cho tên miền và gia hạn chứng chỉ SSL sử dụng Certbox

Đây là bước cơ bản để bắt đầu với một ứng dụng mẫu Nodejs. Tuy nhiên, khi chúng ta cần ứng dụng thực tế, 100 giây của vi dịch vụ, 1000 giây của vùng chứa, khối lượng, mạng, bí mật, lối ra-vào, bạn sẽ cần đến công cụ điều phối vùng chứa. Có rất nhiều công cụ như Kubernetes, AWS ECS, AWS EKS giúp bạn nâng cao khả năng quản lý vòng đời của container trong ứng dụng thực tiễn

Về VTI Cloud

VTI Cloud là Đối tác cấp cao (Đối tác tư vấn nâng cao) của AWS, với đội ngũ kỹ sư hơn 50 tuổi về giải pháp được chứng nhận bởi AWS. Với mong muốn hỗ trợ khách hàng trong quá trình chuyển đổi số và dịch chuyển lên đám mây AWS, VTI Cloud tự hào là đơn vị tiên phong trong việc tư vấn giải pháp, phát triển phần mềm và khai thác hạ tầng AWS cho khách hàng

Xây dựng kiến ​​trúc an toàn, hiệu suất cao, linh hoạt và chi phí tối ưu cho khách hàng là nhiệm vụ hàng đầu của VTI Cloud trong sứ mệnh công nghệ hóa doanh nghiệp