Cách cài đặt ước tính định giá Azure với RateCard API

Đa số các Cloud provider đều cung cấp API giúp thu thập thông tin ước tính định giá. Bài viết này sẽ hướng dẫn cách cài đặt Azure RateCard API ngay từ đầu với hy vọng có thể giúp bạn tiết kiệm thời gian hơn.

Nói về API thu thập thông tin định giá, AWS có Price List API, Google Cloud với Cloud Billing Catalog API, Azure sẽ là Resource RateCard API. Các API này có thể hỗ trợ lấy thông tin ước tính định giá, ví dụ như chi phí sử dụng máy ảo (virtual machine) hoặc lưu trữ trên Cloud (storage). Atekco sẽ có loạt bài hướng dẫn cài đặt API này cho các dịch vụ của Azure, GCP và AWS. Đầu tiên sẽ là bài viết về Azure RateCard API.

Azure Resource RateCard API được xem là một phần của Billing APIs. Trong tài liệu hướng dẫn của API này, Azure đã giải thích rất chi tiết về các field và value cho request/response. Tuy nhiên, Azure lại không nhắc nhiều tới việc setup ngay từ đầu để có thể sử dụng được API này. Họ chỉ yêu cầu mình cần phải có một OAuth bearer token lấy từ Azure Active Directory. Đây cũng chính là lý do khiến chúng ta mất rất nhiều thời gian cho việc cài đặt.

Mình dám cá là chẳng ông nào muốn vật vã với bước cài đặt này. Vậy nên mình viết bài này với mục tiêu giúp bạn biết cách sử dụng API Resource RateCard để lấy các thông tin ước tính định giá cho những dịch vụ của Azure.

Chúng ta sẽ bắt đầu thực hiện các bước để truy cập vào RateCard API bằng một tài khoản Azure hoàn toàn mới.

Cài đặt ban đầu

Bước 1: Cài đặt Azure CLI

Trước hết, bạn hãy làm theo các chỉ dẫn trong link này để cài đặt Azure CLI. Bước này cũng có thể sử dụng Azure portal nhưng cá nhân mình thì thích sử dụng CLI hơn. Tiếp theo là lấy admin credential:

$ az login

Bước 2: Đăng ký resource provider

Theo bản hướng dẫn này, RateCard API có resource provider là “Microsoft.Commerce". Bạn có thể xem thêm về provider này tại đây.

Thực hiện đăng ký “Microsoft.Commerce” thông qua lệnh sau:

$ az provider register --namespace Microsoft.Commerce

Lưu ý: Một số bài viết sẽ yêu cầu bạn phải đăng ký một provider khác như: Microsoft.Compute, Microsoft.Resources, Microsoft.ContainerService, … Nhưng mình nhấn mạnh lại lần nữa là chúng ta chỉ cần đăng ký “Microsoft.Commerce” thôi.

Bước 3: Tạo custom role definition

Bước này sẽ cần tạo role với các quyền cần thiết. Bạn có thể tìm hiểu Azure custom role để biết thêm chi tiết. Tạo JSON file có chứa role definition đã được bạn cài đặt bên trên, đặt tên file này là ratecard-role.json. Nhớ thay thế {SUBSCRIPTION_ID} bằng ID đã đăng ký từ tài khoản của bạn.

ratecard-role.json

{
  "Name": "MyRateCardAPIRole",
  "IsCustom": true,
  "Description": "Role for RateCardAPI",
  "Actions": [
    "Microsoft.Commerce/RateCard/read"
  ],
  "AssignableScopes": [
    "/subscriptions/{SUBSCRIPTION_ID}"
  ]
}

Tiếp theo là đăng ký role definition:

$ az role definition create --verbose --role-definition @ratecard-role.json
{
  "assignableScopes": [
    "/subscriptions/{SUBSCRIPTION_ID}"
  ],
  "description": "Role for RateCardAPI",
  "id": "/subscriptions/{SUBSCRIPTION_ID}/providers/Microsoft.Authorization/roleDefinitions/{ID}",
  "name": "{ID}",
  "permissions": [
    {
      "actions": [
        "Microsoft.Commerce/RateCard/read"
      ],
      "dataActions": [],
      "notActions": [],
      "notDataActions": []
    }
  ],
  "roleName": "MyRateCardAPIRole",
  "roleType": "CustomRole",
  "type": "Microsoft.Authorization/roleDefinitions"
}

Lưu ý: Giống như ở bước 2, một số bài viết sẽ yêu cầu custom role phải có nhiều loại quyền. Tuy nhiên thực ra mình chỉ cần tới quyền “Microsoft.Commerce/RateCard/read” thôi, không cần thiết phải cấp quá nhiều quyền.

Bước 4: Đăng ký application

Tiếp theo sẽ là bước đăng ký application gán với role vừa được tạo ở bước 3:

$ az ad sp create-for-rbac --name "MyRateCardAPIApp" --role "MyRateCardAPIRole" --sdk-auth true > my_credentials.jsons

Đổi "MyRateCardAPIApp" thành một URI hợp lệ có dạng "http://MyRateCardAPIApp", cũng là định dạng được quy định cho tên của dịch vụ chính.

Tạo phân bổ role dưới dạng "/subscriptions/{SUBSCRIPTION_ID}".

Thử lại việc tạo phân bổ role : 1/36.

Bạn có thể tìm thấy các credential được lưu trong file my_credentials.json và sẽ được sử dụng sau:

my_credentails.json
{
  "clientId": "{CLIENT_ID}",
  "clientSecret": "{CLIENT_SECRET}",
  "subscriptionId": "{SUBSCRIPTION_ID}",
  "tenantId": "{TENANT_ID}",
  "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
  "resourceManagerEndpointUrl": "https://management.azure.com/",
  "activeDirectoryGraphResourceId": "https://graph.windows.net/",
  "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
  "galleryEndpointUrl": "https://gallery.azure.com/",
  "managementEndpointUrl": "https://management.core.windows.net/"

Gọi API

Để thực hiện gọi API tới RateCard API, ta sẽ thực hiện theo các bước dưới đây:

Bước 1: Lấy access token từ Azure Active Directory (Bước 1 & 2 trong biểu đồ)

Do Azure không cung cấp SDK cho RateCard API nên mình sẽ cần sử dụng một REST client để gọi API. Để dễ hiểu thì mình sẽ minh họa bằng cURL.

Theo biểu đồ ở trên, trước hết chúng ta sẽ cần gọi client_credential tới Azure Active Directory để lấy access token.

$ curl https://login.microsoftonline.com/{TENANT_ID}/oauth2/token \
  -F grant_type=client_credentials \
  -F resource=https://management.core.windows.net/ \
  -F client_id={CLIENT_ID} \
  -F client_secret={CLIENT_SECRET}
{
  "token_type": "Bearer",
  "expires_in": "3600",
  "ext_expires_in": "3600",
  "expires_on": "1576495607",
  "not_before": "1576491707",
  "resource": "https://management.core.windows.net/",
  "access_token": "{ACCESS_TOKEN}"
}

Lúc này, bạn có thể lấy {TENANT_ID}, {CLIENT_ID}, {CLIENT_SECRET” từ file my_credentials.json đã được tổng hợp ở phần trước.

Bước 2: Gọi RateCard API (Bước 3 & 4 trong biểu đồ)

Ở bước 1, chúng ta đã nhận được access token. Bây giờ chúng ta sẽ sử dụng access token này để gọi RateCard API:

$ curl -L \ "https://management.azure.com/subscriptions/YOUR_SUBSCRIPTION_ID/providers/Microsoft.Commerce/RateCard?api-version=2016-08-31-preview&%24filter=OfferDurableId+eq+'MS-AZR-0003P'+and+Currency+eq+'USD'+and+Locale+eq+'en-US'+and+RegionInfo+eq+'US'" \
-H 'Authorization: Bearer {ACCESS_TOKEN}' > output.json

Lưu ý: Trong lệnh phía trên, value của OfferDurableId được định là “MS-AZR-0003P”, là Offer ID – một hình thức pay-as-you-go (trả phí theo nhu cầu sử dụng Azure). Xem thêm Microsoft Azure Offer Details để lấy Offer ID tương ứng với gói Azure mà bạn đang sử dụng. Hiện RateCard API không hỗ trợ cho gói doanh nghiệp (enterprise), đồng thời tài khoản thuộc gói này cũng không có Offer ID.

Quá trình gọi API có thể tốn vài giây do phản hồi lên tới khoảng 16MB. Mặc dù API này đã ra mắt được vài năm nhưng tới nay API chỉ trả về một file khổng lồ chứa tất cả thông tin trong đó, chứ không thể truy vấn giá của từng dịch vụ được. Hy vọng sắp tới Azure sẽ cập nhật cơ chế tương tự như Price List API của AWS.

Quay lại với vấn đề chính, kết quả sau khi gọi API sẽ được hiển thị trong file output.json:

output.json

{
  "OfferTerms": [],
  "Meters": [
    {
      "EffectiveDate": "2020-05-01T00:00:00Z",
      "IncludedQuantity": 0.0,
      "MeterCategory": "Virtual Machines",
      "MeterId": "cd2d7ca5-2d4c-5f93-94d0-8cee0662c71c",
      "MeterName": "E20 v4",
      "MeterRates": {
        "0": 1.52
      },
      "MeterRegion": "AP Southeast",
      "MeterStatus": "Active",
      "MeterSubCategory": "Ev4 Series",
      "MeterTags": [],
      "Unit": "1 Hour",
    }
    .
    .
    .
    .
    .
  ]
}

Có thể thấy rằng, kết quả chứa rất nhiều loại Meter, trong đó mỗi Meter là một JSON object. Có thể thấy Azure đã tạo một file chứa JSON object khổng lồ nặng tới 16MB. Để tìm ra giá cho từng nhóm hoặc resource nào đó thì chúng ta sẽ phải lọc lại object này. Dưới đây là một số gợi ý về các loại Meter hữu ích cho việc lọc:

  • MeterRegion: Khu vực có hỗ trợ dịch vụ Azure
  • MeterCategory: Phân loại meter (ví dụ: “Virtual Machine”, “Virtual Network”, …)
  • MeterSubCategory: Phân loại phụ của Meter (“Ev4 Series”, “IP Addresses”, …)
  • MeterName: Tên của Meter nằm trong MeterCategory

Ngoài ra, “MeterId” (yếu tố định danh riêng của resource) sẽ đưa đến sản phẩm chính xác mà ta cần. Bạn có thể chọn bất cứ Meter nào, miễn là chúng thỏa mãn các nhu cầu của bạn.

Cuối cùng, ta có kết quả như bên dưới. Ví dụ về một Meter object như sau:

{
  "EffectiveDate": "2020-03-01T00:00:00Z",
  "IncludedQuantity": 0.0,
  "MeterCategory": "Storage",
  "MeterId": "fae5184f-e8d4-4864-ad02-5853d49b3403",
  "MeterName": "Hot LRS Data Stored",
  "MeterRates": {
    "0": 0.021,
    "51200.0000000000": 0.02,
    "512000.0000000000": 0.0191
  },
  "MeterRegion": "US North Central",
  "MeterStatus": "Active",
  "MeterSubCategory": "General Block Blob v2 Hierarchical Namespace",
  "MeterTags": [],
  "Unit": "1 GB/Month"
},

Quan sát các mục Meter RatesUnit, chúng ta sẽ có được giá ước tính của General Block Blob v2 Hierarchical Namespace trong khu vực US North Central (trung tâm Bắc Mỹ) như sau:

  • 51200Gb đầu: $0.021/tháng
  • 52100 – 512000Gb: $0.02/tháng
  • > 512000Gb: $0.0191/tháng

Nhìn chung thì việc tạo yêu cầu ước tính định giá với RateCard API cũng khá đơn giản. Chỉ có bước cài đặt ban đầu hơi lằng nhằng do tài liệu của Azure viết chưa rõ ràng lắm. Hy vọng bài viết này sẽ giúp bạn tiết kiệm thời gian tìm hiểu và sử dụng RateCard API một cách dễ dàng.

Cảm ơn bạn đã đọc đến đây nhé!

Atekco - Home for Authentic Technical Consultants