paint-brush
Hướng dẫn xây dựng quy trình CICD và API AWS Serverlesstừ tác giả@pchandel09
6,800 lượt đọc
6,800 lượt đọc

Hướng dẫn xây dựng quy trình CICD và API AWS Serverless

từ tác giả Puneet Chandel11m2023/10/27
Read on Terminal Reader

dài quá đọc không nổi

Bài viết này trình bày quá trình phát triển Serverless API sử dụng các dịch vụ AWS và thiết lập quy trình Tích hợp liên tục/Triển khai liên tục (CICD) trong môi trường AWS.
featured image - Hướng dẫn xây dựng quy trình CICD và API AWS Serverless
Puneet Chandel HackerNoon profile picture


Tổng quan

Bài viết này trình bày quá trình phát triển Serverless API sử dụng các dịch vụ AWS và thiết lập quy trình Tích hợp liên tục/Triển khai liên tục (CICD) trong môi trường AWS.


Phần 1: Tìm hiểu cách tạo hàm Lambda để xử lý các yêu cầu từ Cổng API và duy trì dữ liệu trong DynamoDB bằng Mô hình ứng dụng phi máy chủ.


Phần 2: Chi tiết các bước cần thiết để đặt cấu hình kho lưu trữ CodeCommit trong AWS và thiết lập quy trình CICD tự động khởi tạo quy trình xây dựng khi gửi các thay đổi mới tới kho lưu trữ.

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

Đối với dự án này, bạn sẽ cần có tài khoản AWS (Cấp miễn phí là đủ). Các thành phần AWS sau sẽ được sử dụng:


  • Cổng API AWS
  • AWS Lambda
  • AWS DynamoDB
  • Cam kết mã AWS
  • Xây dựng mã AWS
  • Đường dẫn mã AWS
  • AWS S3
  • Linh tinh - CloudWatch, IAM, v.v.


Đảm bảo bạn đã thiết lập môi trường phát triển cục bộ của mình như sau:


  1. Cài đặt AWS CLI : Làm theo hướng dẫn tại đây để cài đặt Giao diện dòng lệnh AWS.


  2. Cài đặt AWS SAM (Mô hình ứng dụng không có máy chủ) : Cài đặt SAM CLI bằng cách làm theo hướng dẫn tại đây .


  3. Chọn một IDE : Sử dụng IntelliJ hoặc một IDE tương tự để phát triển. Tôi thích IntelliJ hơn


  4. Maven để đóng gói : Đảm bảo bạn đã cài đặt Maven để đóng gói ứng dụng của mình.


  5. Tùy chọn: Docker (nếu bạn cần kiểm tra các hàm Lambda cục bộ): Cài đặt Docker nếu bạn định kiểm tra các hàm Lambda cục bộ.


Những công cụ và thành phần này sẽ tạo thành nền tảng của dự án.

Phần 1: Phát triển

Trong phần này, chúng ta sẽ thấy quy trình tạo dự án khởi đầu bằng AWS SAM, bao gồm hoàn thành lớp xử lý, xây dựng, triển khai lên AWS và tiến hành thử nghiệm bằng Postman


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

  1. Thiết lập AWS :

    Đi tới bảng điều khiển AWS tại https://aws.amazon.com/console/ , Đăng nhập bằng thông tin xác thực người dùng quản trị viên của bạn.

    1. Tạo người dùng trong IAM :
      • Trong IAM, tạo người dùng dành riêng cho việc phát triển cục bộ và sử dụng CLI/SAM.
    2. Tạo bảng DynamoDB :
      • Tên: "người dùng", Khóa chính: "id" (Loại: Chuỗi)
  2. Định cấu hình AWS CLI trên Máy cục bộ :

    • Mở terminal và chạy $ aws configure
    • Cung cấp khóa truy cập cho người dùng IAM đã tạo trước đó và các giá trị mặc định khác
  3. Khởi tạo Dự án bằng Mô hình ứng dụng phi máy chủ AWS (SAM) :

    • Mở terminal của bạn và chạy $ sam init
    • Chọn mẫu bắt đầu nhanh AWS.
    • Chọn ví dụ "Xin chào thế giới".
    • Chọn Java 11 hoặc 17, loại gói dưới dạng zip và sử dụng Maven làm trình quản lý phụ thuộc.
    • Cho phép ghi nhật ký và giám sát bằng CloudWatch và XRay.
  4. Đổi tên dự án : Đổi tên dự án thành tên ưa thích của bạn.

  5. Mở Dự án trong IntelliJ : Khởi chạy IntelliJ và mở dự án.

  6. Thêm phụ thuộc vào pom.xml :

    • Thêm các phần phụ thuộc cần thiết vào tệp pom.xml . Bạn chỉ cần thêm DynamoDB vì các phần phụ thuộc khác sẽ được SAM tự động đưa vào.

       <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.12.573</version> </dependency> </dependencies>



Viết lớp xử lý

Đối với hàm lambda, hãy chỉnh sửa lớp trình xử lý do sam tạo tự động và thêm mã sau đây; đây là một mã đơn giản và đối với các dự án thực tế, bạn có thể muốn sử dụng nhiều mã mô-đun hơn.

 public class UserRequestHandler implements RequestHandler<Map<String,String>, Map<String,String>> { private AmazonDynamoDB amazonDynamoDB; private String DYNAMODB_TABLE_NAME = "users"; private Regions REGION = Regions.US_EAST_1; @Override public Map<String,String> handleRequest(Map<String,String> input, Context context) { this.initDynamoDbClient(); LambdaLogger logger = context.getLogger(); logger.log("Input payload:" + input.toString()); String userId = UUID.randomUUID().toString(); String firstName= input.get("firstName"); String lastName= input.get("lastName"); Map<String, AttributeValue> attributesMap = new HashMap<>(); attributesMap.put("id", new AttributeValue(userId)); attributesMap.put("firstName", new AttributeValue(firstName)); attributesMap.put("lastName", new AttributeValue(lastName)); logger.log(attributesMap.toString()); amazonDynamoDB.putItem(DYNAMODB_TABLE_NAME, attributesMap); Map<String, String> response = new HashMap<>(); response.put("id", userId); response.put("firstName", firstName); response.put("lastName", lastName); return response; } private void initDynamoDbClient() { this.amazonDynamoDB = AmazonDynamoDBClientBuilder.standard() .withRegion(REGION) .build(); } }


Cập nhật tệp mẫu SAM

Tệp mẫu SAM đóng vai trò then chốt trong việc xây dựng và triển khai các thay đổi đối với AWS. Cập nhật tập tin cho dự án. Các thành phần chính cần tập trung vào trong tệp này là tên hàm Lambda và điểm cuối Cổng API. Chúng đóng vai trò trung tâm đối với chức năng của ứng dụng serverless của bạn.


 AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > pc-aws-user-api Sample SAM Template for pc-aws-user-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 20 MemorySize: 128 Tracing: Active Api: TracingEnabled: true Resources: UserRequestHandlerLambdaFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: PcAwsUsersApi Handler: com.pc.aws.users.UserRequestHandler::handleRequest Runtime: java11 Architectures: - x86_64 MemorySize: 512 Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: PARAM1: VALUE JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1 # More info about tiered compilation https://aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /users Method: post ApplicationResourceGroup: Type: AWS::ResourceGroups::Group Properties: Name: Fn::Sub: ApplicationInsights-SAM-${AWS::StackName} ResourceQuery: Type: CLOUDFORMATION_STACK_1_0 ApplicationInsightsMonitoring: Type: AWS::ApplicationInsights::Application Properties: ResourceGroupName: Ref: ApplicationResourceGroup AutoConfigurationEnabled: 'true' Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api PcAwsUsersApi: Description: API Gateway endpoint URL for Prod stage Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users/" UserRequestHandlerLambdaFunction: Description: Lambda Function ARN Value: !GetAtt UserRequestHandlerLambdaFunction.Arn UserRequestHandlerLambdaFunctionIamRole: Description: Implicit IAM Role created Value: !GetAtt UserRequestHandlerLambdaFunctionRole.Arn


Xây dựng và triển khai mã bằng SAM

Trong IntelliJ, mở terminal và thực hiện các lệnh sau:

$ sam build

$ sam deploy –guided


Khi được nhắc, hãy cung cấp tên Ngăn xếp là "PcAwsUsersApi" và chọn các tùy chọn mặc định.


Đầu ra sẽ hiển thị ngăn xếp CloudFormation đã được tạo và cũng sẽ cung cấp điểm cuối API Gateway.

Kiểm tra API

Trước khi thử nghiệm API, hãy cấp cho DynamoDB quyền truy cập vào vai trò Lambda do SAM tạo.

  • Mở hàm Lambda trong Bảng điều khiển AWS.


  • Điều hướng đến "Quyền" và tìm tên vai trò.


  • Thêm quyền "DynamoDBFullAccess" cho vai trò này.


Bước này đảm bảo rằng hàm Lambda có các quyền cần thiết để tương tác với DynamoDB.




Điều hướng đến API Gateway, sau đó làm theo các bước sau để lấy URL cho dịch vụ của bạn:

  1. Đi tới Cổng API trong Bảng điều khiển AWS.

  2. Chọn API của bạn.

  3. Trong thanh bên trái, nhấp vào "Giai đoạn".

  4. Trong "Giai đoạn", chọn giai đoạn "Prod".

  5. Trong phần Trình chỉnh sửa sân khấu, bạn sẽ tìm thấy "URL gọi". Sao chép URL này.



  • Khởi chạy ứng dụng Người đưa thư.
  • Tạo một yêu cầu POST: Thiết lập một yêu cầu mới với các chi tiết sau:
    • Phương pháp: ĐĂNG
    • URL: Dán URL điểm cuối Cổng API thu được trước đó.
  • Đặt tiêu đề: Thêm bất kỳ tiêu đề cần thiết nào (ví dụ: Content-Type: application/json ).


  • Thêm nội dung yêu cầu: Tạo một đối tượng JSON thể hiện dữ liệu người dùng mà bạn muốn gửi trong yêu cầu. Đây sẽ là dữ liệu bạn mong muốn được lưu trữ trong DynamoDB.


Phần II Triển khai quy trình CICD

Trong phần này, chúng tôi sẽ trình bày cách xây dựng quy trình CICD bằng AWS CodeCommit, CodeBuild và CodePipeline. Quy trình sẽ bắt đầu quy trình xây dựng để tìm nạp mã từ kho lưu trữ, xây dựng mã bằng tệp bản dựng và kích hoạt CloudFormation để tạo ngăn xếp.


Tạo kho lưu trữ CodeCommit

Đăng nhập vào AWS và tìm kiếm dịch vụ CodeCommit.


Tạo kho lưu trữ mới trong AWS CodeCommit để lưu trữ mã nguồn dự án của bạn.

Cam kết mã vào kho lưu trữ

Trong IntelliJ, mở terminal và nhập các lệnh sau để xác nhận mã được tạo ở Bước I

 $ git init → This initialize local git $ git add . → This will stage files $ git commit -m "commit to CodeCommit"


Đẩy các thay đổi vào Repo từ xa

Sao chép URL kho lưu trữ CodeCommit từ bảng điều khiển aws.

 $ git remote add origin <repo URL> $ git push --set-upstream origin master --> This will prompt for user/password



Tạo dự án AWS CodeBuild

Thiết lập dự án CodeBuild chỉ định cách xây dựng ứng dụng của bạn. Điều này bao gồm việc xác định môi trường xây dựng, lệnh xây dựng và các phần phụ thuộc.


  • Tạo vùng lưu trữ S3 để lưu trữ các tệp bản dựng.


  • Tìm kiếm AWS Code Build, tạo Dự án mới và cung cấp CodeCommit làm nguồn mã và S3 để lưu trữ thành phần lạ


Để thiết lập CodeBuild, bạn cần tạo tệp đặc tả bản dựng có tên buildspec.yml trong thư mục dự án của mình. Tệp này sẽ chứa các lệnh xây dựng và hướng dẫn cho CodeBuild.


Bạn có thể tham khảo tài liệu chính thức tại đây để biết hướng dẫn chi tiết về cách tạo tệp buildspec.yml .


 version: 0.2 phases: install: runtime-versions: java: corretto11 pre_build: commands: - echo Nothing to do in the pre_build phase... build: commands: - echo Build started on `date` - sam build - sam package --output-template-file pcoutputtemplate.yaml --s3-bucket com-appsdev-pc-001 post_build: commands: - echo Build completed on `date` artifacts: files: - pcoutputtemplate.yaml


Đẩy tệp mới vào kho lưu trữ từ cục bộ.


Sau này, bạn có thể xây dựng dự án để xem liệu Mã có được lấy từ Repo hay không và các tạo phẩm có được tạo hay không.


Tạo một CodePipeline

  • Tạo quy trình mới trong AWS CodePipeline.


  • Kết nối quy trình với kho lưu trữ CodeCommit của bạn làm nguồn.


  • Định cấu hình quy trình để sử dụng CodeBuild làm giai đoạn xây dựng.


  • Thêm giai đoạn triển khai để kích hoạt CloudFormation bằng mẫu bạn đã tạo.


Quy trình sẽ tự động xây dựng và triển khai mã dựa trên cam kết git.



Kiểm tra đường ống


  • Mở dự án của bạn trong IntelliJ.


  • Thực hiện một thay đổi nhỏ ở một trong các tệp của bạn, ví dụ: thêm một dòng nhật ký khác.


  • Cam kết thay đổi với kho lưu trữ Git cục bộ của bạn.


  • Đẩy cam kết vào kho lưu trữ CodeCommit.


 $ git branch CR01 $ git checkout CR01 $ git add . $ git commit -m “CR01” $ git push --set-upstream origin CR01 You cand also create a pull request in aws code commit, just for simplicity I am merging from local $ git checkout master $ git merge --ff-only CR01 $ git push
  • Đi tới bảng điều khiển AWS CodePipeline.


  • Bạn sẽ thấy đường dẫn bắt đầu tự động. Nó sẽ lấy mã mới nhất từ kho lưu trữ, xây dựng dự án bằng CodeBuild và triển khai nó bằng CloudFormation.


  • Theo dõi tiến trình trong bảng điều khiển CodePipeline.


Điều này sẽ mô phỏng quá trình thực hiện các thay đổi đối với mã của bạn, đẩy chúng vào kho lưu trữ và để quy trình CICD tự động kích hoạt và triển khai mã được cập nhật.







































Bằng cách khai thác AWS API Gateway, Lambda, DynamoDB, CodeCommit, CodeBuild và CodePipeline, bài viết trình bày cách kiến trúc một quy trình triển khai tự động và linh hoạt.


Cảm ơn bạn đã đọc. Chúc những nỗ lực không có máy chủ của bạn sẽ đạt được thành công và đổi mới!