0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Triển khai API Rust lên Cloud Run qua GitLab CI/CD

Đăng vào 8 tháng trước

• 5 phút đọc

Hướng Dẫn Triển Khai API Rust Lên Cloud Run Qua GitLab CI/CD

Giới Thiệu

Trong bài viết này, chúng ta sẽ khám phá cách triển khai một API viết bằng Rust lên Google Cloud Run thông qua quá trình CI/CD với GitLab. Việc sử dụng Rust cho các ứng dụng web ngày càng trở nên phổ biến nhờ vào hiệu suất cao và khả năng bảo mật. Chúng ta sẽ đi qua từng bước từ việc xây dựng API đến triển khai trên Cloud Run, cùng với những lưu ý và mẹo hữu ích.

Mục Lục

  1. API
  2. Cấu Trúc Dự Án
  3. Dockerfile
  4. Cấu Hình GitLab CI
  5. Quyền Truy Cập
  6. Kiểm Tra API
  7. Thực Hành Tốt Nhất
  8. Lỗi Thường Gặp
  9. Mẹo Hiệu Suất
  10. Kết Luận

API

Chúng ta sẽ sử dụng mô hình DDD (Domain Driven Design) để xây dựng API. Dưới đây là mã nguồn cho tệp main.rs:

rust Copy
use test_api::infra::handler::health::get_health_handler;
use tokio;
use warp::Filter;

#[tokio::main]
async fn main() {
    // Định nghĩa route
    let get_health_route = warp::path("health")
        .and(warp::get())
        .and_then(get_health_handler);

    // Khởi động server warp
    warp::serve(get_health_route)
        .run(([0, 0, 0, 0], 8080))
        .await;
}

Cấu Trúc Dự Án

Cấu trúc dự án của chúng ta như sau:

Copy
├── Cargo.toml
├── Dockerfile
├── README.md
├── src
│   ├── domain
│   │   ├── entities
│   │   └── use_case
│   ├── infra
│   │   └── handler
│   ├── lib.rs
│   ├── main.rs
│   └── use_case
│       └── get_health
└── target
    ├── CACHEDIR.TAG
    └── debug
        ├── build
        ├── deps
        ├── examples
        └── incremental

Điểm Quan Trọng

Một điểm quan trọng là tham số trong phương thức .run() của warp:

rust Copy
.run(([0, 0, 0, 0], 8080))

Điều này cho phép container có thể được truy cập từ bên ngoài.

Dockerfile

Chúng ta sẽ tạo một Dockerfile để đóng gói ứng dụng Rust:

dockerfile Copy
# Bước 1: Builder với Rust + OpenSSL
FROM rust:latest AS builder

RUN apt-get update && apt-get install -y pkg-config libssl-dev

WORKDIR /usr/src/test_api

# Sao chép các tệp của crate
COPY Cargo.toml ./
COPY src ./src

# Tạo lockfile và tải các phụ thuộc
RUN cargo generate-lockfile
RUN cargo build --release

# Bước 2: Ảnh cuối cùng với glibc
FROM debian:bookworm-slim

# Cài đặt OpenSSL và các phụ thuộc runtime tối thiểu
RUN apt-get update && apt-get install -y libssl3 ca-certificates && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY --from=builder /usr/src/test_api/target/release/test_api .

ENV PORT=8080
EXPOSE 8080

CMD ["./test_api"]

Cấu Hình GitLab CI

Để tự động hóa quá trình triển khai, chúng ta cần cấu hình GitLab CI như sau:

yaml Copy
stages:
    - deploy_cloud_run

deploy_cloud_run:
    stage: deploy_cloud_run
    tags: [temp]
    environment:
        name: dev
    rules:
        - if: '$CI_COMMIT_BRANCH == "dev" && $CI_PIPELINE_SOURCE == "push"'
          changes:
              - **/*
          when: always
        - when: never
    before_script:
        - mkdir -p "$CI_PROJECT_DIR/.tmp/google-cloud-sdk"
        - curl -sSL "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-438.0.0-linux-x86_64.tar.gz" | tar -xz -C "$CI_PROJECT_DIR/.tmp/google-cloud-sdk" --strip-components=1
        - export PATH="$CI_PROJECT_DIR/.tmp/google-cloud-sdk/bin:$PATH"
        - echo "$SERVICE_ACCOUNT_JSON" | base64 -d > gcloud-key.json
        - gcloud auth activate-service-account --key-file=gcloud-key.json
        - export GCP_PROJECT_ID="seu-projeto"
        - gcloud config set project "$GCP_PROJECT_ID"
        - gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
    script:
        - |
            IMAGE_TAG="$(git rev-parse --short HEAD)"
            IMAGE_URI="us-central1-docker.pkg.dev/seu-repo/api/test-api:${IMAGE_TAG}"

            docker build \
              -t "$IMAGE_URI" \
              -f test_api/Dockerfile \
              test_api

            docker push "$IMAGE_URI"

            gcloud run deploy api-dev \
              --image "$IMAGE_URI" \
              --platform managed \
              --region us-central1 \
              --allow-unauthenticated \
              --project "$GCP_PROJECT_ID" \
              --set-env-vars "ENVIRONMENT=staging"
    after_script:
        - rm -f gcloud-key.json

Quyền Truy Cập

Để job trên GitLab CI chạy thành công, service account cần có các quyền sau:

bash Copy
gcloud projects add-iam-policy-binding tilt-network \ --member="serviceAccount:service-account@project.iam.gserviceaccount.com" \ --role="roles/run.admin"

gcloud projects add-iam-policy-binding tilt-network \ --member="serviceAccount:service-account@project.iam.gserviceaccount.com" \ --role="roles/viewer"

gcloud projects add-iam-policy-binding tilt-network \ --member="serviceAccount:service-account@project.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"

JSON của service account cần được lưu trữ như một bí mật trong GitLab.

Kiểm Tra API

Sau khi triển khai thành công, bạn có thể kiểm tra API bằng cách sử dụng curl:

bash Copy
curl https://sua-api-hash-uc.a.run.app/health
{"health_status":{"status":"healthy","message":"API is working fine"}}

Thực Hành Tốt Nhất

  • Sử dụng môi trường staging: Để kiểm tra API trước khi triển khai lên môi trường production.
  • Ghi chú log: Ghi lại log để tiện theo dõi và xử lý sự cố khi cần thiết.
  • Kiểm tra hiệu suất: Sử dụng các công cụ đo lường để tối ưu hóa hiệu suất API.

Lỗi Thường Gặp

  • Lỗi 403 Forbidden: Kiểm tra quyền truy cập của service account.
  • Lỗi 404 Not Found: Đảm bảo rằng route đã được định nghĩa chính xác.

Mẹo Hiệu Suất

  • Sử dụng caching: Giúp giảm tải máy chủ và tăng tốc độ phản hồi.
  • Tối ưu hóa mã nguồn: Kiểm tra và loại bỏ những đoạn mã không cần thiết.

Kết Luận

Triển khai API Rust lên Google Cloud Run thông qua GitLab CI/CD có thể giúp bạn tự động hóa quy trình phát triển của mình. Hãy thử nghiệm và cải thiện quy trình của bạn để đạt được hiệu suất tối ưu hơn. Nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại để lại câu hỏi bên dưới!

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