0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Chia sẻ Biến Môi Trường Động Giữa Các Job GitLab CI: Ví Dụ AWS OIDC

Đăng vào 3 ngày trước

• 8 phút đọc

Chủ đề:

#aws#cicd#gitlab

Giới thiệu

Trong bài viết trước, chúng ta đã khám phá cách chia sẻ các artifact build giữa các job trong GitLab CI bằng ví dụ ứng dụng React. Bây giờ, chúng ta sẽ đối mặt với một thử thách phức tạp hơn: truyền các biến môi trường được tạo động giữa các job trong ma trận song song.

Tính năng parallel:matrix của GitLab CI mang lại sức mạnh cho việc triển khai đồng thời, nhưng lại thiếu cơ chế trực tiếp để truyền các biến được tạo trong thời gian chạy giữa các job được tạo ra từ ma trận. Trong bài viết này, chúng ta sẽ sử dụng xác thực AWS OIDC để minh họa cách tạo và truyền các biến môi trường động giữa các job trong ma trận GitLab CI.

Thách Thức Về Biến Môi Trường Động

Như chúng ta đã thấy trong bài viết trước, tính năng parallel:matrix của GitLab cho phép chạy nhiều job song song với các giá trị biến môi trường khác nhau. Tuy nhiên, khi các biến đó được tạo ra trong thời gian chạy (như thông tin xác thực tạm thời), việc truyền chúng đến các job tiếp theo trở nên khó khăn.

Ví dụ, khi triển khai đến nhiều môi trường AWS, mỗi môi trường có thể cần các thông tin xác thực tạm thời độc nhất có được thông qua OpenID Connect (OIDC). Những thông tin xác thực này được tạo ra trong quá trình thực thi pipeline và phải được truyền đến các job hạ lưu tương ứng.

Giải pháp mà chúng tôi sẽ khám phá sử dụng các tệp artifact để truyền dữ liệu cụ thể cho môi trường giữa các job trong ma trận, đảm bảo rằng mỗi triển khai song song có quyền truy cập vào các thông tin xác thực độc nhất của nó.

Ví Dụ Thực Tế: Triển Khai Nhiều Thuê Bao AWS

Thiết Lập Ban Đầu

Dưới đây là cấu hình GitLab CI minh họa cho phương pháp của chúng ta:

yaml Copy
default:
  image:
    name: amazon/aws-cli:2.25.2
    entrypoint: [""]

stages:
  - pre-deploy
  - deploy

.tenants:
  parallel:
    matrix:
      - TENANT: alpha
      - TENANT: beta

get-aws-credentials:
  stage: pre-deploy
  extends:
    - .tenants
  needs: []
  environment: $TENANT
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.com # hoặc tên miền GitLab tùy chỉnh nếu tự lưu trữ
  script:
    - aws --version
    - >
      STS=($(aws sts assume-role-with-web-identity
        --role-arn ${ROLE_ARN}
        --role-session-name "GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}"
        --web-identity-token ${GITLAB_OIDC_TOKEN}
        --duration-seconds 3600
        --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
        --output text))
    - echo "AWS_ACCESS_KEY_ID=${STS[0]}" >> .aws.$TENANT.env
    - echo "AWS_SECRET_ACCESS_KEY=${STS[1]}" >> .aws.$TENANT.env
    - echo "AWS_SESSION_TOKEN=${STS[2]}" >> .aws.$TENANT.env
  artifacts:
    paths:
      - .aws.$TENANT.env
    expire_in: 1 hour

deploy:
  stage: deploy
  extends:
    - .tenants
  needs:
    - get-aws-credentials
  script:
    - export $(cat .aws.$TENANT.env | xargs)
    - aws sts get-caller-identity

Cách Hoạt Động

  1. Ma Trận Song Song: Mẫu .tenants định nghĩa một ma trận với hai thuê bao: alpha và beta.
  2. Tạo Thông Tin Xác Thực: Job get-aws-credentials sử dụng AWS OIDC để động tạo một vai trò cho mỗi thuê bao.
  3. Tạo Tệp Môi Trường: Các thông tin xác thực được ghi vào các tệp .env riêng biệt cho từng thuê bao (.aws.alpha.env.aws.beta.env).
  4. Chia Sẻ Artifact: Các tệp .env này được chia sẻ dưới dạng artifact giữa các job.
  5. Sử Dụng Thông Tin Xác Thực: Job deploy nhập các thông tin xác thực này bằng cách sử dụng lệnh export $(cat .aws.$TENANT.env | xargs).

Cách tiếp cận này dẫn đến một luồng pipeline như sau:

Điểm chính là chúng ta đang sử dụng cùng một quy ước đặt tên mà chúng ta đã khám phá trong bài viết trước — đặt tên cho các tệp môi trường của chúng ta với định danh thuê bao (.aws.$TENANT.env). Điều này đảm bảo rằng mỗi job triển khai lấy đúng tệp thông tin xác thực.

Ví Dụ Hoạt Động

Một ví dụ hoàn chỉnh về việc triển khai này có sẵn trong kho lưu trữ GitLab công cộng của chúng tôi. Bạn có thể sao chép kho này để xem triển khai hoàn chỉnh và điều chỉnh nó theo nhu cầu của bạn.

Thiết Lập Tích Hợp AWS OIDC

Để triển khai phương pháp này, bạn sẽ cần cấu hình AWS IAM với các bước sau:

  1. Thêm Nhà Cung Cấp Danh Tính OpenID Connect
  • Mở AWS Management Console
  • Điều hướng đến IAM -> Nhà cung cấp danh tính
  • Thêm một nhà cung cấp mới với các chi tiết sau:
    • Loại: OpenID Connect
    • Nhà cung cấp: https://gitlab.com (hoặc tên miền GitLab tùy chỉnh nếu tự lưu trữ)
    • Đối tượng: https://gitlab.com (phải khớp với tên miền mà GitLab đang lưu trữ và GITLAB_OIDC_TOKEN:aud trong .gitlab-ci.yml)
  1. Tạo Vai Trò IAM
  • Đi đến IAM -> Vai trò -> Tạo
  • Cấu hình như một thực thể Web với:
    • Nhà cung cấp: https://gitlab.com (hoặc tên miền GitLab tùy chỉnh nếu tự lưu trữ)
    • Đối tượng: https://gitlab.com (phải khớp với tên miền mà GitLab đang lưu trữ và GITLAB_OIDC_TOKEN:aud trong .gitlab-ci.yml)
    • Chính sách: Mức độ truy cập phù hợp
  • Tạo một chính sách tin cậy với các giá trị ví dụ:
json Copy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::{ACCOUNT_NUMBER}:oidc-provider/gitlab.com"
                // Ví dụ: "arn:aws:iam::77766655544333:oidc-provider/gitlab.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "gitlab.com:aud": "https://gitlab.com"
                    // Hoặc tên miền GitLab tùy chỉnh nếu tự lưu trữ
                },
                "StringLike": {
                    "gitlab.com:sub": "project_path:{PROJECT_PATH}*"
                    // Ví dụ: "project_path:u11d-michal-miler/dynamic-envs-aws*"
                }
            }
        }
    ]
}
  1. Cấu Hình GitLab CI/CD
  • Sao chép Role ARN
  • Đặt nó làm biến trong cài đặt GitLab CI/CD (Cài đặt -> CI/CD -> Biến)

Các Khía Cạnh An Ninh

Khi triển khai phương pháp này, một số khía cạnh an ninh xứng đáng được chú ý đặc biệt:

  1. Thời Gian Hết Hạn Artifact: Đặt thời gian hết hạn ngắn cho các artifact chứa thông tin xác thực để hạn chế thời gian thông tin nhạy cảm có thể truy cập trong bộ nhớ của GitLab. Trong ví dụ của chúng tôi, chúng tôi sử dụng expire_in: 1 hour để đảm bảo thông tin xác thực tự động bị xóa.
  2. Vai Trò IAM Được Quyền Tối Thiểu: Tuân theo nguyên tắc quyền tối thiểu bằng cách tạo các vai trò riêng biệt cho mỗi môi trường với chỉ các quyền cần thiết cho mỗi tác vụ triển khai. Thường xuyên kiểm tra các vai trò này để duy trì an ninh chặt chẽ.
  3. Phạm Vi Chính Sách Tin Cậy: Cấu hình điều kiện project_path cẩn thận trong chính sách tin cậy. Cân nhắc sử dụng các ràng buộc đường dẫn cụ thể hoặc các điều kiện bổ sung như gitlab.com:ref_typegitlab.com:ref để hạn chế các nhánh nào có thể giả định vai trò, đặc biệt là cho các môi trường sản xuất.
  4. Biến Môi Trường So Với Tệp: Trong khi phương pháp của chúng tôi sử dụng tệp để truyền thông tin xác thực, điều này tách biệt chúng khỏi hệ thống biến của GitLab và các đầu ra log, giảm thiểu rủi ro tiết lộ thông tin một cách tình cờ.

Hãy nhớ rằng an ninh triển khai của bạn phụ thuộc vào việc cấu hình chính xác từng thành phần của pipeline này. Xem xét tất cả các cài đặt một cách cẩn thận trước khi sử dụng trong các môi trường sản xuất.

Kết Luận

Kỹ thuật được giải thích trong bài viết này xây dựng dựa trên phương pháp trước đó của chúng tôi để chia sẻ các artifact và mở rộng nó để xử lý các biến môi trường động — đặc biệt là các thông tin nhạy cảm như thông tin xác thực đám mây.

Phương pháp này không chỉ giới hạn ở thông tin xác thực AWS. Bạn có thể sử dụng các cách tiếp cận tương tự cho:

  • Tạo thông tin xác thực cho nhiều nhà cung cấp đám mây
  • Truyền cấu hình động giữa các job
  • Quản lý chuỗi kết nối cơ sở dữ liệu cho các môi trường khác nhau
  • Chia sẻ các mã thông báo truy cập tạm thời qua các giai đoạn triển khai
  • Tạo cấu hình đặc thù cho môi trường một cách động

Điểm chính là các tệp cụ thể cho môi trường, kết hợp với cơ chế chia sẻ artifact của GitLab và một mẫu đặt tên nhất quán, cung cấp một giải pháp mạnh mẽ để truyền các biến động giữa các job trong ma trận.

Bằng cách tận dụng những kỹ thuật này, bạn có thể tạo ra các pipeline CI/CD thực sự linh hoạt, hoạt động liền mạch qua nhiều môi trường và thuê bao trong khi vẫn duy trì sự tách biệt và an ninh hợp lý.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào