Cách cài đặt ước tính định giá AWS bằng AWS SDK for Go

Để phục vụ nhu cầu ước tính định giá cho các dịch vụ cloud, AWS đã tích hợp pricing service trong các bộ SDK của họ. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách tra cứu bảng giá với bộ SDK cho ngôn ngữ Go.

Upload image

Trong loạt bài của Atekco về cách tra cứu giá dịch vụ cloud của hai nhà cung cấp AzureGCP, chúng ta sẽ thấy rằng để lấy được dữ liệu mong muốn thì cần phải tải về một lượng thông tin khổng lồ và thực hiện việc tra cứu trên đó. Việc này làm cho quá trình tính toán chi phí rất chậm và ta phải thực hiện các biện pháp cache để rút ngắn thời gian chờ.

Với AWS, việc tra cứu thông tin chi phí được hỗ trợ trong các bộ thư viện cho nhiều ngôn ngữ khác nhau. Ngoài ra, SDK còn hỗ trợ chúng ta lựa chọn các thuộc tính cần thiết để tra cứu ra được thông tin mức giá cần tìm trong thời gian ngắn.

Hãy cùng tìm hiểu cách định giá AWS trong Golang thông qua bài viết hướng dẫn cụ thể này nhé!

Khởi tạo pricing service

Bắt đầu bằng việc import các thư viện cần thiết:

import (
   "encoding/json" // For printing purpose, not require
   "github.com/aws/aws-sdk-go/aws"
   "github.com/aws/aws-sdk-go/aws/credentials"
   "github.com/aws/aws-sdk-go/aws/session"
   "github.com/aws/aws-sdk-go/service/pricing"
)

Sau đó, chúng ta bắt đầu khởi tạo pricing service:

// Create session
sess, err := session.NewSession(&aws.Config{
   Region:      aws.String("AWS_REGION"),
   Credentials: credentials.NewStaticCredentials("AWS_ID", "AWS_SECRET", "AWS_TOKEN"),
})
if err != nil {
   panic(err)
}
// Create pricing service
pricingService := pricing.New(sess)

Đầu tiên chúng ta sẽ khởi tạo một session bằng hàm session.NewSession() với thông tin đăng nhập gồm id, secret và region của account.

Thông số “AWS_TOKEN” chỉ cần điền khi ta có sử dụng dịch vụ AWS Security Token Service (AWS STS), còn nếu không thì chúng ta có thể để thành chuỗi rỗng.

Sau đó, pricing sẽ được tạo ra bằng session vừa khởi tạo.

Sử dụng pricing service để lấy giá dịch vụ cần tìm

Trước khi bắt đầu tìm kiếm bảng giá, ta sẽ khởi tạo một Input object để có thể chọn những thuộc tính cần tìm kiếm. Sau đây là ví dụ về việc tìm kiếm chi phí để tạo cluster trong service AmazonEKS trong khu vực Asia Pacific (Mumbai):

input := &pricing.GetProductsInput{
   ServiceCode: aws.String("AmazonEKS"),
   Filters: []*pricing.Filter{
      {
         Type:  aws.String("TERM_MATCH"),
         Field: aws.String("location"),
         Value: aws.String("Asia Pacific (Mumbai)"),
      },
      {
         Type:  aws.String("TERM_MATCH"),
         Field: aws.String("usagetype"),
         Value: aws.String("APS3-AmazonEKS-Hours:perCluster"),
      },
      // More filter fields
   },
   // MaxResults:    aws.Int64(100),
   // NextToken:     aws.String(""),
   // FormatVersion: aws.String("aws_v1"),
}

Một số lưu ý khi khởi tạo GetProductsInput:

  • “ServiceCode” là field duy nhất bắt buộc phải điền. Chúng ta có thể lấy danh sách các service code của các service qua CLI của AWS.
  • “Filters” dùng để đưa những thuộc tính của dịch vụ ta cần tìm kiếm.
  • “MaxResults” sẽ khống chế số lượng product (tên gọi của biểu giá dịch vụ trong AWS) được trả về, tối đa là 100.
  • “NextToken” được sử dụng để lấy thêm các product, token này nằm trong kết quả trả về (nếu có).

Sau đó, ta sẽ lấy thông tin chi phí bằng hàm GetProducts:

result, err := pricingService.GetProducts(input)
if err != nil {
   panic(err)
}
// Printing the result in json format
for _, value := range result.PriceList {
   b, err := json.Marshal(&value)
   if err != nil {
      panic(err)
   }
   println(string(b))
}

Thông tin product có định dạng như sau:

{
  "product": {
    "attributes": {
      "location": "Asia Pacific (Mumbai)",
      "locationType": "AWS Region",
      "operation": "CreateOperation",
      "servicecode": "AmazonEKS",
      "servicename": "Amazon Elastic Container Service for Kubernetes",
      "tiertype": "HAStandard",
      "usagetype": "APS3-AmazonEKS-Hours:perCluster"
    },
    "productFamily": "Compute",
    "sku": "RQJ9MJY8F5PSNNWU"
  },
  "publicationDate": "2021-11-01T15:29:55Z",
  "serviceCode": "AmazonEKS",
  "terms": {
    "OnDemand": {
      "RQJ9MJY8F5PSNNWU.JRTCKXETXF": {
        "effectiveDate": "2021-10-01T00:00:00Z",
        "offerTermCode": "JRTCKXETXF",
        "priceDimensions": {
          "RQJ9MJY8F5PSNNWU.JRTCKXETXF.6YS6EN2CT7": {
            "appliesTo": [],
            "beginRange": "0",
            "description": "Amazon EKS cluster usage in Asia Pacific (Mumbai)",
            "endRange": "Inf",
            "pricePerUnit": {
              "USD": "0.1000000000"
            },
            "rateCode": "RQJ9MJY8F5PSNNWU.JRTCKXETXF.6YS6EN2CT7",
            "unit": "Hours"
          }
        },
        "sku": "RQJ9MJY8F5PSNNWU",
        "termAttributes": {}
      }
    }
  },
  "version": "20211101152955"
}

Ta có thể dễ dàng lấy được giá dịch vụ của Amazon EKS cluster là 0.1 USD/1h cho mỗi cluster. Các thuộc tính trong product object là các giá trị để chúng ta có thể tìm kiếm khi định nghĩa Input cho hàm GetProducts.

Một số chia sẻ trong quá trình định giá

Để biết công thức để tính toán chi phí cần thiết, ta có xem tại trang calculator của AWS.

Các bước thực hiện rất đơn giản: chọn “Create estimate” > chọn service cần tính toán > config và chọn “Show Calculations”. Ta sẽ thấy được cách tính giá cụ thể như trong ví dụ sau:

Upload image

Ta có thể đặt thuộc tính MaxResults trong Input thành 1 để có thể xem các thuộc tính có thể dùng để lọc ra product cần tìm kiếm.

Mỗi product có một thuộc tính định danh duy nhất là sku. Chúng ta có thể dựng lên một hàm để query product theo hai thuộc tính đó. Sau này khi cần sửa công thức tính, ta chỉ việc thay đổi bộ config service code và sku.

// Find by service code and sku
input := &pricing.GetProductsInput{
   ServiceCode: aws.String("AmazonEKS"),
   Filters: []*pricing.Filter{
      {
         Type:  aws.String("TERM_MATCH"),
         Field: aws.String("sku"),
         Value: aws.String("RQJ9MJY8F5PSNNWU"),
      },
   }
}

Trên đây là hướng dẫn để định giá dịch vụ cho các dịch vụ của AWS bằng SDK cho Golang. Ở các SDK cho các ngôn ngữ khác cũng có tính hợp tính năng này, chúng ta có thể tìm kiếm bộ thư viện cho ngôn ngữ mình đang dùng để sử dụng.

Hy vọng bài viết này sẽ giúp ích cho dự án mà bạn đang làm.

Atekco - Home for Authentic Technical Consultants