Giải pháp CI/CD đa tài khoản động dựa trên cấu hình trên AWS

Nhiều tổ chức yêu cầu cơ chế giao phát mã tự động bền vững cho ứng dụng của họ. Họ tận dụng các pipeline tích hợp liên tục/tuần tự triển khai (CI/CD) đa tài khoản để triển khai mã và chạy các bài kiểm tra tự động trong nhiều môi trường trước khi triển khai lên Production. Trong trường hợp chiến lược kiểm tra là riêng biệt cho từng phiên bản phát hành, bạn phải cập nhật pipeline trước mỗi lần phát hành. Các giai đoạn pipeline truyền thống được định nghĩa trước và có tính tĩnh, và một khi các giai đoạn pipeline đã được xác định thì khó để cập nhật chúng. Trong bài viết này, chúng tôi giới thiệu một giải pháp CI/CD động dựa trên cấu hình cho mỗi kho lưu trữ. Trạng thái pipeline được duy trì và quản lý bằng cách sử dụng cấu hình được lưu trữ trong Amazon DynamoDB. Điều này mang lại lợi ích cho bạn khi tự động tùy chỉnh pipeline cho mỗi lần phát hành dựa trên yêu cầu kiểm tra.

Bằng cách tuân theo bài viết này, bạn sẽ thiết lập một giải pháp CI/CD đa tài khoản động. pipeline của bạn sẽ triển khai và kiểm tra một ứng dụng mẫu API cửa hàng thú cưng. Để biết thêm chi tiết về ứng dụng này, vui lòng tham khảo “Tự động hóa kiểm tra API của bạn với AWS CodeBuild, AWS CodePipeline và Postman”. Các triển khai mã mới sẽ được cung cấp với các giai đoạn pipeline tùy chỉnh dựa trên cấu hình pipeline mà bạn tạo. Giải pháp này sử dụng các dịch vụ như AWS Cloud Development Kit (AWS CDK), AWS CloudFormation, Amazon DynamoDB, AWS Lambda và AWS Step Functions.

Tổng quan về giải pháp

Biểu đồ dưới đây minh họa kiến trúc giải pháp:

Hình 1: Biểu đồ Kiến trúc

  1. Người dùng chèn/cập nhật/xóa bản ghi trong bảng DynamoDB.
  2. Hàm kích hoạt Step Function Trigger Lambda được gọi khi có sự thay đổi.
  3. Hàm kích hoạt Step Function Trigger Lambda đánh giá sự kiện đang nhập và thực hiện các công việc sau đây:
  1. Trong trường hợp chèn và cập nhật, kích hoạt Step Function.
  2. Trong trường hợp xóa, tìm ngăn xếp CloudFormation phù hợp và xóa nó.
  3. Các bước trong Step Function như sau:
  1. Thu thập Thông tin (Chuyển Trạng thái) – Lọc thông tin liên quan từ sự kiện, như repositoryName và referenceName.
  2. Lấy Thông tin Ánh xạ (Được hỗ trợ bởi Lambda bộ lọc sự kiện CodeCommit) – Truy xuất thông tin ánh xạ từ cấu hình pipeline được lưu trữ trong DynamoDB.
  3. Có Cấu hình Triển khai? (Trạng thái Lựa chọn) – Nếu StatusCode == 200, thì mục DynamoDB được tìm thấy và bước Khởi tạo Ngăn xếp CloudFormation được gọi, nếu không, StepFunction kết thúc với Trạng thái Thành công.
  4. Khởi tạo Ngăn xếp CloudFormation (Được hỗ trợ bởi Lambda tạo Ngăn xếp) – Xây dựng các tham số CloudFormation và tạo/cập nhật pipeline động dựa trên cấu hình được lưu trữ trong DynamoDB thông qua CloudFormation.

Các sản phẩm mã nguồn

Các sản phẩm mã nguồn bao gồm các phần sau:

  1. Ứng dụng AWS CDK – Ứng dụng AWS CDK chứa mã cho tất cả các Lambda, Step Functions và các mẫu CloudFormation.
  2. thư mục sample-application-repo – Thư mục này chứa kho lưu trữ ứng dụng mẫu được sử dụng cho việc triển khai.
  3. thư mục automated-tests-repo – Thư mục này chứa kho lưu trữ kiểm tra tự động mẫu để kiểm tra kho lưu trữ mẫu.

Triển khai giải pháp CI/CD

  1. Sao chép kho này vào máy tính cục bộ của bạn.
  2. Theo hướng dẫn trong tệp README để triển khai giải pháp vào tài khoản CI/CD chính của bạn. Sau khi triển khai thành công, các tài nguyên sau sẽ được tạo trong tài khoản CI/CD:
  1. Bảng DynamoDB
  2. Step Function
  3. Các hàm Lambda
  1. Truy cập vào bảng điều khiển Amazon Simple Storage Service (Amazon S3) trong tài khoản CI/CD chính của bạn và tìm kiếm một ngăn chứa có tên: cloudformation-template-bucket-<AWS_ACCOUNT_ID>. Bạn nên thấy hai mẫu CloudFormation (templates/codepipeline.yaml và templates/childaccount.yaml) được tải lên ngăn chứa này.
  2. Chạy childaccount.yaml trong mỗi tài khoản CI/CD mục tiêu (Alpha, Beta, Gamma và Prod) bằng cách truy cập Bảng điều khiển CloudFormation. Cung cấp số tài khoản CI/CD chính làm tham số “CentralAwsAccountId” và thực thi.
  3. Sau khi tạo Stack thành công, hai vai trò sẽ được tạo ra trong các Tài khoản Con:
  1. Vai trò ChildAccountFormationRole
  2. Vai trò ChildAccountDeployerRole

Cấu hình pipeline

Thêm một mục vào devops-pipeline-table-info cho tên kho lưu trữ và kết hợp nhánh. Một mục mẫu có thể được tìm thấy trong tệp sample-entry.json.

Pipeline này có khả năng cấu hình cao và tất cả đều có thể được cấu hình thông qua mục nhập DynamoDB.

Dưới đây là các khóa cấp cao:

RepoName: Tên của kho lưu trữ mà AWS CodePipeline được cấu hình.

RepoTag: Tên của nhánh được sử dụng trong CodePipeline.

BuildImage: Hình ảnh xây dựng được sử dụng cho dự án AWS CodeBuild của ứng dụng.

BuildSpecFile: Tệp Buildspec được sử dụng trong dự án AWS CodeBuild của ứng dụng.

DeploymentConfigurations: Khóa này chứa các cấu hình triển khai cho pipeline. Dưới khóa này là các cấu hình cụ thể cho từng môi trường. Trong trường hợp của chúng tôi, chúng tôi đã đặt tên cho các môi trường của mình là Alpha, Beta, Gamma và Prod. Bạn có thể cấu hình thành bất kỳ tên nào bạn thích, nhưng hãy đảm bảo rằng các mục trong JSON giống như trong mẫu CloudFormation codepipeline.yaml. Điều này bởi vì có một ánh xạ 1:1 giữa chúng. Các khóa cấp dưới trong DeploymentConfigurations như sau:

  • EnvironmentName. Đây là khóa cấp cao cho cấu hình cụ thể của môi trường. Trong trường hợp của chúng tôi, nó là Alpha, Beta, Gamma và Prod. Khóa cấp dưới trong này bao gồm:
    • <Env>AwsAccountId: ID tài khoản AWS của môi trường mục tiêu.
    • Deploy<Env>: Khóa xác định liệu liệu phải được triển khai vào môi trường này hay không. Dựa vào giá trị của nó, CodePipeline sẽ có một giai đoạn triển khai đến môi trường này hay không.
    • ManualApproval<Env>: Khóa đại diện cho việc có cần phê duyệt thủ công trước khi triển khai hay không. Nhập địa chỉ email của bạn hoặc đặt thành false.
    • Tests: Một lần nữa, đây là khóa cấp cao với khóa cấp dưới. Khóa này chứa thông tin liên quan đến kiểm tra sẽ được chạy trên các môi trường cụ thể. Mỗi kiểm tra dựa vào việc nó có sẽ được chạy sẽ thêm một bước bổ sung vào CodePipeline. Thông tin liên quan đến kiểm tra cũng có thể được cấu hình với khả năng chỉ định kho lưu trữ kiểm tra, tên nhánh, tệp buildspec và hình ảnh xây dựng cho việc kiểm tra dự án CodeBuild.

Thực hiện

  1. Thêm một mục vào bảng DynamoDB devops-pipeline-table-info trong tài khoản CI/CD chính. Một mục mẫu có thể được tìm thấy trong tệp sample-entry.json. Hãy đảm bảo thay thế các giá trị cấu hình bằng các giá trị thích hợp cho môi trường của bạn. Giải thích về các giá trị có thể được tìm thấy trong phần Cấu hình đường ống ở trên.
  1. Sau khi đã thêm mục vào bảng DynamoDB, bạn sẽ thấy một ngăn xếp CloudFormation đang được tạo. Ngăn xếp CloudFormation này sẽ triển khai CodePipeline trong tài khoản CI/CD chính bằng cách đọc và sử dụng mục nhập trong bảng DynamoDB.

Tùy chỉnh giải pháp cho các kết hợp khác nhau như triển khai vào một môi trường trong khi bỏ qua cho các môi trường khác bằng cách cập nhật cấu hình đường ống được lưu trữ trong bảng DynamoDB devops-pipeline-table-info. Sau đây là đường ống được cấu hình cho nhánh chính của kho lưu trữ ứng dụng mẫu.

Hình 2: Đường ống CI/CD đa tài khoản động

Dọn dẹp giải pháp CI/CD đa tài khoản động của bạn và các tài nguyên liên quan

Để tránh các khoản phí liên tục cho các tài nguyên bạn đã tạo theo bài viết này, bạn nên xóa các thành phần sau:

  1. Cấu hình đường ống được lưu trữ trong DynamoDB
  2. Ngăn xếp CloudFormation đã triển khai trong các tài khoản CI/CD mục tiêu
  3. Ứng dụng AWS CDK đã triển khai trong tài khoản CI/CD chính
  4. Làm trống và xóa các ngăn chứa S3 được giữ lại.

Kết luận

Giải pháp CI/CD được cấu hình dựa trên cấu hình này cung cấp khả năng tạo và cấu hình động các đường ống trong DynamoDB. IDEMIA, một nhà lãnh đạo toàn cầu về công nghệ xác thực, đã áp dụng phương pháp này để triển khai ứng dụng dựa trên microservices của họ trên các môi trường khác nhau. Giải pháp này do Dịch vụ Chuyên nghiệp của AWS tạo ra đã cho phép họ tạo và cấu hình động các đường ống của họ cho mỗi kho lưu trữ cho mỗi lần phát hành. Như Kunal Bajaj, Tech Lead của IDEMIA, nói: “Chúng tôi đã làm việc với đội ngũ pro-serve của AWS để tạo ra một giải pháp CI/CD động bằng cách sử dụng các lambda, các bước chức năng, SQS và các dịch vụ AWS native khác để thực hiện triển khai giữa các tài khoản khác nhau cho các môi trường của chúng tôi và cung cấp cho chúng tôi tính linh hoạt để thêm kiểm tra và phê duyệt khi cần thiết cho doanh nghiệp của chúng tôi.”