Triển khai ứng dụng Node lên ECS bằng Docker

Triển khai ứng dụng Node lên ECS bằng Docker

Trong hướng dẫn này, tôi sẽ hướng dẫn bạn các bước về cách đóng gói một ứng dụng Node.js và sau đó triển khai nó lên Amazon Web Services (AWS) bằng cách sử dụng Amazon Elastic Container Registry (ECR) và Amazon Elastic Container Service (ECS). Chúng ta sẽ làm điều đó như sau:

1) Thiết lập môi trường

NodeNpm: Chọn vào liên kết này để cài đặt phiên bản mới nhất.

Docker: Chọn vào liên kết này để cài đặt phiên bản mới nhất.

AWS account: Đăng ký với một tài khoản miễn phí.

AWS CLI: Làm theo hướng dẫn cho hệ điều hành của bạn.

2) Tổng quan về Docker và AWS

Docker là phần mềm mã nguồn mở cho phép bạn đóng gói một ứng dụng cùng với các biến môi trường và phụ thuộc bắt buộc của nó trong một vùng chứa mà bạn có thể vận chuyển và chạy ở bất cứ đâu. Nó độc lập với nền tảng hoặc phần cứng, và do đó ứng dụng được chạy trong bất kỳ môi trường nào theo cách riêng biệt.

Amazon Web Services (AWS) cung cấp một dịch vụ điện toán đám mây đáng tin cậy, có thể mở rộng và không tốn kém. Như tôi đã đề cập trước đây, hướng dẫn này sẽ tập trung vào việc sử dụng các dịch vụ ECR và ECS của AWS..

3) Ứng dụng Node.js để triển khai

Hãy nhanh chóng tạo một ứng dụng mẫu mà chúng ta sẽ sử dụng cho mục đích của hướng dẫn này. Nó sẽ là ứng dụng Node.js rất đơn giản.

Nhập thông tin sau vào thiết bị đầu cuối của bạn:

// Tạo thư mục mới
$ mkdir ecs-nodejs-app

// Di chuyển đến thư mục mới tạo
$ cd ecs-nodejs-app

// Khởi tạo npm
$ npm init -y

// Cài đặt express
$ npm install express

// Tạo tệp server.js
$ touch server.js

Mở tệp server.js và dán source code bên dưới vào trong đó:

// server.js

const express = require('express')
const app = express()

app.get('/', (req, res) => {
res.send('Welcome from a Node.js app!')
})

app.listen(3000, () => {
console.log('Server is up on 3000')
})

Khởi động ứng dụng với dòng lệnh sau:

$ node server.js

Truy cập nó trên http: // localhost: 3000. Bạn sẽ nhận được Welcome from a Node.js app! hiển thị trong trình duyệt của bạn.

Tiếp theo, chúng ta sẽ đóng gói ứng dụng.

4) Viết Dockerfile

Chúng tôi sẽ bắt đầu đóng gói ứng dụng bằng cách tạo một tệp duy nhất được gọi là Dockerfile trong thư mục gốc của dự án. Tệp này không có phần mở rộng.

FROM node:8-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm install
EXPOSE 3000
CMD [ "node", "server.js" ]

5. Xây dựng Image Docker

Đảm bảo rằng bạn đã thiết lập và chạy Docker. Bây giờ chúng ta đã xác định Dockerfile của mình, hãy xây dựng Image Docker  bằng  -t như sau:

$ docker build -t ecs-nodejs-app .

6. Chạy một Docker Container

Chúng tôi đã xây dựng Image Docker. Để xem Image Docker đã tạo trước đó, hãy chạy:

$ docker images

Bạn sẽ thấy Image Docker chúng ta vừa tạo là Image Docker gần đây nhất dựa trên thời gian::

Sao chép Image Id. Để chạy container, chúng ta gỏ lệnh sau:

$docker run -p 80:3000 {image-id}

// Nhập image-id đã sao chép

Ở đây chúng ta triển khai ứng dụng lên cổng 80: 3000. Vì chúng ta đang chạy Docker cục bộ, hãy truy cập http: // localhost để xem.

 

7. Tạo nơi đăng ký và đẩy Image Docker của chúng ta vào đó

Amazon Elastic Container Registry (ECR) là “sổ đăng ký bộ chứa” được quản lý toàn phần giúp bạn dễ dàng lưu trữ, quản lý, chia sẻ và triển khai Image trong contanier cũng như thành phần lạ ở bất cứ nơi nào. Amazon ECR được tích hợp với Amazon Elastic Container Service (ECS), giúp đơn giản hóa quy trình công việc từ khâu phát triển đến khâu sản xuất..

Trước khi chúng ta đẩy Image Docker của mình lên, hãy đảm bảo rằng AWS CLI của bạn có thể kết nối với tài khoản AWS của bạn. Chạy câu lệnh sau:

$ aws configure

Nếu AWS CLI của bạn đã được cài đặt, cấu hình aws sẽ yêu cầu  các thông tin sau:

$ aws configure
AWS Access Key ID [None]: <accesskey>
AWS Secret Access Key [None]: <secretkey>
Default region name [None]: us-east-2
Default output format [None]:

Xác nhận rằng AWS CLI của bạn được cấu hình đúng bằng cách chạy lại lệnh cấu hình aws và nhấn enter ở mỗi lần thông báo để chấp nhận:

Các bước để tạo Registry cho Image Docker của bạn:
Đi tới Bảng điều khiển AWS và đăng nhập.

Trong danh mục Services , dưới Containers, chọn ECS:

 

Trên menu bên trái, bên dưới Amazon ECR, di chuyển đến Repositories sau đó chọn Create Repository. Nhập vào tên , ví dụ chúng ta nhập là “ecs-nodejs-app”, sau đó nhấn Create Repository.

Sau đó trên màn hình Repositories chọn Repository name đối tượng, nhấn vào View Push Commands ở phía trên bên phải và làm theo 4 hướng dẫn từ bảng điều khiển AWS để building, tagging, và pushing Image Docker của bạn:

Bây giờ, hãy truy cập Amazon ECR của bạn và nhấp vào tên kho lưu trữ của bạn và bạn sẽ thấy Image Docker của mình ở đó. Sao chép URI của Image Docker này, chúng ta sẽ cần dán nó vào bước tiếp theo:


Tiếp theo, chúng ta sẽ tạo Task, Service, và Cluster để chạy Image Docker này trên EC2.

8. Tạo Task Definition

Tasks trên AWS có chức năng giống như lệnh chạy docker trên Docker CLI. Nó được định nghĩa:

Container images
Volumes
Networks Environment Variables
Port mappings

Từng bước để tạo mới Task Definition:

  1. Task Definitions trong bảng điều khiển (ở bên trái), chọn nút Create new Task Definition.
  2. Ở Launch Type chọn EC2.
  3. Đặt tên cho Task (ví dụ: “ecs-nodejs-app-task”), sao đó bỏ qua các trường tiếp theo và cuộn xuống bên dưới để chọn thêm mới container.
  4. Đặt tên cho container (ví dụ: “ecs-nodejs-app-container”).
  5. Dán đường dẫn Image URI lúc nãy copy vào đây.
  6. Tại hạng mục Memory Limits, chọn “Soft Limit” và nhập giá trị thích hợp ví dụ  nhập “512”
  7. Ánh xạ các cổng (ví dụ, nhập “80: 3000”), chọn giao thức “TCP”
  8. Cuộn xuống Environment Variables và thiết lập “NODE_ENV” làm khóa và “production” làm giá trị.
  9. Bỏ qua mọi thứ khác, cuộn xuống cuối cùng và chọn nút Add.
  10. Quay lại cửa sổ Create Task Definition, bạn sẽ thấy Container và Image Docker của bạn sẽ hiện ra, sau đó thì cuộn xuống và chọn “Create”

9. Tạo Cluster

Từng bước tạo Cluster:

  1. Từ danh mục Services, chọn ECS để quay lại bảng điều khiển ECS.
  2. Từ danh mục bên trái, dưới Amazon ECS (không phải EKS), chọn Clusters, sau đó chọn Create Cluster
  3. Chọn EC2 Linux + Networking làm mẫu, nhấn Next Step.
  4. Đặt tên cho cluster (ví dụ: “ecs-nodejs-app-cluster”).
  5. Tại hạng mục EC2 Instance Type để mặc định hoặc chọn “t2.micro” .
  6. Tại hạng mục Number of instances nhập là “1” và EBS Storage nhập “30”.
  7. Tại hạng mục Key pair để nguyên mặc định hoặc chọn key đã tồn tại nếu bạn muốn truy cập SSH vào EC2 instance đối tượng.
  8. Tại hạng mục VPC chọn Create a new VPC để tạo mới, sau đó cuộn xuống.
  9. Tại hạng mục Container instance IAM role chọn ROLE mà chúng ta đã tạo (ví dụ: “ECStoEC2role”), sau đó chọn Create.

Sẽ mất vài phút để xử lý xong. Sau khi được xử lý, bạn sẽ có thể chọn View Cluster và thấy trạng thái được thiết lập Active.

10. Tạo Service để chạy Cluster

Bây giờ bắt đầu tạo service để chạy cluster này.

Từng bước tạo Service:

  1. Từ danh mục bên trái của ECS, chọn Task Definition, sau đó chọn task của bạn (ví dụ: “ecs-nodejs-app-task”).
  2. Chọn version sửa đổi mới nhất.
  3. Từ danh mục Action (bên cạnh Create new revision), chọn Create Service.
  4. Trong trang Configure Service, tại hạng mục Launch type chọn EC2.
  5. Tại hạng mục Cluster, chọn cluster đã tạo (ví dụ: “ecs-nodejs-app-cluster”)
  6. Tại hạng mục Service name, đặt tên service (ví dụ: “ecs-nodejs-app-service”)
  7. Tại hạng mục Number of Tasks nhập “1”.
  8. Bỏ qua tất cả các trường và trang khác, di chuyển đến trang Step 4, cuộn xuống và nhấp vào Create Service.
  9. Trên trang Launch Status, bạn sẽ thấy các dấu check màu xanh lục cho Service đã tạo. Chọn View Service. Nếu Last Status trong tab Tasks là “PENDING”, hãy đợi một vài phút và sau đó nó sẽ tự chuyển sang “RUNNING” (hoặc nhấp vào biểu tượng làm mới ở bên phải).

Từ Cluster, chọn tab EC2 instances, nhấn vào Container Instance đối tượng để lấy link DNS công khai.

Truy cập DNS để xem ứng dụng của chúng ta!

ec2-52-193-75-195.ap-northeast-1.compute.amazonaws.com

Liên kết source code cho phần Docker từ Github.

Tài liệu tham khảo

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started.html

https://blog.clairvoyantsoft.com/deploy-and-run-docker-images-on-aws-ecs-85a17a073281

https://medium.com/boltops/gentle-introduction-to-how-aws-ecs-works-with-example-tutorial-cea3d27ce63d