GCP Price Info Driver Development Guide - cloud-barista/cb-spider GitHub Wiki

    * GCP Price Info 드라이버 개발관련 이슈 및 추진 현황

[이슈]

  • GetPriceInfo() 제공 형상을 위한 적합한 API 부재
  • 1개 이상의 API 조합으로 생성/변환으로 가능하지만,
    • (이슈-1) 베타 버전 API 활용으로 추후 잠재적 이슈 발생 가능
    • (이슈-2) CSP API의 과한 호출 필요 => Call Limit 발생 => worst elapsed time (최소 18분)
  • 세부 내용: 다음 MSG 참고
    • image

[다음 방안으로 추진] 2024.01.10 이후

  • 1안) 대기중, best, 구글 응답 의존적

  • 3안) 추진중, Call Limit/소요시간 이슈 존재

    • 구글 응답 결과에 따라 1안)으로 전환 가능성 있음
  • 참고: 1안)/2안) 세부 설명

    • image

[이하 내용은 GCP 가격 정보 제공 관련 참고 용으로 활용] 2024.01.10 이전

1. GCP 가격 정보 제공 방법 관련 (Compute Engine 중심)

  • 더 많은 방법을 제공할 수 있지만, Spider 가격정보 제공과 관련 있는 3가지 방법으로 정리
  • (1) SKU 기반 가격 정보 제공 방법
  • (2) Cost Estimation, Cost Calculator를 활용한 가격 정보 제공 방법
  • (3) 인스턴스 타입(머신 타입) 중심 가격 정보 제공 방법
  • ※ (1), (2), (3) 개별 방법으로는 Spider GetPriceInfo() 형상 제공 어려움
    • (1) 방법: 타 CSP와 달리 SKU 제품 정보에 인스턴스 관련 정보가 부족
    • (2) 방법: 사용할 자원/서비스 단위 입력을 통한 예상 가격을 제공 => 필요한 모든 자원/서비스에 대한 입력 필요, Call Limit 이슈 등
    • (3) 방법: Cached 정보 또는 Web Page 형태로 제공 => old 가격 정보 또는 html 파싱이 필요 => 유지보수 이슈 등 리스크 존재
  • 관련 현황
  • [참고: SKU & Cloud SKU]
    • image
  • image

2. (1) SKU 기반 가격 정보 제공 현황

  • API/CLI 등을 통해서 전체 제품/서비스별 가격 정책을 상세하게 제공
  • 다만, VM 인스턴스 타입(머신 타입) 정보가 Spider에서 제공하는 수준의 정보가 포함되어 있지 않음
  • SKU 기반 가격 정보에 포함된 인스턴스 타입 정보는 resourceGroupdescription 등에 약하게 포함
  • 사실, GCP의 경우 인스턴스 타입을 사용자가 생성할 수 있기 때문에 SKU 입장에서는 사전 정의된 인스턴스 타입의 중요도가 크지 않는 듯함
    • 대신, 인스턴스 타입 그룹(N1Standard 등)의 CPU, Mem 기준 가격을 제시하고 있음
    • 개별 인스턴스 타입(n1-standard-16 )에 대한 가격은 계산으로 얻을 수 있음

[사전 준비]

[활용 예시 및 제공 정보]

$ curl https://cloudbilling.googleapis.com/v1/services?key={your API KEY}  # 한번에 전부 제공
{
  "services": [
    {
      "name": "services/0017-8C5E-5B91",
      "serviceId": "0017-8C5E-5B91",
      "displayName": "OpenLogic CentOS 7.8 (v20200922) - Security Hardened",
      "businessEntityName": "businessEntities/GCP"
    },
    ...
$ curl https://cloudbilling.googleapis.com/v1/services/6F81-5844-456A/skus?key={your API KEY}   # Next Page 3번 정도 Call 해야 함(https://...&pageToken=xxx)
{
  "skus": [
    {
      "name": "services/6F81-5844-456A/skus/0006-C9C8-BB6F",
      "skuId": "0006-C9C8-BB6F",
      "description": "Commitment v1: Memory-optimized Cpu in Phoenix for 1 Year",
      "category": {
        "serviceDisplayName": "Compute Engine",
        "resourceFamily": "Compute",
        "resourceGroup": "CPU",
        "usageType": "Commit1Yr"
      },
      "serviceRegions": [
        "us-west8"
      ],
      "pricingInfo": [
        {
          "summary": "",
          "pricingExpression": {
            "usageUnit": "h",
            "displayQuantity": 1,
            "tieredRates": [
              {
                "startUsageAmount": 0,
                "unitPrice": {
                  "currencyCode": "USD",
                  "units": "0",
                  "nanos": 20550000
                }
              }
            ],
            "usageUnitDescription": "hour",
            "baseUnit": "s",
            "baseUnitDescription": "second",
            "baseUnitConversionFactor": 3600
          },
          "currencyConversionRate": 1,
          "effectiveTime": "2024-01-08T08:49:30.488759Z"
        }
      ],
      "serviceProviderName": "Google",
      "geoTaxonomy": {
        "type": "REGIONAL",
        "regions": [
          "us-west8"
        ]
      }
    },
    ...

3. (2) Cost Estimation, Cost Calculator를 활용한 가격 정보 제공 방법

  • 생략: Call Limit 이슈 등으로 사용하지 않을 것이므로

4. (3) 인스턴스 타입(머신 타입) 중심 가격 정보 제공 현황

  • GCP Web: html 파싱 및 유지등 리스크가 있음
    • 활용하지는 않을 것이지만, 인스턴스 타입 종류 및 가격 정보 제공 기준/검증 등에 활용
  • Cached json file 및 GCP Web 등을 통해서 VM 인스턴스 중심의 가격 정책을 제공
    • Cached json file: 현재 실기간 가격 제공이 어려움,

[활용 예시 및 제공 정보]

  • VM 인스턴스 타입(머신 타입) 제공 웹 페이지

    https://cloud.google.com/compute/docs/machine-resource?hl=ko#standard_machine_types
    
  • VM 인스턴스 가격 책정 제공 웹페이지

    • 드라이버 개발시 Compute Engine 머신 유형별 가격 정보 검증 등으로 참고
    https://cloud.google.com/compute/vm-instance-pricing?hl=ko
    
  • Cached json file

    • 첫줄 comment를 잘 봐야 함: update 되기 전 사이의 가격은 틀릴 수 있음

      • 그럼에도 불구하고, 계속 업데이트하면서 유지 되는 것은 내부에서 또는 특수 그룹에서 계속 활용되는 것으로 추정되며,
      • 내부에서도 인스턴스 세부 타입별 가격 정보가 필요한 것을 알수 있음
      • 필요성에 대해서는 구글링에서도 보이고 다음 등록된 이슈를 보면, 지속적으로 찾고 있는 상황
    • 자원 그룹별로 1년 약정 및 3년 약정 가격 제공

    • 제품/서비스에 대한 Region별 OnDemand 가격과 Preemptible 가격 정보 포함

    • 활용 방법 및 정보 예시

curl https://cloudpricingcalculator.appspot.com/static/data/pricelist.json
{
  "comment": "This JSON data is obsolete. Please use https://cloud.google.com/billing/v1/how-tos/catalog-api instead.",
  "updated": "3-January-2024",
  "version": "v1.75",
  "gcp_price_list": {
    "CP-ALLOYDB-BACKUP": {
      "asia-east1": 0.0001589,
      "asia-east2": 0.0001918,
      "asia-northeast1": 0.0001753,
      "asia-northeast2": 0.0001753,
      "asia-northeast3": 0.0001753,
      "asia-south1": 0.0001425,
      ...
  • N1 머신 유형 약정 목록 확인 예시
grep N1 pricelist.json |grep YEAR
    "CP-COMPUTEENGINE-N1-CUD-1-YEAR-CPU": {
    "CP-COMPUTEENGINE-N1-CUD-1-YEAR-RAM": {
    "CP-COMPUTEENGINE-N1-CUD-3-YEAR-CPU": {
    "CP-COMPUTEENGINE-N1-CUD-3-YEAR-RAM": {
  • N1 머신 유형 1년 약정 가격 (3년 약정 가격은 생략)
    • CPU 가격 정보 예시
cat pricelist.json |jq '.gcp_price_list."CP-COMPUTEENGINE-N1-CUD-1-YEAR-CPU"'
{
  "africa-south1": 0.02604882,
  "asia-east1": 0.023059,
  "asia-east2": 0.0278655,
  "asia-northeast1": 0.025589,
  "asia-northeast2": 0.025589,
  "asia-northeast3": 0.025589,      <=========
  "asia-south1": 0.0239186,
  ...
    • Memory 가격 정보 예시
cat pricelist.json |jq '.gcp_price_list."CP-COMPUTEENGINE-N1-CUD-1-YEAR-RAM"'
{
  "africa-south1": 0.003491052,
  "asia-east1": 0.003091,
  "asia-east2": 0.0037346,
  "asia-northeast1": 0.003414,
  "asia-northeast2": 0.003414,
  "asia-northeast3": 0.003414,       <=========
  "asia-south1": 0.003205,
  • GCP Web에서 확인
    • image
  • n1-standard-16 OnDemand 가격 정보 예시
cat pricelist.json |jq '.gcp_price_list."CP-COMPUTEENGINE-VMIMAGE-N1-STANDARD-16"'
{
  "asia": 0.88,
  "asia-east": 0.88,
  "asia-east1": 0.88,
  "asia-east2": 1.0634,
  "asia-northeast": 0.976,
  "asia-northeast1": 0.976,
  "asia-northeast2": 0.976,
  "asia-northeast3": 0.976,        <===========
  "asia-south1": 0.9127,
  ...
  • n1-standard-16 Preemptible 가격 예시
cat pricelist.json |jq '.gcp_price_list."CP-COMPUTEENGINE-VMIMAGE-N1-STANDARD-16-PREEMPTIBLE"'
{
  "asia": 0.176,
  "asia-east": 0.176,
  "asia-east1": 0.176,
  "asia-east2": 0.2242,
  "asia-northeast": 0.212,
  "asia-northeast1": 0.212,
  "asia-northeast2": 0.212,
  "asia-northeast3": 0.212,      <==========
  "asia-south1": 0.19243,
  • GCP Web에서 확인
    • image

5. 제안 방법 및 가이드

  • 머신 타입 상세 정보와 위 방법 중 (1) SKU 기반 가격 정보 제공 방법 조합/변환하여 활용

['머신 타입 상세 정보' 활용 예시 및 제공 정보]

  • getPriceInfo()가 제공하는 제품 정보를 제공하기 위해서
  • GCP가 제공하는 머신 타입 상세 정보를 활용
  • 본 가이드에서는 편의상 cli를 활용(드라이버 개발시에는 SDK API 활용)
  • 편의상 일단 전체 머신 타입을 파일로 받기
gcloud compute machine-types list --format=json > gcloud.compute.machine-types.list-json.json
  • Zone별로 제공하는 머신 타입과 관련된 규격 정보를 제공
  • 제공 정보 예시
[
  {
    "accelerators": [
      {
        "guestAcceleratorCount": 1,
        "guestAcceleratorType": "nvidia-tesla-a100"
      }
    ],
    "creationTimestamp": "1969-12-31T16:00:00.000-08:00",
    "description": "Accelerator Optimized: 1 NVIDIA Tesla A100 GPU, 12 vCPUs, 85GB RAM",
    "guestCpus": 12,
    "id": "1000012",
    "imageSpaceGb": 0,
    "isSharedCpu": false,
    "kind": "compute#machineType",
    "maximumPersistentDisks": 128,
    "maximumPersistentDisksSizeGb": "263168",
    "memoryMb": 87040,
    "name": "a2-highgpu-1g",
    "selfLink": "https://www.googleapis.com/compute/v1/projects/powerkimhub/zones/us-central1-a/machineTypes/a2-highgpu-1g",
    "zone": "us-central1-a"
  },
  ...
  • 참고: 제공하는 머신 타입 종류 (243개)
grep name gcloud.compute.machine-types.list-json.json |sort |uniq
    "name": "a2-highgpu-1g",
    "name": "a2-highgpu-2g",
    "name": "a2-highgpu-4g",
    "name": "a2-highgpu-8g",
    "name": "a2-megagpu-16g",
  • 제공하는 머신 타입 정보는 대상 머신 타입을 제공하는 zone마다 중복 하여 제공
    • 참고: 머신 타입이 동일하면, zone 정보를 제외하고 모두 동일한 정보를 제공
cat gcloud.compute.machine-types.list-json.json | jq 'map(select(.name=="n1-standard-1"))'
[
  {
    "creationTimestamp": "1969-12-31T16:00:00.000-08:00",
    "description": "1 vCPU, 3.75 GB RAM",
    "guestCpus": 1,
    "id": "3001",
    "imageSpaceGb": 10,
    "isSharedCpu": false,
    "kind": "compute#machineType",
    "maximumPersistentDisks": 128,
    "maximumPersistentDisksSizeGb": "263168",
    "memoryMb": 3840,
    "name": "n1-standard-1",
    "selfLink": "https://www.googleapis.com/compute/v1/projects/powerkimhub/zones/us-central1-a/machineTypes/n1-standard-1",
    "zone": "us-central1-a"
  },

  ... 중략

  {
    "creationTimestamp": "1969-12-31T16:00:00.000-08:00",
    "description": "1 vCPU, 3.75 GB RAM",
    "guestCpus": 1,
    "id": "3001",
    "imageSpaceGb": 10,
    "isSharedCpu": false,
    "kind": "compute#machineType",
    "maximumPersistentDisks": 128,
    "maximumPersistentDisksSizeGb": "263168",
    "memoryMb": 3840,
    "name": "n1-standard-1",
    "selfLink": "https://www.googleapis.com/compute/v1/projects/powerkimhub/zones/me-west1-c/machineTypes/n1-standard-1",
    "zone": "me-west1-c"
  }
]

['SKU 기반 가격 정보 제공 방법' 활용 예시 및 가이드]

  • 편의상 일단 SKU 가격 정보 파일로 받기
  • 편의상 첫 페이지만 받기(next page는 생략)
curl https://cloudbilling.googleapis.com/v1/services/6F81-5844-456A/skus?key={your API KEY} > get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json
  • 제품/서비스의 모든 SKU에 대한 가격 정보를 제공
  • Compute Engine 정보의 경우 머신 타입에 대해서 원하는 정도의 세부 정보는 제공하지 않음(제안 해주신 내용과 같이 위 정보 활용 필요)
  • 대략 제공 내용
$ head -n 50 get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json
{
  "skus": [
    {
      "name": "services/6F81-5844-456A/skus/0006-C9C8-BB6F",
      "skuId": "0006-C9C8-BB6F",
      "description": "Commitment v1: Memory-optimized Cpu in Phoenix for 1 Year",
      "category": {
        "serviceDisplayName": "Compute Engine",
        "resourceFamily": "Compute",
        "resourceGroup": "CPU",
        "usageType": "Commit1Yr"
      },
      "serviceRegions": [
        "us-west8"
      ],
      "pricingInfo": [
        {
          "summary": "",
          "pricingExpression": {
            "usageUnit": "h",
            "displayQuantity": 1,
            "tieredRates": [
              {
                "startUsageAmount": 0,
                "unitPrice": {
                  "currencyCode": "USD",
                  "units": "0",
                  "nanos": 20550000
                }
              }
            ],
            "usageUnitDescription": "hour",
            "baseUnit": "s",
            "baseUnitDescription": "second",
            "baseUnitConversionFactor": 3600
          },
          "currencyConversionRate": 1,
          "effectiveTime": "2024-01-07T21:00:52.562729Z"
        }
      ],
      "serviceProviderName": "Google",
      "geoTaxonomy": {
        "type": "REGIONAL",
        "regions": [
          "us-west8"
        ]
      }
    },
    ...
  • 특정 SKU에 대해 원본 json 구조 정보로 확인 방법
cat get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json |jq '.skus' |jq 'map(select(.skuId=="0006-C9C8-BB6F"))'
[
  {
    "name": "services/6F81-5844-456A/skus/0006-C9C8-BB6F",
    "skuId": "0006-C9C8-BB6F",
    "description": "Commitment v1: Memory-optimized Cpu in Phoenix for 1 Year",
    "category": {
      "serviceDisplayName": "Compute Engine",
      "resourceFamily": "Compute",
      "resourceGroup": "CPU",
      "usageType": "Commit1Yr"
    },
    "serviceRegions": [
      "us-west8"
    ],
    "pricingInfo": [
      {
        "summary": "",
        "pricingExpression": {
          "usageUnit": "h",
          "displayQuantity": 1,
          "tieredRates": [
            {
              "startUsageAmount": 0,
              "unitPrice": {
                "currencyCode": "USD",
                "units": "0",
                "nanos": 20550000
              }
            }
          ],
          "usageUnitDescription": "hour",
          "baseUnit": "s",
          "baseUnitDescription": "second",
          "baseUnitConversionFactor": 3600
        },
        "currencyConversionRate": 1,
        "effectiveTime": "2024-01-07T21:00:52.562729Z"
      }
    ],
    "serviceProviderName": "Google",
    "geoTaxonomy": {
      "type": "REGIONAL",
      "regions": [
        "us-west8"
      ]
    }
  }
]
  • 제공하는 가격 정책 종류
cat get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json |grep usageType |sort |uniq
        "usageType": "Commit1Yr"
        "usageType": "Commit3Yr"
        "usageType": "OnDemand"
        "usageType": "Preemptible"
  • 제공하는 정보 중 제품/서비스 관련 정보
    • 다음에 표시된 정보들
    • **즉, 이 정보를 이용해서 VM 인스턴스 타입 정보와 맵핑 해야 함 ** <------------------------------------------
    • skuId를 이용해서 인스턴스 타입 정보를 얻으면 좋은데, 그런 API는 없는 듯함(구글링: 찾는 사람들은 종종 있음)
      • API가 존재해도, skuId과 머신 타입 정보가 전체 sku에 대해서 한번 내지 몇번의 API Call로 얻을 수 있어야 함(Call Limit 이슈 관련)
    {
      "name": "services/6F81-5844-456A/skus/0006-C9C8-BB6F",
      "skuId": "0006-C9C8-BB6F",
      "description": "Commitment v1: Memory-optimized Cpu in Phoenix for 1 Year",   <---------- description이므로, 가능하면 보조 정보로만 활용
      "category": {
        "serviceDisplayName": "Compute Engine",    <------ sku 정보 요청시 "6F81-5844-456A" 인자로 얻었기 때문에 현재 얻은 정보는 모두 동일한 값
        "resourceFamily": "Compute",         <-------- 아래 resourceFamily 종류 참고, productFamily 종류 filtering에 활용 가능
        "resourceGroup": "CPU",              <-------- 이 정보가 일부 머신 타입을 구분할 수 있는 정보로 활용 가능, 아래 resoruceGroup 정보 관련 내용 참고
        "usageType": "Commit1Yr"             <-------- (Commit1Yr, Commit3Yr, OnDemand, Preemptible)가격 정책 종류 정보로 활용 가능
      },
      "serviceRegions": [
        "us-west8"                           <-------- 제공하는 리전 정보로 활용 가능
      ],
      "pricingInfo": ...                     <-------- 가격 정책으로 활용 가능
  • 제공하는 resourceFamily 종류
cat get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json |grep resourceFamily |sort |uniq
        "resourceFamily": "Compute",
        "resourceFamily": "License",
        "resourceFamily": "Network",
        "resourceFamily": "Storage",
  • 제공하는 resourceGroup 종류
cat get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json |grep resource
Group |sort |uniq
        "resourceGroup": "AdvancedNetworking",
        "resourceGroup": "AlmaLinux",
        "resourceGroup": "AppScale",
        "resourceGroup": "BitnamiAlchemy",
        "resourceGroup": "BitnamiCanvas",
        "resourceGroup": "BitnamiCloud9",
        "resourceGroup": "BitnamiDevPack",
        "resourceGroup": "BitnamiGallery",
        "resourceGroup": "BitnamiGerrit",
        "resourceGroup": "BitnamiMeteor",
        "resourceGroup": "BitnamiNexus",
        "resourceGroup": "BitnamiNodeBB",
        "resourceGroup": "BitnamiPHP7",
        "resourceGroup": "BitnamiRadiant",
        "resourceGroup": "BitnamiReportServer",
        "resourceGroup": "BitnamiWebPack",
        "resourceGroup": "CDNCacheFill",
        "resourceGroup": "CPU",
        "resourceGroup": "Canonical",
        "resourceGroup": "CentOS",
        "resourceGroup": "CloudEndure",
        "resourceGroup": "ConfidentialSpace",
        "resourceGroup": "CoreOSBeta",
        "resourceGroup": "CoreOSStable",
        "resourceGroup": "Couchbase",
        "resourceGroup": "DaceITLLCd/b/aSenseTrafficPulse",
        "resourceGroup": "DataflowStreaming",
        "resourceGroup": "Debian",
        "resourceGroup": "Debian8",
        "resourceGroup": "Debian9",
        "resourceGroup": "Dokku",
        "resourceGroup": "F1Micro",
        "resourceGroup": "FedoraCoreOS",
        "resourceGroup": "Flink",
        "resourceGroup": "FreeBSD",
        "resourceGroup": "G1Small",
        "resourceGroup": "GPU",
        "resourceGroup": "Google",
        "resourceGroup": "GoogleEgress",
        "resourceGroup": "GoogleIngress",
        "resourceGroup": "GreenSQL",
        "resourceGroup": "InterconnectAttachment",
        "resourceGroup": "InterconnectPort",
        "resourceGroup": "InterregionEgress",
        "resourceGroup": "InterregionIngress",
        "resourceGroup": "IntrazoneEgress",
        "resourceGroup": "IpAddress",
        "resourceGroup": "LocalSSD",
        "resourceGroup": "MachineImage",
        "resourceGroup": "MasterConcept",
        "resourceGroup": "Microsoft",
        "resourceGroup": "N1Standard",
        "resourceGroup": "Nuggeta",
        "resourceGroup": "OpenSUSELeap42",
        "resourceGroup": "PDSnapshot",
        "resourceGroup": "PDStandard",
        "resourceGroup": "PacketMirroring",
        "resourceGroup": "PdSnapshotEgress",
        "resourceGroup": "PeeringOrInterconnectEgress",
        "resourceGroup": "PeeringOrInterconnectIngress",
        "resourceGroup": "PremiumInternetEgress",
        "resourceGroup": "PremiumInternetIngress",
        "resourceGroup": "Quobyte",
        "resourceGroup": "RAM",
        "resourceGroup": "RHEL6",
        "resourceGroup": "RedHat",
        "resourceGroup": "Rhel",
        "resourceGroup": "Ruby",
        "resourceGroup": "SLES12ForSAP",
        "resourceGroup": "SQLServer2014Web",
        "resourceGroup": "SQLServer2016Express",
        "resourceGroup": "SQLServer2016Standard",
        "resourceGroup": "SSD",
        "resourceGroup": "SUSE",
        "resourceGroup": "SUSE11",
        "resourceGroup": "SUSE12",
        "resourceGroup": "Sles",
        "resourceGroup": "SlesSap",
        "resourceGroup": "StandardInternetEgress",
        "resourceGroup": "StandardInternetIngress",
        "resourceGroup": "StorReduceLarge",
        "resourceGroup": "StorReduceXLarge",
        "resourceGroup": "Storage",
        "resourceGroup": "StorageImage",
        "resourceGroup": "TPU",
        "resourceGroup": "Ubuntu1204LTS",
        "resourceGroup": "Ubuntu1404LTS",
        "resourceGroup": "Ubuntu1604",
        "resourceGroup": "Ubuntu1610",
        "resourceGroup": "Ubuntu1710",
        "resourceGroup": "UbuntuCore",
        "resourceGroup": "UbuntuCore16",
        "resourceGroup": "UbuntuDev",
        "resourceGroup": "UbuntuSnappy1604",
        "resourceGroup": "VPNInternetEgress",
        "resourceGroup": "VPNInternetIngress",
        "resourceGroup": "VPNInterregionEgress",
        "resourceGroup": "VPNInterregionIngress",
        "resourceGroup": "VarnishSoftwareInc",
        "resourceGroup": "VmState",
        "resourceGroup": "Windows2008",
        "resourceGroup": "Windows2016",
        "resourceGroup": "WindowsActiveDirectory",
        "resourceGroup": "WindowsCore",
        "resourceGroup": "WindowsServer2008R2",
        "resourceGroup": "WindowsServer2012",
        "resourceGroup": "WindowsServer2012R2",
  • resourceGroup 정보와 N1 머신 유형 맵핑 가이드
  • N1 관련 정보 얻는 방법(resourceGroup="N1Standard") 및 그중 첫번째 정보 확인
cat get_https.cloudbilling.googleapis.com-v1-services-6F81-5844-456A-skus.json |jq '.skus' |jq 'map(select(.category.resourceGroup=="N1Standard"))' |more
[
  {
    "name": "services/6F81-5844-456A/skus/000F-E31B-1D6F",
    "skuId": "000F-E31B-1D6F",
    "description": "N1 Predefined Instance Ram running in Zurich",  <---------------- 'Ram': 메모리 가격 정보 임을 참고
    "category": {
      "serviceDisplayName": "Compute Engine",
      "resourceFamily": "Compute",
      "resourceGroup": "N1Standard",           <---------------- N1 계열
      "usageType": "OnDemand"                  <---------------- 가격 정책
    },
    "serviceRegions": [
      "europe-west6"                           <--------------- 리전
    ],
    "pricingInfo": [
      {
        "summary": "",
        "pricingExpression": {
          "usageUnit": "GiBy.h",               <--------------- 메모리 가격 정보임을 활용 가능
          "displayQuantity": 1,
          "tieredRates": [
            {
              "startUsageAmount": 0,
              "unitPrice": {
                "currencyCode": "USD",
                "units": "0",
                "nanos": 5928000      <--------------- 가격 정보 활용 가능, dollar  변환 규칙은 여기서(https://cloud.google.com/skus/?hl=ko) 확인 가능 
              }                                        skuid(ex:000F-E31B-1D6F)를 입력하면 환산하여 보여줌
            }
          ],
          "usageUnitDescription": "gibibyte hour",
          "baseUnit": "By.s",
          "baseUnitDescription": "byte second",
          "baseUnitConversionFactor": 3865470566400
        },
        "currencyConversionRate": 1,
        "effectiveTime": "2024-01-07T21:00:52.562729Z"
      }
    ],
    "serviceProviderName": "Google",
    "geoTaxonomy": {
      "type": "REGIONAL",
      "regions": [
        "europe-west6"
      ]
    }
  },
  ...
  • 관련된 웹 페이지에서 정보 확인
    • N1 머신 유형, 취리히, OnDemand, 메모리, 시간당 GB 사용 단가
    • image
  • (resourceGroup="N1Standard") 정보 중 vCPU 관련 정보 예시를 하나 더 보자면,
    • services.sku.lisk 제공 정보 예시
 {
    "name": "services/6F81-5844-456A/skus/718A-81BA-2CBB",
    "skuId": "718A-81BA-2CBB",
    "description": "N1 Predefined Instance Core running in Zurich",    <---------------- 'Core': CPU 정보 임을 참고
    "category": {
      "serviceDisplayName": "Compute Engine",
      "resourceFamily": "Compute",
      "resourceGroup": "N1Standard",                      <---------------- N1 계열
      "usageType": "OnDemand"                             <---------------- 가격 정책
    },
    "serviceRegions": [
      "europe-west6"                                      <---------------- 리전
    ],
    "pricingInfo": [
      {
        "summary": "",
        "pricingExpression": {
          "usageUnit": "h",                               <---------------- vCPU 가격 정보 추정(N1 계열인 경우, 메모리: "GiBy.h") 
          "displayQuantity": 1,
          "tieredRates": [
            {
              "startUsageAmount": 0,
              "unitPrice": {
                "currencyCode": "USD",
                "units": "0",
                "nanos": 44231000                         <---------------- 가격 정보: 0.044231 USD per 1 hour
              }
            }
          ],
          "usageUnitDescription": "hour",
          "baseUnit": "s",
          "baseUnitDescription": "second",
          "baseUnitConversionFactor": 3600
        },
        "currencyConversionRate": 1,
        "effectiveTime": "2024-01-08T08:57:38.057755Z"
      }
    ],
    "serviceProviderName": "Google",
    "geoTaxonomy": {
      "type": "REGIONAL",
      "regions": [
        "europe-west6"
      ]
    }
  },
  • Web 페이지 제공 정보 예시
    • image

[세부 머신 타입 가격 정보 생성 가이드]

  • 편의상 가이드 설명은 services.sku.list API를 사용하지 않고, Web 페이지 정보를 사용하여 설명
  • services.sku.list API가 제공하는 정보는 세부 머신 타입 정보(즉, VCPU 1개, Memory 16GB 등의 정보)가 없고,
  • 다음과 같이 머신 유형별 CPU 기준 가격과 Memory 기분 가격을 제공
    • image
  • 세부 머신 타입 가격 정보는 다음과 같이 계산으로 얻을 수 있음
    • API로 얻은 가격과 계산으로 얻은 가격이 소숫점 5자리 정도가 다른 경우를 드물게 목격했지만, 거의 동일하였음
    • 예시: n1-highmem-96 선점형 가격 정보
      • image
    • 확인: 관련 웹페이지 가격 정보
      • image
  • 위에서 확인한 인스턴스 타입 세부 정보 및 SKU 가격 정보 및 생성한 세부 머신 타입별 가격 정보를 활용하여,
  • CB-Spider 가격 정보 추상화 정보 Json을 생성

6. 제안 방법으로 개발 전 확인 사항

  • 제안 방법은 일부 케이스에 대한 샘플링을 통한 가능성을 타진한 방법입니다.
  • 실제 전체를 추진하는 데 문제가 없는 지 머신 유형별 추가 점검이 필요합니다.
  • N1 머신 유형은 resourceGroup에 "N1Standard"로 표시되어 이 정보를 활용했지만,
  • N1 머신 외에는 "description" 정보에 머신 유형 정보가 포함되어 있습니다.
    • 이 description 정보를 기반으로 가격 정보를 추출하는 것이 안정적인지 재점검 등이 필요합니다.
    • 예를 들어 C3D 머신 유형의 경우, 다음과 같이 description 정보와 resourceGrop(RAM|CPU) 등으로 해석하는 방법이 필요합니다.
    • 다른 머신 유형 들도 대략 점검 후 개발을 시작하는 것이 좋을 듯 합니다.
    {
      "name": "services/6F81-5844-456A/skus/002F-AF8C-E90F",
      "skuId": "002F-AF8C-E90F",
      "description": "Spot Preemptible C3D Instance Ram running in Columbus",     <------------ 'C3D'
      "category": {
        "serviceDisplayName": "Compute Engine",
        "resourceFamily": "Compute",
        "resourceGroup": "RAM",                                                   <------------ 메모리 가격
        "usageType": "Preemptible"
      },      ...

7. Plan B

  • 기능 개발 마감을 1/17(월) 기준으로 검토해주시면 되겠습니다.

  • 공수, 기간 및 난이도 등을 고려했을 때, 위 제안 방법이 비관적일 경우 다음 방법으로 추진 부탁 드립니다.

  • GCP가 제공하는 SKU 정보 체계로 제공

    • 즉, serivces.skl.list API 제공 정보만 활용
    • 즉, 인스턴스 세부 정보를 제공하지 않고, SKU 중심의 가격 정보 제공으로 변환
  • 변환 예시

                    "productInfo": {
                        "productId": "2223RRAP6Z3VBN3N",  <======  SKU Id
                        "regionName": "us-east-1",        <====== Region 정보   
                        "zoneName": "NA",                 <====== NA
                        "instanceType": "c5d.2xlarge",    <====== description 정보
                        "vcpu": "8",                      <====== NA
                        "memory": "16 GiB",               <====== NA, 이하 제공하지 않는 정보는 NA로 설정
                        "storage": "1 x 200 NVMe SSD",
                        "gpu": "2", 
                        "gpuMemory": "NA",
                        "operatingSystem": "RHEL",
                        "preInstalledSw": "SQL Web",
                        "description": "Any helpful information",     <====== description 정보
                        + "cspProductInfo": { ... }                   <===== GCP 제공 정보 추가
                        이하 priceInfo 정보는 가능한 변환해서 채움

참고: services.skus.list API와 Web 페이지 정보가 틀린 경우가 존재

  • 차이가 나는 정보 예시는 아래를 참고
  • 차이가 나는 경우엔 API 가격 정보를 우선 준수한다.
    • 웹 페이지나 Cached json file의 경우 실시간 반영이 아니고, 반영 시점에 따라 차이가 나는 것으로 추정

[SKU 가격 정보 차이]

  • us-east4 preemptibla, cpu 가격 정보가 모두 다름

    • API 얻은 가격: 0.00668 USD per 1 hour
    • 웹페이지 가격: $0.00712085 / vCPU hour
    • cached json file: $0.00701
    • 참고: Zurich(europe-west6)의 경우는 모두 동일함
  • services.sku.list로 얻은 (resourceGroup="N1Standard") 정보 중 vCPU 관련 가격 정보가 다음과 같음

  {
    "name": "services/6F81-5844-456A/skus/023F-CB27-DC68",
    "skuId": "023F-CB27-DC68",
    "description": "Spot Preemptible N1 Predefined Instance Core running in Virginia",     <---------------- 'Core': CPU 정보 임을 참고
    "category": {
      "serviceDisplayName": "Compute Engine",
      "resourceFamily": "Compute",
      "resourceGroup": "N1Standard",                <---------------- N1 계열
      "usageType": "Preemptible"                    <---------------- 가격 정책
    },
    "serviceRegions": [
      "us-east4"                                    <---------------- 리전
    ],
    "pricingInfo": [
      {
        "summary": "",
        "pricingExpression": {
          "usageUnit": "h",                         <---------------- vCPU 가격 정보
          "displayQuantity": 1,
          "tieredRates": [
            {
              "startUsageAmount": 0,
              "unitPrice": {
                "currencyCode": "USD",
                "units": "0",
                "nanos": 6680000                   <---------------- 가격 정보: 0.00668 USD per 1 hour
              }
            }
          ],
          "usageUnitDescription": "hour",
          "baseUnit": "s",
          "baseUnitDescription": "second",
          "baseUnitConversionFactor": 3600
        },
        "currencyConversionRate": 1,
        "effectiveTime": "2024-01-07T21:00:52.562729Z"
      }
    ],
    "serviceProviderName": "Google",
    "geoTaxonomy": {
      "type": "REGIONAL",
      "regions": [
        "us-east4"
      ]
    }
  },
  • 웹 페이지에서 확인하면: $0.00712085 / vCPU hour

    • image
  • cached json file에서 확인하면: 0.00701

[SKU 제공 리전 차이]

  • service list API로 얻은 정보 중: N1 계열이 "europe-west10(Berlin)"에서 제공하는 걸로 나옴
  {
    "name": "services/6F81-5844-456A/skus/007F-30EB-9169",
    "skuId": "007F-30EB-9169",
    "description": "Spot Preemptible N1 Predefined Instance Core running in Berlin",   <--------------
    "category": {
      "serviceDisplayName": "Compute Engine",
      "resourceFamily": "Compute",
      "resourceGroup": "N1Standard",             <-----------------------
      "usageType": "Preemptible"
    },
    "serviceRegions": [
      "europe-west10"                            <-----------------------
    ],
    "pricingInfo": [
      
   ... 중략
  • Console 상에서 확인해보면, N1 계열은 제공하지 않는 리전으로 나옴
    • API 정보가 맞는 것인지, Console 정보가 맞는 것인지, 아니면 opt-in 설정 등의 계정 의존 문제인지 확인이 필요함
    • image
  • 또한, Web 정보의 경우에는 전체 적으로 "europe-west10" 리전 정보는 제공하고 있지 않음 => 이유는 모르겠지만, 모든 가격 정보를 제공하고 있지 않는 것으로 생각됨. => 드라이버 개발시 절대적인 레퍼런스 정보로 활용할 수 없고, 참고 정보로 활용