Tự động hóa CI/CD cho Terraform bằng Atlantis trên VPS: Hướng dẫn từ A đến Z
Giới thiệu về GitOps và Thách thức khi Triển khai Terraform Thủ công
Trong kỷ nguyên của điện toán đám mây, Infrastucture as Code (IaC) đã trở thành tiêu chuẩn vàng cho việc quản lý hạ tầng. Trong đó, Terraform là công cụ phổ biến nhất nhờ tính linh hoạt và kiến trúc hướng khai báo. Tuy nhiên, khi quy trình vận hành và đội ngũ DevOps mở rộng, việc chạy các lệnh terraform plan và terraform apply từ máy tính cá nhân của từng kỹ sư bộc lộ nhiều hạn chế nghiêm trọng.
Cách làm thủ công này dễ dẫn đến xung đột trạng thái (state file), thiếu tính minh bạch, khó kiểm toán (audit trail) và tiềm ẩn nguy cơ sai sót con người gây sập hệ thống. Để giải quyết bài toán này, xu hướng GitOps ra đời, chuyển dịch trung tâm quản lý hạ tầng về các kho lưu trữ mã nguồn như GitHub, GitLab hay Bitbucket. Và Atlantis chính là chìa khóa vàng giúp hiện thực hóa GitOps cho Terraform một cách mượt mà nhất.
Atlantis là gì? Cơ chế hoạt động qua Pull Request
Atlantis là một ứng dụng mã nguồn mở hoạt động như một Workflow Automation Server dành riêng cho Terraform. Thay vì chạy các câu lệnh dưới local, Atlantis lắng nghe các sự kiện (Webhooks) từ Git Provider của bạn và thực thi Terraform ngay trong giao diện Pull Request (PR) hoặc Merge Request (MR).
Cơ chế hoạt động cốt lõi của Atlantis bao gồm các bước sau:
- Developer tạo Pull Request: Khi một kỹ sư thay đổi mã nguồn Terraform và đẩy lên một nhánh mới, họ sẽ mở một PR hướng về nhánh chính (main/master).
- Tự động thực hiện Plan: Atlantis nhận tín hiệu qua Webhook, tự động chạy
terraform plantrên môi trường độc lập của VPS và phản hồi (comment) kết quả chi tiết ngay dưới PR. - Rà soát và Phê duyệt (Review & Approval): Các kỹ sư khác trong đội ngũ tiến hành rà soát xem các thay đổi hạ tầng có đúng thiết kế và an toàn hay không. Sau khi được phê duyệt theo chính sách, một kỹ sư có thẩm quyền sẽ gõ comment
atlantis apply. - Áp dụng hạ tầng và Merge: Atlantis thực thi
terraform apply, cập nhật trạng thái hạ tầng thực tế, ghi nhận kết quả vào PR và tự động thực hiện merge nhánh đó vào nhánh chính.
Sử dụng Atlantis giúp biến Pull Request thành một nguồn thông tin duy nhất (Single Source of Truth), nơi mọi thay đổi hạ tầng đều được ghi vết, thảo luận và phê duyệt một cách tường minh trước khi được áp dụng thực tế.
Hướng dẫn chi tiết cấu hình Atlantis trên VPS cá nhân
Để triển khai Atlantis, bạn cần chuẩn bị một máy chủ ảo (VPS) chạy hệ điều hành Linux (ví dụ: Ubuntu 22.04 LTS) có IP công khai và một tên miền được cấu hình DNS trỏ về IP này.
Bước 1: Cài đặt Terraform và Atlantis trên VPS
Trước tiên, hãy truy cập vào VPS qua SSH và cài đặt các thành phần cần thiết. Đảm bảo rằng phiên bản Terraform cài đặt trên VPS trùng khớp với phiên bản bạn đang sử dụng trong dự án.
# Cập nhật hệ thống và cài đặt unzip
sudo apt update && sudo apt install -y unzip wget curl
# Cài đặt Terraform
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
# Tải và cài đặt Atlantis
VERSION="v0.27.2"
wget https://github.com/runatlantis/atlantis/releases/download/${VERSION}/atlantis_linux_amd64.zip
unzip atlantis_linux_amd64.zip
sudo mv atlantis /usr/local/bin/
atlantis --versionBước 2: Cấu hình Access Token và Webhook Secret trên Git Provider
Trong hướng dẫn này, chúng ta sẽ lấy GitHub làm ví dụ. Bạn cần tạo một Personal Access Token (PAT) để Atlantis có quyền bình luận và kiểm soát các Pull Request:
- Truy cập GitHub > Settings > Developer Settings > Personal Access Tokens (Classic).
- Cấp các quyền tối thiểu:
repo(đối với kho lưu trữ riêng tư) hoặcpublic_repo(đối với kho lưu trữ công khai). - Lưu lại chuỗi Token được tạo (được gọi là
ATLANTIS_GH_TOKEN).
Tiếp theo, tạo một chuỗi ngẫu nhiên để làm bí mật Webhook (ATLANTIS_GH_WEBHOOK_SECRET), giúp xác thực rằng các request gửi đến VPS thực sự đến từ GitHub chứ không phải từ kẻ giả mạo.
Bước 3: Khởi tạo file cấu hình cho Atlantis
Để quản lý cấu hình một cách chuyên nghiệp, hãy tạo một file cấu hình định dạng YAML trên VPS (ví dụ đặt tại /etc/atlantis/config.yaml):
atlantis-url: "https://atlantis.yourdomain.com"
github-user: "your-github-username"
github-token: "ghp_your_personal_access_token_here"
github-webhook-secret: "your_webhook_secret_here"
repo-allowlist: "github.com/your-organization/*"
data-dir: "/var/lib/atlantis"Lưu ý: Thay thế các giá trị trên bằng thông tin thực tế của bạn. Thư mục dữ liệu /var/lib/atlantis cần được cấp quyền ghi cho user chạy ứng dụng.
Bước 4: Cấu hình Atlantis chạy như một Systemd Service
Để đảm bảo Atlantis hoạt động ổn định, tự động khởi chạy cùng hệ thống khi VPS reboot, chúng ta cần thiết lập nó như một dịch vụ nền (Systemd Background Service).
Tạo file dịch vụ bằng lệnh: sudo nano /etc/systemd/system/atlantis.service với nội dung:
[Unit]
Description=Atlantis Terraform Automation
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/atlantis server --config /etc/atlantis/config.yaml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetKích hoạt và khởi chạy dịch vụ:
sudo systemctl daemon-reload
sudo systemctl enable atlantis
sudo systemctl start atlantis
sudo systemctl status atlantisBảo mật hệ thống Atlantis bằng Reverse Proxy (Nginx + Let's Encrypt)
Mặc định, Atlantis lắng nghe trên cổng 4141. Việc mở trực tiếp cổng này ra môi trường Internet là một rủi ro bảo mật lớn. Do đó, chúng ta nên cấu hình một Reverse Proxy bằng Nginx kết hợp với chứng chỉ SSL miễn phí từ Let's Encrypt để mã hóa toàn bộ lưu lượng dữ liệu.
Cài đặt Nginx và Certbot:
sudo apt install -y nginx certbot python3-certbot-nginxCấu hình block cho Nginx tại /etc/nginx/sites-available/atlantis:
server {
server_name atlantis.yourdomain.com;
location / {
proxy_pass http://localhost:4141;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Kích hoạt cấu hình và lấy chứng chỉ SSL:
sudo ln -s /etc/nginx/sites-available/atlantis /etc/nginx/sites-enabled/
sudo systemctl restart nginx
sudo certbot --nginx -d atlantis.yourdomain.comHoàn tất quy trình: Cấu hình Webhook trên GitHub Repository
Bước cuối cùng để kích hoạt toàn bộ hệ thống tự động hóa là kết nối kho lưu trữ chứa mã nguồn Terraform của bạn với Atlantis Server:
- Vào GitHub Repository > Settings > Webhooks > Add webhook.
- Payload URL: Điền địa chỉ kèm endpoint
https://atlantis.yourdomain.com/events. - Content type: Chọn
application/json. - Secret: Nhập chính xác chuỗi
ATLANTIS_GH_WEBHOOK_SECRETđã tạo ở bước trước. - Which events: Chọn "Let me select individual events" và tick vào các mục: Issue comments, Pull request reviews, Pull requests, Pushes.
- Bấm Add webhook và kiểm tra xem biểu tượng dấu tích xanh có xuất hiện hay không.
Xây dựng quy trình Kiểm soát chất lượng (Server-Side Repo Config)
Để nâng cao tính an toàn cho hạ tầng doanh nghiệp, bạn không nên cho phép bất kỳ ai cũng có thể thực thi lệnh apply một cách tùy tiện. Atlantis hỗ trợ file cấu hình atlantis.yaml đặt ngay tại thư mục gốc của repository để định nghĩa các luồng làm việc (Workflows) nghiêm ngặt.
Ví dụ về một cấu hình an toàn đòi hỏi phải có sự phê duyệt (Approval) của đồng nghiệp trước khi áp dụng:
version: 3
projects:
- name: production-infrastructure
dir: terraform/production
autoplan:
enabled: true
when_modified: ["*.tf", "../modules/**/*.tf"]
workflow: secure-workflow
workflows:
secure-workflow:
plan:
steps:
- init
- plan
apply:
steps:
- apply
# Yêu cầu Pull Request phải được 'Approved' trên GitHub trước khi cho phép chạy apply
policy_check: trueBên cạnh đó, kết hợp với tính năng Branch Protection Rules của GitHub, bạn có thể thiết lập cấu hình bắt buộc kiểm tra trạng thái của Atlantis thành công (status check passes) mới được phép đưa mã nguồn vào nhánh chính.
Kết luận và Các lưu ý quan trọng về Bảo mật
Cấu hình Atlantis thành công trên VPS mang lại một bước tiến lớn cho quy trình phát triển hạ tầng của doanh nghiệp. Nó không chỉ tự động hóa các thao tác thủ công lặp đi lặp lại mà còn xây dựng một bộ khung vận hành minh bạch, an toàn và chuyên nghiệp theo chuẩn GitOps.
Tuy nhiên, vì Atlantis nắm giữ các quyền tối cao đối với hạ tầng đám mây của bạn (qua AWS Credentials, Google Cloud Service Accounts hoặc Azure Service Principals được cấu hình trên VPS), hãy luôn tuân thủ các nguyên tắc bảo mật cốt lõi sau:
- Giới hạn quyền hạn (Least Privilege): Chỉ cấp cho Atlantis các quyền vừa đủ để quản lý các tài nguyên được chỉ định, tránh dùng quyền Root/Administrator toàn cục nếu không cần thiết.
- Sử dụng IAM Role bảo mật: Nếu VPS nằm cùng hệ sinh thái (ví dụ EC2 trên AWS), hãy sử dụng IAM Instance Profile thay vì lưu trữ Access Key dạng text thô trên ổ đĩa.
- Giám sát log hệ thống liên tục: Thường xuyên kiểm tra nhật ký hoạt động của hệ thống thông qua lệnh
journalctl -u atlantis.service -fđể kịp thời phát hiện các truy cập bất thường.
