Tích hợp Infracost vào CI/CD: Ước tính chi phí Cloud cho Terraform

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Vấn đề: Chi phí Cloud tăng vọt bất ngờ sau khi triển khai

Sáu tháng trước, đội ngũ của chúng tôi đã triển khai một bản cập nhật Terraform thông thường để tăng thông lượng cho database staging. Các bài kiểm tra tự động, linting và quét bảo mật đều vượt qua mà không gặp vấn đề gì. Ba tuần sau, bộ phận tài chính thông báo hóa đơn AWS tăng đột biến 4.200 USD ngoài dự kiến. Một kỹ sư đã vô tình khởi tạo ổ lưu trữ multi-AZ provisioned IOPS SSD (io2) với 10.000 IOPS trên ba cụm non-production thay vì dùng các volume gp3 tiêu chuẩn.

Hầu hết quy trình FinOps hiện nay đều dựa vào các dashboard hồi cứu như AWS Cost Explorer hoặc CloudHealth. Dù hữu ích cho việc hạch toán hàng tháng, chúng chỉ cảnh báo khi tiền đã bị tiêu mất. Việc xử lý các khoản chi phí hạ tầng vượt ngoài tầm kiểm soát sau khi chạy terraform apply gây ra những xung đột không đáng có giữa platform team và developer.

Phương pháp Shift-left đã thay đổi hoàn toàn quy trình kiểm thử tự động và quét lỗ hổng bảo mật. Việc áp dụng tư duy chủ động tương tự vào quản lý chi phí cloud sẽ giúp ngăn chặn các sai sót tốn kém ngay trước khi mã nguồn được merge vào nhánh main.

Các khái niệm cốt lõi: Cách Infracost dịch chuyển nhận thức chi phí sang trái (Shift-left)

Infracost phân tích cú pháp mã Terraform HCL hoặc execution plan dạng JSON rồi đối chiếu từng tài nguyên được khai báo với dữ liệu giá của nhà cung cấp trên AWS, Azure và Google Cloud. Do ước tính chi phí theo phương pháp tĩnh (statically), bạn sẽ nhận được thông tin định giá nhanh chóng mà không cần truy vấn hạ tầng cloud đang chạy thực tế.

Các thành phần kiến trúc chính

  • Cloud Pricing API: Dịch vụ được quản lý theo dõi hơn 3 triệu SKU cloud, liên tục cập nhật mỗi khi các nhà cung cấp thay đổi mức giá theo giờ hoặc theo bậc (tier).
  • Diff Engine: Tính toán chênh lệch chi phí hàng tháng giữa nhánh đích và pull request sắp merge, phân tích chi tiết các phần thêm mới, cập nhật hoặc xóa bỏ.
  • Usage Profiles: Cho phép các đội ngũ chỉ định các tham số sử dụng động—chẳng hạn như 500 GB dung lượng S3 tiêu chuẩn hoặc 25 triệu request Lambda—thông qua file infracost-usage.yml.
  • CI/CD Commenter: Tự động đăng bảng phân tích định dạng markdown trực tiếp vào GitHub Pull Request hoặc GitLab Merge Request.

Thực hành: Tích hợp Infracost vào GitHub Actions

Hãy cùng cài đặt CLI trên máy cá nhân, kiểm tra chênh lệch chi phí của tài nguyên mẫu và cấu hình một workflow GitHub Actions tự động.

Bước 1: Cài đặt và xác thực Infracost CLI

Trước tiên, hãy cài đặt binary CLI trên máy làm việc của bạn để kiểm tra bảng phân tích chi phí trong quá trình phát triển cục bộ:

# Cài đặt trên macOS qua Homebrew
brew install infracost

# Cài đặt trên Linux
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh

# Xác thực để lấy API key của bạn
infracost auth login

Bước 2: Tạo bảng phân tích chi phí cục bộ

Xét một cấu hình Terraform đơn giản định nghĩa một EC2 instance kèm ổ đĩa gốc EBS:

# main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web_app" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "m5.xlarge"

  root_block_device {
    volume_size = 100
    volume_type = "gp3"
  }
}

Chạy lệnh tính toán chi phí trực tiếp trên thư mục của bạn:

infracost breakdown --path .

Infracost sẽ phân tích các file HCL và in ra bản tóm tắt chi phí hàng tháng:

Tên                                                   SL hàng tháng Đơn vị       Chi phí hàng tháng

aws_instance.web_app
├─ Mức sử dụng instance (Linux/UNIX, on-demand, m5.xlarge)     730  giờ               $140.16
└─ root_block_device
   └─ Lưu trữ (SSD đa dụng, gp3)                              100  GB                  $8.00

TỔNG CỘNG                                                                            $148.16

Bước 3: Tự động hóa so sánh chi phí trên Pull Request bằng GitHub Actions

Việc phát hiện sớm các nguy cơ đội chi phí trong quá trình code review giúp đảm bảo ngân sách luôn minh bạch giữa các nhóm kỹ thuật. Hãy thêm API token của bạn dưới dạng repository secret có tên INFRACOST_API_KEY, sau đó thêm file workflow này tại .github/workflows/infracost.yml:

name: Ước tính chi phí Infracost

on:
  pull_request:
    branches: [ main, master ]
    paths:
      - 'terraform/**'
      - '**.tf'

jobs:
  infracost:
    name: So sánh chi phí PR bằng Infracost
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write

    steps:
      - name: Checkout nhánh Base
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.base.ref }}

      - name: Cài đặt Infracost
        uses: infracost/actions/setup@v3
        with:
          api-key: ${{ secrets.INFRACOST_API_KEY }}

      # Tạo chi phí cơ sở (baseline) từ nhánh base
      - name: Tạo Infracost Baseline
        run: |
          infracost breakdown --path=terraform \
                              --format=json \
                              --out-file=/tmp/infracost-base.json

      - name: Checkout nhánh PR hiện tại
        uses: actions/checkout@v4

      # Tạo chênh lệch chi phí so với baseline
      - name: Tạo Diff chi phí Infracost
        run: |
          infracost diff --path=terraform \
                         --format=json \
                         --compare-to=/tmp/infracost-base.json \
                         --out-file=/tmp/infracost-diff.json

      # Đăng bảng phân tích chi phí dưới dạng comment trên GitHub PR
      - name: Đăng comment Infracost
        run: |
          infracost comment github --path=/tmp/infracost-diff.json \
                                   --repo=$GITHUB_REPOSITORY \
                                   --github-token=${{ secrets.GITHUB_TOKEN }} \
                                   --pull-request=${{ github.event.pull_request.number }} \
                                   --behavior=update

Bước 4: Thiết lập rào chắn kiểm soát FinOps (Guardrails)

Tính minh bạch là rất tốt, nhưng việc thực thi chính sách mới giúp ngăn chặn các commit vô tình làm đội ngân sách lớn. Bạn có thể phân tích file JSON diff đã tạo bằng jq và dừng build nếu pull request làm tăng chi phí hàng tháng vượt quá một giới hạn định trước (ví dụ: tăng hơn 200 USD/tháng khi chưa có sự phê duyệt của cấp quản lý):

# Trích xuất mức chênh lệch chi phí hàng tháng bằng jq
DIFF=$(jq -r '(.diffTotalMonthlyCost // 0)' /tmp/infracost-diff.json)
THRESHOLD=200

echo "Thay đổi chi phí dự kiến hàng tháng: $$DIFF"

if (( $(echo "$DIFF > $THRESHOLD" | bc -l) )); then
  echo "LỖI: Mức tăng chi phí $$DIFF vượt quá giới hạn $$THRESHOLD. Cần có sự phê duyệt từ FinOps."
  exit 1
fi

Sáu tháng trên Production: Những bài học kinh nghiệm

Việc triển khai Infracost trên hơn 40 microservice đã mang lại nhiều bài học thực tiễn giá trị cho các platform engineer:

  1. Định nghĩa usage profile từ sớm: Các thành phần serverless (AWS Lambda, DynamoDB on-demand, S3 Glacier) mặc định có giá 0.00 USD cho đến khi bạn cung cấp các số liệu ước tính về lượt gọi hàm và dung lượng lưu trữ trong infracost-usage.yml.
  2. Tập trung hóa cấu hình trong monorepo: Nếu repository của bạn duy trì các đường dẫn môi trường riêng biệt (chẳng hạn như environments/staging và environments/prod), hãy khai báo cấu hình đa dự án infracost.yml để đánh giá đồng thời tất cả các mục tiêu.
  3. Phản hồi trực quan thúc đẩy tự điều chỉnh: Khi các kỹ sư thấy chi phí tăng thêm 280 USD/tháng do nâng cấp cấu hình compute từ c5.2xlarge lên c5.4xlarge ngay trong PR của họ, họ thường sẽ chủ động tối ưu lại kích thước tài nguyên (right-size) trước khi yêu cầu review.

Tổng kết

Việc đưa thông tin chi phí trực tiếp vào GitHub pull request giúp chuyển đổi FinOps từ việc kiểm toán hàng tháng mang tính bị động thành một cơ chế bảo vệ kỹ thuật tự động. Hãy kết hợp Infracost với các CI/CD pipeline hiện có của bạn để giữ cho ngân sách cloud luôn minh bạch, dễ quản lý và có thể dự đoán được.

Share: