Deploy React App lên AWS S3

Xin chào các bạn,

Như các bạn đã biét thì ReactAmaazon Web Service là hai từ khoá được nhắc đến rất nhiều trong thời gian gần đây với sự tiện dụng mà nó mang lại đến cho developer lẫn người sử dụng. Và trong bài viết này mình sẽ giới thiệu cho các bạn về cách có thể deploy được một React App lên AWS S3 một cách dễ dàng, mà có thể tiết kiệm được phần lớn chi phí

Các công nghệ sẽ sử dụng trong bài viết này

Prerequisites

Tạo React App

Bạn có thể follow theo hướng dẫn để có thể tạo ra một React App sử dụng *Create React App (https://facebook.github.io/create-react-app/). Để bắt đầu thì ta sẽ thực hiện trên terminal như sau

npx create-react-app introduction
cd introduction
yarn start

Sau khi start xong thì bạn có thể vào http://localhost:3000/ và kết quả như sau:

Các bạn có thể tiếp tục develop site của bạn ở đây. Tuy nhiên, trong bài viết này mình không focus vào React App nên sẽ chỉ tạo đến đây và chuyển tiếp sang các step khác để deploy app lên S3

Push app lên Github

Đây là một trong những bước rất cơ bản và đơn giản, tuy nhiên với một bài viết đại trà cho tất cả mọi người thì mình vẫn xin phép hướng dẫn step-by-step cho những bạn mới hoặc newbie có thể follow được. Trong Github, click vào dấy + rồi bấm New repository

Tiếp theo bạn sẽ nhìn thấy trang tương tự như sau

Điền thông tin repository namedesription, chọn trạng thái của repositoty (private hoặc public)

Sau khi bấm Create repository ta có kết quả như sau Tiếp theo bạn làm theo các bước như trong hướng dẫn ở trong ảnh để có thể push code github của bạn lên repository. (Phần này mình tham khảo ảnh trên mạng). Và kết quả là như sau:

Ngoài ra, bạn có thể setup ssh key khi push hoặc pull code. Có thể đọc theo hướng dẫn sau https://help.github.com/en/enterprise/2.15/user/articles/adding-a-new-ssh-key-to-your-github-account.

Làm việc với AWS S3

Bây giờ chúng ta sẽ bước sang làm việc với S3, để build app.

Mọi người tạo bucket thêm tên rồi bấm Next

Ở trong Configure options tab, bạn không cần chọn gì cả chỉ cần click Next. Ở trong Set permissions tab, bạn cần phải uncheck Block all public access. Bạn sẽ hosting app của bạn với bucket này, bạn sẽ cần phải public để có thể access vào code của bạn.

Click Next, và review những bucket config và click Create bucket. Bạn sẽ nhìn thấy bucket của mình ở phần list bucket.

Chọn vào bucket bạn vừa tạo sau đó click vào Properties tab và sau đó chọn Static website hosting box

Click Use this bucket to host a website và cũng chọn index document với với index.html trước khi save.

Và bạn sẽ thấy status đổi sang là Bucket hosting. Bạn có thể click vào Static website hosting sẽ mở ra đường dẫn tương ứng endpoint

Tuy nhiên, khi vào đường link đó bạn sẽ thấy lỗi như sau

Để sửa lỗi này, chuyển đến Permissions tab và click vào Bucket policy và điền thông itn như sau

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "bucket-name"
        }
    ]
}

Và refresh lại page thì sẽ đổi thành lỗi khác

Để xử lý vấn đề này đầu tiên bạn cần build app của mình

yarn build
or
npm run build

Và sau đó thì chúng ta sẽ upload toàn bộ dữ liệu trong thư mục build lên S3

và khi reload lại thì bạn đã thấy app của mình chạy được rồi đó

Continuous Deployment

Ở trong bước này chúng ta sẽ setup continous deployment để có thể push code một cách tự động lên s3 bucket. Và để làm được điều đó chúng sẽ sử dụng Buddy https://buddy.works.

Đầu tiên, login vào Buddy. Nếu lần đầu bạn sử dụng dịch bị thì chúng ta sẽ thấy trang giới thiệu như dưới đây.

Create một project bằng cách connect với Github và chọn repository bạn đã trước đó.

Đầu tiên bạn cần link Buddy và Github với nhau thành công, chúng ta có thể build một deployment pipeline mới

Gọi pipeline bất cứ khi nào bạn mong muốn với trigger On push Tức là mỗi khi bạn push thì sẽ deploy một lần

Một số action cần được defined. Đầu tiên là build application t ừ source code đã sẵn sàng deployment. Click add the first action và search Node.js. Đàm bảo rằng những command ở dưới sẽ đảm bảo chạy được

yarn // Installing dependencies 
yarn build // Building your application 

Bây giờ, mọi lần push lên repository, thì app của bạn sẽ tự build. Chúng ta cần thêm một số action để build files và deploy chúng lên S3 bucket. Không may mắn là kết nối của Buddy tới AWS không đơn giản như với Github. Bạn cần phải tạo một account đặc biệt, từ đó Buddy có thể control một số resource ở trong AWS account. Ở trong ví dụ, chúng ta muốn Buddy có quyền access và write files vaof bucket mới của bạn.

Di chuyển đến IAM (Identity Access Management) service của AWS và click và Users

Click Add user để thêm username và mình chọn là BuddyClient và chọn Programmatic access

Ở page Permissions click Attach existing policies directly và search AmazonS3FullAccess. Quyền này sẽ cho Buddy có thể write vào bucket và không thể access vào bất cứ AWS resource khác

Click Next và add tags nếu bạn muốn. Cuối cùng, click Create user:

Và bây giờ bạn có thể nhìn thấy Access key IDSecret access key. Copy chúng vào một cẩn thận và "bí mật" tránh bị mất.

Bây giờ chugns ta quay lại Buddy à có thể add thêm action và pipeline. Search "S3"

Một modal sẽ xuất hiện và chúng ta có thể thêm credentials lúc nãy chúng ta tạo ở IAM

Tiếp theo, chúng ta sẽ config action như sau

  1. Set source 'Pipeline Filesystem'
  2. Set ''Source path' đến /build
  3. Set 'Bucket ID' vào bucket mà bạn đã tạo trước đó

Và pipeline của bạn sẽ như thế này

Click Run pipeline để chắc chắn rằng mọi thứ hoạt động ổn định

Để kiểm tra chắc chắn bạn thử thay đổi 1 chút trong code của mình và push thử lên để đảm bảo rằng code của bạn đã được deploy lên S3