Dự án trên AWS

Xây dựng ứng dụng web hiện đại

Triển khai một ứng dụng web, kết nối với cơ sở dữ liệu và phân tích hành vi của người dùng

Mô-đun 2: Lưu trữ ứng dụng trên máy chủ web

Trong mô-đun này, bạn sẽ tạo một vi dịch vụ mới, được lưu trữ bằng AWS Fargate.  

Tổng quan

Trong mô-đun này, bạn sẽ tạo một vi dịch vụ mới, được lưu trữ bằng AWS Fargate để trang web Mythical Mysfits của bạn có thể tích hợp với backend ứng dụng.

AWS Fargate là một tùy chọn triển khai trong Amazon Elastic Container Service (ECS) cho phép bạn triển khai các bộ chứa mà không cần quản lý bất cứ cụm hay máy chủ nào. Với backend Mythical Mysfits, chúng ta sẽ sử dụng Python và tạo ứng dụng Flask trong bộ chứa Docker phía sau Network Load Balancer. Việc này sẽ tạo nên backend vi dịch vụ cho trang web frontend.

Tại sao chúng ta chọn Fargate?

Ở đây, chúng ta chọn Fargate vì đó là lựa chọn tuyệt vời để xây dựng các quy trình dài hạn, như backend vi dịch vụ cho nền tảng web, di động và PaaS. Với Fargate, bạn được quyền kiểm soát các bộ chứa và có thể linh hoạt chọn thời điểm chạy bộ chứa mà không cần lo lắng về việc cung cấp hoặc mở rộng máy chủ. Fargate cho phép bạn toàn quyền kiểm soát việc kết nối mạng, bảo mật và truyền thông giữa các dịch vụ với nhau, đồng thời được tích hợp sẵn với dịch vụ AWS để bảo mật, kết nối mạng, kiểm soát truy cập, cung cấp công cụ dành cho nhà phát triển, giám sát và ghi nhật ký.

Ngoài Fargate, khách hàng còn có tùy chọn sử dụng AWS Lambda để đáp ứng nhu cầu tính toán của mình. Mặc dù cũng mang đến các lợi ích serverless giống như Fargate nhưng Lambda thích hợp với các ứng dụng dựa trên dữ liệu, cần phản hồi trong thời gian thực với những thay đổi trong dữ liệu, thay đổi về trạng thái hệ thống hoặc hành động của người dùng. Chúng ta sẽ thảo luận chi tiết hơn về Lambda trong Mô-đun 5 khi sử dụng dịch vụ này để phân tích hành vi của khách hàng trên trang.

Hướng dẫn thực hiện

Làm theo hướng dẫn từng bước bên dưới để tạo dịch vụ AWS Fargate. Vì mô-đun này lớn nên chúng tôi đã chia thành 3 mô-đun con. Trong mô-đun 2a, bạn sẽ thiết lập cơ sở hạ tầng cốt lõi để chuẩn bị cho việc triển khai dịch vụ. Trong mô-đun 2b, bạn sẽ triển khai dịch vụ bằng AWS Fargate. Cuối cùng, trong mô-đun 2c, bạn sẽ thiết lập triển khai tự động bằng Các dịch vụ mã AWS.

Mô-đun 2A: Thiết lập cơ sở hạ tầng cốt lõi

Trước khi có thể tạo dịch vụ, chúng ta cần tạo môi trường cơ sở hạ tầng cốt lõi sẽ dùng cho dịch vụ, bao gồm cơ sở hạ tầng kết nối mạng trong Amazon VPCVai trò AWS Identity and Access Management xác định các quyền mà ECS và bộ chứa sẽ có trên AWS.

Chúng ta sẽ sử dụng AWS CloudFormation để hoàn thành việc này. AWS CloudFormation là dịch vụ có thể cung cấp theo chương trình tự động các tài nguyên AWS mà bạn tuyên bố trong các tệp JSON hoặc YAML gọi là Mẫu CloudFormation, hỗ trợ biện pháp thực hành tốt nhất phổ biến của cơ sở hạ tầng dưới dạng mã.  

  • Chúng tôi đã cung cấp mẫu CloudFormation để tạo tất cả các tài nguyên Mạng và Bảo mật cần thiết trong /module-2/cfn/core.yml. Mẫu này sẽ tạo ra những tài nguyên sau:

    • Amazon VPC - một môi trường mạng chứa bốn mạng con (hai công khai và hai riêng tư) trong không gian ID riêng tư 10.0.0.0/16, cũng như tất cả các cấu hình Bảng định tuyến cần thiết. Các mạng con của mạng này được tạo trong Vùng sẵn sàng (AZ) AWS riêng để cho phép độ sẵn sàng cao trên nhiều cơ sở thực tại Khu vực AWS. Tìm hiểu thêm về cách AZ có thể giúp bạn đạt được độ sẵn sàng cao.
    • Hai cổng NAT (cho mỗi mạng con công khai) - cho phép các bộ chứa được chúng ta triển khai dần vào các mạng con riêng tư giao tiếp với Internet nhằm tải xuống các gói cần thiết, v.v.
    • Điểm cuối VPC DynamoDB - backend vi dịch vụ của chúng ta cuối cùng sẽ tích hợp với Amazon DynamoDB để duy trì (như một phần trong mô-đun 3).
    • Nhóm bảo mật - Cho phép bộ chứa Docker của bạn nhận lưu lượng truy cập trên cổng 8080 từ Internet thông qua Network Load Balancer.
    • Vai trò IAM - Các vai trò Identity and Access Management được tạo. Các vai trò này sẽ được dùng trong suốt bài hướng dẫn thực hành để cung cấp cho các dịch vụ hoặc tài nguyên AWS bạn tạo quyền truy cập vào các dịch vụ AWS khác như DynamoDB, S3, v.v.

    Để tạo những tài nguyên này, chạy lệnh sau trong terminal Cloud9 (sẽ mất khoảng 10 phút để tạo ngăn xếp):

    aws cloudformation create-stack --stack-name MythicalMysfitsCoreStack --capabilities CAPABILITY_NAMED_IAM --template-body file://~/environment/aws-modern-application-workshop/module-2/cfn/core.yml

    Bạn có thể kiểm tra trạng thái tạo ngăn xếp của mình qua Bảng điều khiển AWS hoặc bằng cách chạy lệnh:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsCoreStack

    Chạy lệnh describe-stacks, cho đến khi bạn thấy trạng thái "StackStatus": "CREATE_COMPLETE"

    describe stacks

    (nhấp để thu phóng)

    Khi bạn nhận được phản hồi này, CloudFormation đã hoàn tất việc cung cấp tất cả tài nguyên bảo mật và kết nối mạng cốt lõi như mô tả ở trên và bạn có thể tiếp tục. Chờ ngăn xếp ở trên hiển thị CREATE_COMPLETE trước khi tiếp tục.

    Bạn sẽ sử dụng các giá trị từ kết quả đầu ra của lệnh này trong suốt phần còn lại của bài hướng dẫn thực hành này. Bạn có thể chạy lệnh sau để trực tiếp xuất lệnh describe-stacks ở trên vào một tệp mới trong IDE, tệp sẽ được lưu trữ với tên cloudformation-core-output.json:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsCoreStack > ~/environment/cloudformation-core-output.json

Mô-đun 2B: Triển khai dịch vụ A với AWS Fargate

Tiếp theo, bạn sẽ tạo hình ảnh bộ chứa Docker, trong đó có tất cả mã và cấu hình cần thiết để chạy backend Mythical Mysfits dưới dạng API vi dịch vụ được tạo bằng Flask. Chúng ta sẽ xây dựng hình ảnh bộ chứa Docker trong Cloud9, sau đó đưa hình ảnh vào Amazon Elastic Container Registry, ta luôn có thể kéo hình ảnh tại đây khi tạo dịch vụ bằng Fargate.

Sơ đồ kiến trúc

trình duyệt đến cân bằng tải đến Fargate
  • A: Xây dựng hình ảnh Docker

    Tất cả mã cần thiết để chạy backend dịch vụ được lưu trữ trong thư mục /module-2/app/ của kho lưu trữ mà bạn đã tạo bản sao vào IDE Cloud9 của mình. Nếu bạn muốn xem lại mã Python dùng Flask để tạo API dịch vụ, hãy xem tệp /module-2/app/service/mythicalMysfitsService.py.

    Docker đã được cài đặt sẵn trên IDE Cloud9 mà bạn tạo, do đó, để xây dựng cục bộ hình ảnh Docker, tất cả những gì chúng ta cần làm là chạy hai lệnh sau trong terminal Cloud9:  

    Trước tiên, đổi thư mục thành ~/environment/module-2/app

    cd ~/environment/aws-modern-application-workshop/module-2/app

    Bạn có thể lấy được ID tài khoản của mình và khu vực mặc định từ kết quả đầu ra của lệnh **describe-stacks CloudFormation trước đó

    Thay thế REPLACE_ME_ACCOUNT_ID bằng ID tài khoản và REPLACE_ME_REGION bằng khu vực mặc định của bạn trong lệnh sau để xây dựng hình ảnh docker bằng tệp Dockerfile, có chứa hướng dẫn Docker. Lệnh này gắn thẻ cho hình ảnh Docker bằng tùy chọn -t, với định dạng thẻ riêng để hình ảnh có thể được đẩy vào dịch vụ Amazon Elastic Container Registry sau đó.

    Sau khi có ID tài khoản, bạn đã sẵn sàng để xây dựng hình ảnh docker:

    docker build . -t REPLACE_ME_AWS_ACCOUNT_ID.dkr.ecr.REPLACE_ME_REGION.amazonaws.com/mythicalmysfits/service:latest

    Bạn sẽ thấy docker tải xuống và cài đặt tất cả các gói phụ thuộc cần thiết mà ứng dụng của chúng ta cần và xuất thẻ cho hình ảnh đã tích hợp. Sao chép thẻ hình ảnh để tham khảo sau này. Bên dưới thẻ ví dụ hiển thị: 111111111111.dkr.ecr.us-east-1.amazonaws.com/mythicalmysfits/service:latest

    Successfully built 8bxxxxxxxxab
    Successfully tagged 111111111111.dkr.ecr.us-east-1.amazonaws.com/mythicalmysfits/service:latest
    B: Kiểm tra dịch vụ cục bộ

    Hãy kiểm tra cục bộ hình ảnh của chúng ta trong Cloud9 để đảm bảo mọi thứ vẫn hoạt động như dự kiến. Sao chép thẻ hình ảnh được tạo ra từ lệnh trước đó và chạy lệnh sau đây để triển khai “cục bộ” bộ chứa (thực chất đã nằm tại IDE Cloud9 bên trong AWS!):

    docker run -p 8080:8080 REPLACE_ME_WITH_DOCKER_IMAGE_TAG

    Kết quả là bạn sẽ thấy Docker báo cáo rằng bộ chứa của bạn đang hoạt động cục bộ:

     * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

    Để kiểm tra dịch vụ bằng yêu cầu cục bộ, chúng ta sẽ mở trình duyệt web tích hợp sẵn trong IDE Cloud9 có thể dùng để xem trước các ứng dụng đang chạy trên phiên bản IDE.

    Để mở trình duyệt web xem trước, chọn Xem trước > Xem trước ứng dụng đang chạy trên thanh menu Cloud9:

    preview-menu

     

    Thao tác này sẽ mở ra một bảng khác trong IDE, trình duyệt web có sẵn ở đó. Gắn thêm /mysfits vào cuối URL trong thanh địa chỉ của trình duyệt xem trước và bấm ENTER:

    address-bar

    Nếu thành công, bạn sẽ thấy phản hồi từ dịch vụ trả về tài liệu JSON được lưu trữ tại `/aws-modern-application-workshop/module-2/app/service/mysfits-response.json`

    Khi kiểm tra dịch vụ xong, bạn có thể ngừng kiểm tra bằng cách nhấn CTRL-c trên PC hoặc Mac.

    C: Đẩy hình ảnh Docker vào Amazon ECR

    Khi kiểm tra dịch vụ cục bộ thành công, chúng ta đã sẵn sàng tạo kho lưu trữ hình ảnh bộ chứa trong Amazon Elastic Container Registry (Amazon ECR) và đẩy hình ảnh vào đó. Để tạo registry, hãy chạy lệnh sau, việc này sẽ tạo kho lưu trữ mới trong registry AWS ECR mặc định được tạo cho tài khoản của bạn.

    aws ecr create-repository --repository-name mythicalmysfits/service

    Phản hồi cho lệnh này sẽ chứa siêu dữ liệu bổ sung về kho lưu trữ đã tạo. Để đẩy hình ảnh bộ chứa vào kho lưu trữ mới, chúng ta sẽ cần lấy được thông tin xác thực của máy khách Docker cho kho lưu trữ.

    Chạy lệnh sau, thao tác này sẽ trả về lệnh đăng nhập để truy xuất thông tin xác thực của máy khách Docker, sau đó tự động thực thi lệnh (đưa vào lệnh đầy đủ có cả $ bên dưới). Thông báo ‘Đăng nhập thành công' sẽ hiển thị khi chạy lệnh thành công.

    $(aws ecr get-login --no-include-email)

    Tiếp theo, đẩy hình ảnh bạn tạo vào kho lưu trữ ECR bằng thẻ đã sao chép ở trên. Sử dụng lệnh này, Docker sẽ đẩy vào Amazon ECR hình ảnh của bạn và tất cả hình ảnh mà hình ảnh của bạn phụ thuộc vào:

    docker push REPLACE_ME_WITH_DOCKER_IMAGE_TAG

    Chạy lệnh sau để xem hình ảnh Docker mới đẩy vào, được lưu trữ trong kho lưu trữ ECR:

    aws ecr describe-images --repository-name mythicalmysfits/service
  • A: Tạo cụm AWS

    Giờ, chúng ta đã có sẵn hình ảnh trong ECR để triển khai cho dịch vụ được lưu trữ trên Amazon ECS bằng AWS Fargate. Dịch vụ tương tự mà bạn đã kiểm tra cục bộ qua terminal trong Cloud9 như một phần của mô-đun cuối giờ sẽ được triển khai trên đám mây và được cung cấp công khai phía sau Network Load Balancer.

    Trước tiên, chúng ta sẽ tạo cụm trong Amazon Elastic Container Service (ECS). Cụm này đại diện cho cụm “máy chủ” mà bộ chứa dịch vụ của bạn sẽ được triển khai vào. Máy chủ nằm trong "dấu ngoặc kép" vì bạn sẽ sử dụng AWS Fargate. Fargate cho phép bạn chỉ định rằng bộ chứa của bạn được triển khai vào cụm mà không cần thực sự cung cấp hay quản lý bất kỳ máy chủ nào.

    Để tạo cụm mới trong ECS, chạy lệnh sau:

    aws ecs create-cluster --cluster-name MythicalMysfits-Cluster
    B: Tạo nhóm AWS CloudWatch Logs

    Tiếp theo, chúng ta sẽ tạo nhóm nhật ký mới trong AWS CloudWatch Logs. AWS CloudWatch Logs là dịch vụ để thu thập và phân tích nhật ký. Các nhật ký mà bộ chứa của bạn tạo sẽ tự động được đẩy vào AWS CloudWatch Logs như một phần của nhóm cụ thể này. Việc này đặc biệt quan trọng khi sử dụng AWS Fargate vì bạn sẽ không thể truy cập vào cơ sở hạ tầng máy chủ có bộ chứa đang chạy.

    Để tạo nhóm nhật ký mới trong CloudWatch Logs, chạy lệnh sau:

    aws logs create-log-group --log-group-name mythicalmysfits-logs
    C: Đăng ký định nghĩa tác vụ ECS

    Sau khi đã tạo cụm và xác định nhóm nhật ký làm nơi để đẩy nhật ký bộ chứa vào, chúng ta đã sẵn sàng đăng ký một định nghĩa tác vụ ECS. Tác vụ trong ECS là tập hợp hình ảnh bộ chứa sẽ được lên lịch cùng nhau. Định nghĩa tác vụ tuyên bố tập hợp bộ chứa, tài nguyên và cấu hình mà những bộ chứa đó yêu cầu. Bạn sẽ sử dụng AWS CLI để tạo định nghĩa tác vụ mới về cách thức lên lịch hình ảnh bộ chứa mới cho cụm ECS mà chúng ta vừa tạo.

    Tệp JSON đã được cung cấp sẽ hoạt động như nội dung đầu vào cho lệnh CLI.

    Mở ~/environment/aws-modern-application-workshop/module-2/aws-cli/task-definition.json trong IDE.

    Thay thế giá trị đã cho bằng giá trị thích hợp từ các tài nguyên bạn đã tạo.

    Những giá trị này sẽ được kéo từ phản hồi CloudFormation mà bạn sao chép trước đó cũng như thẻ hình ảnh docker mà trước đó bạn đã đẩy vào ECR, ví dụ: REPLACE_ME_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/mythicalmysfits/service:latest

    Sau khi bạn đã thay thế giá trị trong task-defintion.json và lưu. Hãy thực thi lệnh sau để đăng ký định nghĩa tác vụ mới trong ECS:

    aws ecs register-task-definition --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/task-definition.json
  • A: Tạo Network Load Balancer

    Sau khi đăng ký định nghĩa tác vụ mới, chúng ta đã sẵn sàng cung cấp cơ sở hạ tầng cần thiết trong ngăn xếp dịch vụ. Thay vì trực tiếp hiển thị dịch vụ với Internet, chúng ta sẽ cung cấp một Network Load Balancer (NLB) nằm trước bậc dịch vụ của mình. Việc này sẽ cho phép mã trang web frontend của chúng ta giao tiếp với một tên DNS duy nhất trong khi dịch vụ backend tự do điều chỉnh quy mô một cách linh hoạt dựa trên nhu cầu hoặc nếu xảy ra lỗi và cần cung cấp các bộ chứa mới.

    Để cung cấp NLB mới, thực thi lệnh CLI sau trong terminal Cloud9 (truy xuất subnetId từ kết quả đầu ra CloudFormation bạn đã lưu):

    aws elbv2 create-load-balancer --name mysfits-nlb --scheme internet-facing --type network --subnets REPLACE_ME_PUBLIC_SUBNET_ONE REPLACE_ME_PUBLIC_SUBNET_TWO > ~/environment/nlb-output.json

    Khi thực hiện lệnh này thành công, một tệp mới tên là nlb-output.json sẽ được tạo trong IDE. Bạn sẽ sử dụng DNSName, VpcId và LoadBalancerArn ở các bước sau.

    B: Tạo nhóm mục tiêu cân bằng tải

    Tiếp theo, sử dụng CLI để tạo nhóm mục tiêu NLB. Nhóm mục tiêu cho phép các tài nguyên AWS tự đăng ký dưới dạng mục tiêu cho yêu cầu mà cân bằng tải nhận để chuyển tiếp. Bộ chứa dịch vụ của chúng ta sẽ tự động đăng ký với mục tiêu này để chúng có thể nhận được lưu lượng truy cập từ NLB khi được cung cấp. Lệnh này bao gồm một giá trị cần được thay thế, chính là vpc-id của bạn, có thể được tìm thấy dưới dạng giá trị trong kết quả đầu ra MythicalMysfitsCoreStack đã lưu trước đó mà CloudFormation trả về.

    aws elbv2 create-target-group --name MythicalMysfits-TargetGroup --port 8080 --protocol TCP --target-type ip --vpc-id REPLACE_ME_VPC_ID --health-check-interval-seconds 10 --health-check-path / --health-check-protocol HTTP --healthy-threshold-count 3 --unhealthy-threshold-count 3 > ~/environment/target-group-output.json

    Khi thực hiện xong lệnh này, kết quả đầu ra của lệnh sẽ được lưu vào target-group-output.json trong IDE của bạn. Bạn sẽ tham chiếu giá trị TargetGroupArn trong bước tiếp theo.

    C: Tạo listener cân bằng tải

    Tiếp theo, sử dụng CLI để tạo listener cân bằng tải cho NLB. Thao tác này cho cân bằng tải biết rằng hãy chuyển tiếp các yêu cầu nhận được trên một cổng cụ thể tới mục tiêu đã được đăng ký với nhóm mục tiêu ở trên. Hãy nhớ thay thế hai giá trị đã cho bằng ARN thích hợp từ TargetGroup và NLB mà bạn lưu từ các bước trước đó:

    aws elbv2 create-listener --default-actions TargetGroupArn=REPLACE_ME_NLB_TARGET_GROUP_ARN,Type=forward --load-balancer-arn REPLACE_ME_NLB_ARN --port 80 --protocol TCP
  • A: Tạo vai trò liên kết với dịch vụ cho ECS

    Nếu trước đây bạn đã sử dụng ECS, bạn có thể bỏ qua bước này và chuyển sang bước tiếp theo. Nếu trước đây bạn chưa bao giờ sử dụng ECS, chúng ta cần tạo một **vai trò liên kết với dịch vụ** trong IAM cấp cho chính dịch vụ ECS quyền đưa ra yêu cầu API ECS trong tài khoản của bạn. Đây là yêu cầu bắt buộc vì khi bạn tạo dịch vụ trong ECS, dịch vụ sẽ gọi các API trong tài khoản của bạn để thực hiện các hành động như kéo hình ảnh Docker, tạo tác vụ mới, v.v.

    Nếu không tạo vai trò này, dịch vụ ECS sẽ không được cấp quyền để thực hiện các hành động cần thiết. Để tạo vai trò, thực thi lệnh sau trong terminal của bạn:  

    aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com

    Nếu lệnh ở trên trả về lỗi đã có vai trò này, bạn có thể bỏ qua vì lỗi này cho biết vai trò đã tự động được tạo trong tài khoản rồi.

    B: Tạo dịch vụ

    Sau khi đã tạo và đặt cấu hình cho NLB cũng như cấp cho dịch vụ ECS quyền thích hợp, chúng ta đã sẵn sàng tạo **dịch vụ** ECS thực sự, nơi các bộ chứa sẽ chạy và tự đăng ký với cân bằng tải để nhận lưu lượng truy cập. Chúng tôi đã đính kèm tệp JSON cho nội dung đầu vào CLI ở: `~/environment/aws-modern-application-workshop/module-2/aws-cli/service-definition.json`. Tệp này chứa tất cả thông tin chi tiết về cấu hình cho dịch vụ cần tạo, trong đó cho biết rằng dịch vụ này sẽ được khởi chạy bằng **AWS Fargate** - nghĩa là bạn không cần cung cấp bất kỳ máy chủ nào trong cụm mục tiêu. Các bộ chứa đã được lên lịch dưới dạng một phần của tác vụ dùng trong dịch vụ này sẽ chạy trên cụm do AWS toàn quyền quản lý.

    Mở ~/environment/aws-modern-application-workshop/module-2/aws-cli/service-definition.json trong IDE và thay thế giá trị đã cho của REPLACE_ME. Lưu tệp, rồi chạy lệnh sau để tạo dịch vụ:

    aws ecs create-service --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/service-definition.json
    C: Kiểm tra dịch vụ

    Sao chép tên DNS mà bạn lưu khi tạo NLB và gửi yêu cầu tới đó bằng cách sử dụng trình duyệt xem trước trong Cloud9 (hoặc bằng trình duyệt web bất kỳ, vì lúc này dịch vụ của chúng ta đã khả dụng trên Internet). Thử gửi yêu cầu tới tài nguyên mysfit:

    http://mysfits-nlb-123456789-abc123456.elb.us-east-1.amazonaws.com/mysfits

    Nếu phản hồi hiển thị chính là phản hồi JSON chúng ta đã nhận được khi kiểm tra bộ chứa Docker cục bộ trong Cloud9 thì nghĩa là API Flask của bạn đang hoạt động trên AWS Fargate.

    Lưu ý: Network Load Balancer này chỉ hỗ trợ các yêu cầu HTTP (http://) vì chưa có chứng chỉ SSL/TLS nào được cài đặt trên đó. Với hướng dẫn này, hãy nhớ chỉ gửi yêu cầu bằng http://, các yêu cầu bằng https:// sẽ không hoạt động đúng cách.

  • A: Thay thế điểm cuối API

    Tiếp theo, chúng ta cần tích hợp trang web của mình với backend API mới thay vì sử dụng dữ liệu mã hóa cứng mà chúng ta đã tải lên S3 trước đó. Bạn sẽ cần cập nhật tệp sau để sử dụng cùng URL NLB cho các lệnh gọi API (không bao gồm đường dẫn /mysfits): /module-2/web/index.html

    Mở tệp trong Cloud9 và thay thế vùng được tô sáng bên dưới trong dấu ngoặc kép bằng URL NLB:

    before-replace

    Sau khi dán, dòng này sẽ trông như sau:

    after-replace
    B: Tải lên S3

    Để tải tệp này lên trang web lưu trữ S3 của bạn, sử dụng lại tên bộ chứa đã được tạo trong Mô-đun 1, rồi chạy lệnh sau:

    aws s3 cp ~/environment/aws-modern-application-workshop/module-2/web/index.html s3://INSERT-YOUR-BUCKET-NAME/index.html

    Mở trang web của bạn bằng chính URL dùng ở cuối Mô-đun 1 để xem trang web Mythical Mysfits mới, đang truy xuất dữ liệu JSON từ API Flask chạy trong bộ chứa Docker được triển khai với AWS Fargate!

Mô-đun 2C: Tự động hóa việc triển khai bằng Các dịch vụ mã AWS

Khi đã có một dịch vụ đang hoạt động, bạn có thể nghĩ đến việc thực hiện thay đổi mã theo cách mình muốn cho dịch vụ Flask. Tốc độ phát triển của bạn có thể bị kìm hãm nếu bạn phải thực hiện tất cả các bước tương tự như trên mỗi khi muốn triển khai một tính năng mới cho dịch vụ của mình. Đó là khi Tích hợp liên tục và Chuyển giao liên tục hay còn gọi là CI/CD xuất hiện!

Trong mô-đun này, bạn sẽ tạo ngăn xếp CI/CD được quản lý đầy đủ, ngăn xếp này sẽ tự động truyền tất cả thay đổi về mã mà bạn thực hiện với cơ sở mã tới dịch vụ bạn đã tạo trong mô-đun cuối cùng.

Sơ đồ kiến trúc

xây dựng kiến trúc trang web động - cloud9, công cụ mã, fargate
  • A: Tạo bộ chứa S3 cho thành phần lạ trong quy trình

    Chúng ta sẽ cần tạo một bộ chứa S3 khác, dùng để lưu trữ thành phần lạ tạm thời được tạo trong quá trình thực thi quy trình CI/CD. Chọn một tên bộ chứa mới cho những thành phần lạ này và tạo tên bộ chứa bằng lệnh CLI sau:

    aws s3 mb s3://REPLACE_ME_CHOOSE_ARTIFACTS_BUCKET_NAME

    Tiếp theo, bộ chứa này cần có chính sách bộ chứa để xác định quyền cho dữ liệu được lưu trữ trong đó. Nhưng không giống bộ chứa trang web mà ai cũng có thể truy cập của chúng ta, bộ chứa này chỉ cho phép quy trình CI/CD truy cập. Chúng tôi đã cung cấp tệp JSON cần thiết cho chính sách này tại ~/environment/aws-modern-application-workshop/module-2/aws-cli/artifacts-bucket-policy.json.

    Mở tệp này và bạn sẽ cần thay thế một vài chuỗi trong đó để đưa vào các ARN đã được tạo trong MythicalMysfitsCoreStack lúc trước, cũng như tên bộ chứa mới chọn cho thành phần lạ CI/CD.

    Sau khi bạn sửa đổi và lưu tệp này, hãy thực thi lệnh sau để cấp cho quy trình CI/CD quyền truy cập vào bộ chứa này:

    aws s3api put-bucket-policy --bucket REPLACE_ME_ARTIFACTS_BUCKET_NAME --policy file://~/environment/aws-modern-application-workshop/module-2/aws-cli/artifacts-bucket-policy.json
    B: Tạo kho lưu trữ CodeCommit

    Bạn sẽ cần một chỗ để đẩy và lưu trữ mã. Tạo **kho lưu trữ AWS CodeCommit** bằng CLI cho mục đích sau:

    aws codecommit create-repository --repository-name MythicalMysfitsService-Repository
    C: Tạo dự án CodeBuild

    Khi đã có kho lưu trữ để lưu trữ mã và bộ chứa S3 để dùng cho thành phần lạ CI/CD, hãy thêm vào ngăn xếp CI/CD theo cách để quá trình xây dựng dịch vụ diễn ra. Việc này sẽ được thực hiện bằng cách tạo dự án AWS CodeBuild. Bất cứ khi nào hoạt động thực thi xây dựng được kích hoạt, AWS CodeBuild sẽ tự động cung cấp một máy chủ xây dựng cho cấu hình của chúng ta và thực thi các bước cần thiết để xây dựng hình ảnh Docker và đẩy một phiên bản mới của hình ảnh vào kho lưu trữ ECR đã tạo (rồi giảm tốc độ quay của máy chủ khi xây dựng xong).

    Các bước xây dựng (gói mã Python và dựng/đẩy bộ chứa Docker) có trong tệp ~/environment/aws-modern-application-workshop/module-2/app/buildspec.yml. Bạn tạo tệp buildspec.yml để hướng dẫn cho CodeBuild các bước cần thực hiện cho quá trình thực thi xây dựng trong dự án CodeBuild.

    Để tạo dự án CodeBuild, cần phải cập nhật các tham số đặc thù với tài nguyên của bạn cho một tệp đầu vào CLI khác. Tệp này nằm ở ~/environment/aws-modern-application-workshop/module-2/aws-cli/code-build-project.json. Tương tự, thay thế các giá trị trong tệp này như bạn đã làm trước đó từ MythicalMysfitsCoreStackOutput. Sau khi lưu, thực thi lệnh sau với CLI để tạo dự án:

    aws codebuild create-project --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/code-build-project.json
    D: Tạo quy trình CodePipeline

    Cuối cùng, chúng ta cần một cách để tích hợp liên tục kho lưu trữ CodeCommit với dự án CodeBuild để quá trình xây dựng tự động diễn ra bất cứ khi nào thay đổi về mã được đẩy vào kho lưu trữ. Sau đó, chúng ta cần một phương pháp để liên tục truyền những thành phần lạ mới xây dựng đó vào dịch vụ trong ECS. AWS CodePipeline là dịch vụ kết hợp những hành động này lại với nhau trong quy trình mà bạn sẽ tạo tiếp theo.

    Quy trình của bạn trong CodePipeline sẽ chỉ thực hiện những điều tôi đã mô tả ở trên. Bất cứ khi nào thay đổi về mã được đẩy vào kho lưu trữ CodeCommit của bạn, CodePipeline sẽ truyền mã mới nhất vào dự án AWS CodeBuild để quá trình xây dựng diễn ra. Sau khi được CodeBuild xây dựng thành công, CodePipeline sẽ thực hiện việc triển khai với ECS bằng hình ảnh bộ chứa mới nhất mà quá trình thực thi CodeBuild đẩy vào ECR.

    Tất cả những bước này đều được xác định trong tệp JSON được cung cấp, bạn sẽ sử dụng tệp này để làm nội dung đầu vào cho AWS CLI nhằm tạo quy trình. Tệp này nằm ở ~/environment/aws-modern-application-workshop/module-2/aws-cli/code-pipeline.json, hãy mở tệp và thay thế các thuộc tính cần thiết trong đó, rồi lưu tệp.

    Sau khi lưu xong, tạo một quy trình trong CodePipeline với lệnh sau:

    aws codepipeline create-pipeline --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/code-pipeline.json
    E: Cho phép truy cập tự động vào kho lưu trữ hình ảnh ECR

    Chúng ta còn một bước cuối cùng trước khi quy trình CI/CD có thể thực thi khép kín thành công. Khi có sẵn quy trình CI/CD, bạn sẽ không cần đẩy thủ công hình ảnh bộ chứa vào ECR nữa. Bây giờ, CodeBuild sẽ đẩy hình ảnh mới.

    Chúng ta cần cấp cho CodeBuild quyền thực hiện hành động trên kho lưu trữ hình ảnh với chính sách về kho lưu trữ ECR*. Bạn cần cập nhật cho tài liệu chính sách này ARN cụ thể của vai trò CodeBuild do MythicalMysfitsCoreStack tạo. Tài liệu chính sách nằm tại ~/environment/aws-modern-application-workshop/module-2/aws-cli/ecr-policy.json.

    Cập nhật và lưu tệp này, sau đó chạy lệnh sau để tạo chính sách:

    aws ecr set-repository-policy --repository-name mythicalmysfits/service --policy-text file://~/environment/aws-modern-application-workshop/module-2/aws-cli/ecr-policy.json

    Khi tạo chính sách thành công, bạn có quy trình CI/CD hoạt động khép kín để tự động truyền các thay đổi về mã tới dịch vụ trong ECS.

  • A: Sử dụng Git với AWS CodeCommit

    Để kiểm tra quy trình mới, chúng ta cần đặt cấu hình git trong IDE Cloud9 và tích hợp git với kho lưu trữ CodeCommit.

    AWS CodeCommit cung cấp trình trợ giúp thông tin xác thực cho git mà chúng ta sẽ dùng để tích hợp dễ dàng.

    Chạy các lệnh sau theo trình tự trên terminal để đặt cấu hình git cần dùng với AWS CodeCommit (sẽ không báo cáo bất kỳ phản hồi nào nếu thành công):

    git config --global user.name "REPLACE_ME_WITH_YOUR_NAME"
    git config --global user.email REPLACE_ME_WITH_YOUR_EMAIL@example.com
    git config --global credential.helper '!aws codecommit credential-helper $@'
    git config --global credential.UseHttpPath true

    Tiếp theo, đổi các thư mục trong IDE thành thư mục môi trường bằng terminal:

    cd ~/environment/

    Giờ thì chúng ta đã sẵn sàng để tạo bản sao kho lưu trữ bằng lệnh terminal sau:

    git clone https://git-codecommit.REPLACE_REGION.amazonaws.com/v1/repos/MythicalMysfitsService-Repository

    Điều này sẽ cho chúng ta biết rằng kho lưu trữ đang trống! Hãy sửa lỗi đó bằng cách sao chép các tệp ứng dụng vào thư mục kho lưu trữ bằng lệnh sau:

    cp -r ~/environment/aws-modern-application-workshop/module-2/app/* ~/environment/MythicalMysfitsService-Repository/
    B: Đẩy một thay đổi về mã

    Giờ thì mã dịch vụ hoàn thiện mà chúng ta dùng để tạo dịch vụ Fargate trong Mô-đun 2 đã được lưu trữ trong kho lưu trữ cục bộ mà chúng ta vừa tạo bản sao từ AWS CodeCommit. Hãy thực hiện thay đổi với dịch vụ Flask trước khi chuyển các thay đổi để chứng minh rằng quy trình CI/CD mà chúng ta tạo đang hoạt động. Trong Cloud9, mở tệp được lưu trữ trong ~/environment/MythicalMysfitsService-Repository/service/mysfits-response.json và thay đổi tuổi của một trong các mysfit thành một giá trị khác, rồi lưu tệp.

    Sau khi lưu tệp, thay đổi các thư mục thành thư mục kho lưu trữ mới:

    cd ~/environment/MythicalMysfitsService-Repository/

    Sau đó, chạy lệnh git sau để đẩy thay đổi về mã vào.

    git add .
    git commit -m "I changed the age of one of the mysfits."
    git push

    Sau khi thay đổi được đẩy vào kho lưu trữ, bạn có thể mở dịch vụ CodePipeline trong Bảng điều khiển AWS để xem các thay đổi được truyền qua quy trình CI/CD. Sau khi chuyển thay đổi về mã, sẽ mất khoảng 5 đến 10 phút để thay đổi được triển khai cho dịch vụ trực tiếp đang chạy trong Fargate của bạn.

    Trong lúc này, AWS CodePipeline sẽ điều phối việc kích hoạt thực thi quy trình khi các thay đổi đã được kiểm nhập vào kho lưu trữ CodeCommit, kích hoạt dự án CodeBuild để bắt đầu một bản dựng mới và truy xuất hình ảnh docker đã được CodeBuild đẩy vào ECR, cũng như thực hiện hành động Dịch vụ cập nhật ECS tự động nhằm rút kết nối của các bộ chứa hiện tại đang chạy trong dịch vụ của bạn và thay thế chúng bằng hình ảnh mới xây dựng. Làm mới trang web Mythical Mysfits trong trình duyệt để xem các thay đổi đã có hiệu lực.

    Bạn có thể xem tiến độ thay đổi về mã thông qua bảng điều khiển CodePipeline ở đây (không cần thực hiện hành động gì, chỉ cần xem hoạt động tự động diễn ra!): AWS CodePipeline

    Mô-đun 2 kết thúc tại đây.

Tiếp theo, lưu trữ dữ liệu mysfit.