Deploy 1 app dùng container lên AWS Elastic Beanstalk

Tram Ho

AWS Elastic Beanstalk là dịch vụ của AWS cho phép bạn deploy ứng dụng của bạn lên cloud mà không phải tốn quá nhiều công setup. Đã từng có 1 thời nó được so sánh với Heroku. Bản thân mình thì phải nói thật về trải nghiệm cá nhân là mình thích deploy ứng dụng lên Heroku hơn vì tính nhanh gọn, còn với AWS Beanstalk thì tại thời điểm mình thử(cuối 2021 tới năm 2022), có 1 số lỗi liên quan tới việc khác version của ngôn ngữ, công nghệ mình sử dụng nên dẫn tới chưa deploy được lên Elastic Beanstalk lần nào. Dù vậy, mình vẫn quyết tâm phải thử bằng được và sẽ bắt đầu từ bước đơn giản nhất: Deploy 1 app container lên Elastic Beanstalk.

Và sau bước này thì mình sẽ deploy app Rails của mình

Chuẩn bị

Cài sẵn những công cụ sau trên máy

  • Docker
  • Elastic Beanstalk CLI
  • AWS access keys

Lấy 1 ứng dụng container về máy

Lần này chúng ta chú trọng vào việc deploy nên tuỳ các bạn có thể tự làm 1 ứng dụng single-container hay là kéo nhanh 1 image về cũng được.

Nếu các bạn lựa chọn kéo image có sẵn về thì có 2 nguồn:

Với mình thì mình chọn nguồn lần này từ ECR Public Library. Và cụ thể hơn mình chọn container của trò chơi 2048. Các bạn thích dùng container nào cứ tự nhiên tải nhé.

Sau khi chọn được container thì mình tạo thư mục có cấu trúc thư mục

Trong docker-compose.yml, mình sẽ định nghĩa như sau

Sau đó là chạy docker-compose up để thử nghiệm. Và chúng ta có app như trong ảnh ở đường dẫn localhost

Chạy được rồi! Đóng bài và đi ch…. Ủa mà khoan, tiêu đề gì mà lạ vậy :v

Thế là mình lại ngồi vào viết tiếp bước tiếp theo.

Deploy lên AWS Beanstalk

Các cách để deploy lên AWS Beanstalk

Elastic Beantstalk cho chúng ta 2 cách để deploy lên đó.

Cách 1 là bạn nén .zip toàn bộ source code của bạn sau đó chọn deploy via Upload.

Cách 2 là bạn sẽ deploy bằng CLI. Đó là lý do bạn cần chuẩn bị AWS Elastic Beanstalk CLI và Access Keys.

Còn trong thực tế, ai cũng mong muốn high tech theo cách 2, nhưng tuỳ vào 1 số quy chuẩn của tổ chức nào đó mà sẽ deploy với cách 1. Đây là cái không chỉ nằm riêng với deploy trên Elastic Beanstalk mà còn các hệ thống to hơn phải setup Fargate + RDS + 1 số dịch vụ khác.

Mình chỉ định nêu cách 2 nhưng có lẽ để demo tử tế, mình sẽ làm cả 2 cách cho các bạn xem

Cách 1: Deploy bằng upload

Trước tiên bạn sẽ tạo 1 môi trường EB mới. Khi tạo hãy chọn Web server environment. Worker server environment sẽ dành cho các tác vụ chạy background. Còn đây là case chúng ta chạy ứng dụng web nên chọn Web environment.

Sau khi tới bước tiếp theo chúng ta sẽ điền form như bình thường

Tại bước này, chúng ta có thể chọn giữa Docker và ECS. Theo đúng như tôn chỉ deploy lười của dịch vụ thì mình chọn Docker :v ECS sẽ là 1 nghiên cứu lúc khác nếu có :v

Tới phần Application Code, chúng ta sẽ chọn “Upload your code” và tải folder zip source code ứng dụng ta vừa chạy thử ở local

Vẫn chú ý ở ảnh trên giúp mình. Ngày xưa AWS cho phép tạo EC2 không cần nằm trong VPC. Hiện tại thì nó đã có tên là Legacy EC2 và không hay sử dụng nữa. Vì vậy, bạn phải config VPC cho ứng dụng trước khi tạo môi trường, nếu không chắc chắn sẽ xảy ra lỗi. Hãy bấm hộp khoanh đỏ “Configure more options”

Form mở ra như ảnh dưới. Cuộn tới phần network và click vào config VPC.

Vào config VPC, bạn sẽ tạo 1 VPC mới hoặc có VPC nào có thể để mặc định thì dùng luôn. Sau khi có VPC thì bước tiếp theo bạn chỉ cần chọn instance subnets và database instance và lưu lại.

Cuối cùng là tạo và đợi

Ôi không lỗi rồi :v

Điều tra lỗi thì hoá ra mình đã nén nhầm. Nhưng tin tốt là chúng ta có thể upload để cập nhật ứng dụng.

Chạy vào trong folder và nén như này

Sau đó bấm upload and deploy và up lại file zip lên

Và cuối cùng là chạy được

Click vào URL thì chúng ta sẽ có ngay web được deploy. Hãy chú ý đường dẫn nữa để thấy rằng mình không bật localhost lên để lấp liếm với các bạn :v

Trước khi sang cách 2 thì làm ván game đã các bạn ơi.

Cách 2: CLI và 1 chút setup kiểu coding

Quay lại thư mục, chúng ta sẽ chạy lệnh eb init và chọn như dưới

Sau đó thì game đã lên rồi mọi người nhé. Mình đặt là 2048-game-cli

Phía source code cũng có sự thay đổi về cấu trúc thư mục

config.yml của mình hiện tại

Đang chọn cách deploy lười nên mình sẽ không giải thích chi tiết các trường trên nghĩa là gì mà giải thích qua loa.

  • branch-defaults: Đây là nơi bạn sẽ setup các môi trường bạn muốn deploy
  • Sau đó là môi trường tên default. Sau default thì bạn có thể định nghĩa thêm 1 số cái như develop hay staging tuỳ thích. Chúng ta sẽ nghịch option này ở phần sau.
  • environment: Tên môi trường. Hiện đang là null
  • application_name, default_platform, default_region là lúc chạy eb create đã được đưa thông tin vào

Sửa và lưu lại thì tới bước tiếp theo: deploy. Đây là lần deploy mới nên mình sẽ dùng eb create

Và môi trường của mình đã deploy xong

Link cũng có luôn

DLC cho cách 2

Và mình sẽ tạo ra môi trường thứ 2 ở trong config.yml

Do 2048-game-cli-prod là môi trường mới nên mình vẫn phải chạy eb create. Lúc này ta có 2 môi trường.

Tiếp đó, giả sử có 1 chỉnh sửa code và deploy lại, chúng ta sẽ chạy eb deploy. Và khi kiểm tra, chúng ta sẽ thấy chỉ có môi trường default được modify


Vậy là muốn chạy môi trường dev phải chạy thêm eb deploy 2048-game-cli-dev

Thế nên nếu các bạn muốn deploy 2 môi trường trở lên, nếu ít thì có thể viết câu command liền eb deploy default & eb deploy 2048-game-cli-dev hoặc là với nhiều file hơn hãy làm 1 file script

Kết

Như vậy mình đã giới thiệu cho các bạn sơ sơ về deploy ứng dụng lên AWS Elastic Beanstalk. Cảm ơn các bạn đã đọc bài

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo