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
- API
- Cấu Trúc Dự Án
- Dockerfile
- Cấu Hình GitLab CI
- Quyền Truy Cập
- Kiểm Tra API
- Thực Hành Tốt Nhất
- Lỗi Thường Gặp
- Mẹo Hiệu Suất
- 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
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:
├── 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
.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
# 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
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
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
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!