Cách cài đặt ước tính định giá GCP với Cloud Billing Catalog API

Tiếp nối series về cách cài đặt ước tính định giá tài nguyên và dịch vụ cloud, bài viết này sẽ hướng dẫn phương pháp định giá GCP cloud service thông qua API Cloud Billing Catalog.

Xem lại bài viết về cách cài đặt ước tính định giá Azure với RateCard API.

API Cloud Billing Catalog là một phần của Cloud Billing Service của GCP. Tài liệu hướng dẫn của GPC về API này rõ ràng hơn rất nhiều và cũng đơn giản hơn so với Azure Ratecard API, trong đó chỉ ra 3 cách để sử dụng API này:

  • Qua SDK
  • Qua Rest API
  • Qua RPC API

Chúng ta sẽ đi thẳng vào phương pháp sử dụng SDK. Hướng dẫn về RESTAPI đã rất rõ ràng, còn nếu bạn muốn dùng RPC thì bài viết về cách sử dụng API RPC của GCP sẽ rất hữu ích cho bạn.

Bước 1: Xác thực

Trước hết, ta cần xác thực request để có thể sử dụng các API của GCP. (Chi tiết được nêu trong: Tổng quan Xác thực Google Cloud). Trong phần này, ta sẽ sử dụng API key để xác thực. Ta có thể tạo service account trên trang Google Cloud Console > Credentials:

Bước 2: Lấy danh sách các service

Trong bước này, ta sẽ lấy danh sách các services của GCP (Compute Engine, Cloud Storage…) với {API_KEY} là API key mà ta tạo ra ở bước 1:

package main


import (
   "context"
   "encoding/json"
   "fmt"
   "google.golang.org/api/cloudbilling/v1"
   "google.golang.org/api/option"
)


func main() {
   ctx := context.Background()
   cloudbillingService, err := cloudbilling.NewService(ctx, option.WithAPIKey("{API_KEY}"))


   if err != nil {
      panic(err)
   }


   rsp, err := cloudbillingService.Services.List().PageToken("").Do()
   if err != nil {
      panic(err)
   }

  
   rs, _ := json.Marshal(rsp)
   fmt.Println(string(rs))
}

Ở đây ta sẽ thu được kết quả sau:

{
  "services": [
    {
      "name": "services/6F81-5844-456A",
      "serviceId": "6F81-5844-456A",
      "displayName": "Compute Engine",
      "businessEntityName": "businessEntities/GCP"
    },
    .
    .
    .
  ],
  "nextPageToken": ""
}

Trong đó:

  • name: resource name của service.
  • serviceId: identifier của service.
  • displayName: tên hiển thị của service.

Ta sẽ cần sử dụng name cho bước tiếp theo.

Lưu ý: Mỗi lần call API sẽ chỉ trả về một batch các services. Ta sẽ truyền nextPageToken vào code, rồi thực hiện call API lặp đi lặp lại cho tới khi nextPageToken là rỗng để lấy được danh sách đầy đủ tất cả dịch vụ.

Bước 3: Lấy danh sách SKU

Bây giờ ta có thể lấy được giá ước tính cho dịch vụ của GCP, với {API_KEY} ở bước 1 và {SERVICE_NAME} là name trong bước 2:

package main


import (
   "context"
   "encoding/json"
   "fmt"
   "google.golang.org/api/cloudbilling/v1"
   "google.golang.org/api/option"
)


func main() {
   ctx := context.Background()
   cloudbillingService, err := cloudbilling.NewService(ctx, option.WithAPIKey("{API_KEY}"))


   if err != nil {
      panic(err)
   }


   rsp, err := cloudbillingService.Services.Skus.List("{SERVICE_NAME}").Do()
   if err != nil {
      panic(err)
   }
   rs, _ := json.Marshal(rsp)
   fmt.Println(string(rs))
}

Thay {SERVICE_NAME} với name trong bước 2. Ví dụ: thay {SERVICE_NAME} thành “services/6F81-5844-456A”, tức tên của dịch vụ Compute Engine, và ta sẽ có kết quả sau:

{
  "skus": [
    {
      "name": "services/6F81-5844-456A/skus/B698-B91F-65F3",
      "skuId": "B698-B91F-65F3",
      "description": "Preemptible Compute optimized Ram running in Frankfurt",
      "category": {
        "serviceDisplayName": "Compute Engine",
        "resourceFamily": "Compute",
        "resourceGroup": "RAM",
        "usageType": "Preemptible"
      },
      "serviceRegions": [
        "europe-west3"
      ],
      "pricingInfo": [
        {
          "summary": "",
          "pricingExpression": {
            "usageUnit": "GiBy.h",
            "usageUnitDescription": "gibibyte hour",
            "baseUnit": "By.s",
            "baseUnitDescription": "byte second",
            "baseUnitConversionFactor": 3865470566400,
            "displayQuantity": 1,
            "tieredRates": [
              {
                "startUsageAmount": 0,
                "unitPrice": {
                  "currencyCode": "USD",
                  "units": "0",
                  "nanos": 1347000
                }
              }
            ]
          },
          "currencyConversionRate": 1,
          "effectiveTime": "2020-08-18T22:12:14.341Z"
        }
      ],
      "serviceProviderName": "Google",
      "geoTaxonomy": {
        "type": "REGIONAL",
        "regions": [
          "europe-west3"
        ]
      }
    },
    .
    .
    .
  ],
  "nextPageToken": ""
}

Kết quả sẽ chứa một mảng skus, với mỗi sku là một JSON object. Tiếp tục gọi API liên tục cho tới khi nextPageToken là rỗng để lấy được danh sách đầy đủ (tương tự như trong bước 2).

Tuy GCP đã phân nhóm các skus theo service, tức là response đã nhỏ hơn rất nhiều, song ta vẫn cần lọc ra những sku mà ta cần. Dưới đây là một số field của sku object sẽ hữu ích cho việc lọc này:

  • serviceRegions: khu vực có thể sử dụng SKU này
  • description: mô tả về SKU
  • resourceGroup: một nhóm các phân loại có liên quan tới SKU (“RAM, “GPU”, “InterRegionEgress”,…)

“skuId” (yếu tố định danh SKU) sẽ giúp ta định danh chính xác sản phẩm đang cần.

Cuối cùng, hãy xem xét kết quả. Ví dụ một SKU object như sau:

{
  "name": "services/6F81-5844-456A/skus/B62C-9514-EC43",
  "skuId": "B62C-9514-EC43",
  "description": "Network Inter Region Egress from Americas to Sao Paulo",
  "category": {
    "serviceDisplayName": "Compute Engine",
    "resourceFamily": "Network",
    "resourceGroup": "InterregionEgress",
    "usageType": "OnDemand"
  },
  "serviceRegions": [
    "us-central1",
    "us-east1",
    "us-west1"
  ],
  "pricingInfo": [
    {
      "summary": "",
      "pricingExpression": {
        "usageUnit": "GiBy",
        "usageUnitDescription": "gibibyte",
        "baseUnit": "By",
        "baseUnitDescription": "byte",
        "baseUnitConversionFactor": 1073741824,
        "displayQuantity": 1,
        "tieredRates": [
          {
            "startUsageAmount": 0,
            "unitPrice": {
              "currencyCode": "USD",
              "units": "0",
              "nanos": 0
            }
          },
          {
            "startUsageAmount": 1,
            "unitPrice": {
              "currencyCode": "USD",
              "units": "0",
              "nanos": 80000000
            }
          }
        ]
      },
      "aggregationInfo": {
        "aggregationLevel": "ACCOUNT",
        "aggregationInterval": "MONTHLY",
        "aggregationCount": 1
      },
      "currencyConversionRate": 1,
      "effectiveTime": "2020-08-18T22:12:14.341Z"
    }
  ],

  "serviceProviderName": "Google"
}

Quan sát các field usageUnit, units, nanosaggregationInterval, chúng ta sẽ thấy giá ước tính của Network Inter Region Egress from Americas to Sao Paulo như sau:

  • 1GB đầu: 0USD/tháng
  • >1Gb: 80000000/10^9 = 0,08 USD/tháng

Kết luận

API Cloud Billing Catalog trả kết quả là một JSON object khổng lồ cần được xử lý thêm. Bài viết cũng đã gợi ý một số field trong JSON object hữu ích cho quá trình lọc. Qua bài viết, hi vọng bạn có thể sử dụng API Cloud Billing Catalog dễ dàng hơn và giúp tiết kiệm nhiều thời gian hơn. Cảm ơn bạn đã dành thời gian theo dõi bài viết!

Atekco - Home for Authentic Technical Consultants