Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AWS:PriceInfo] InvalidParameterException #1055

Closed
powerkimhub opened this issue Feb 8, 2024 · 10 comments · Fixed by #1082
Closed

[AWS:PriceInfo] InvalidParameterException #1055

powerkimhub opened this issue Feb 8, 2024 · 10 comments · Fixed by #1082
Assignees
Labels
bug Something isn't working CloudDriver

Comments

@powerkimhub
Copy link
Member

  • AdminWeb 또는 다음과 같은 호출시 오류가 발생하고 있습니다.
    curl -sX GET http://localhost:1024/spider/priceinfo/Compute%20Instance/us-east-2?ConnectionName=aws-config01 | json_pp
    
    {
       "message" : "InvalidParameterException: ServiceCode can only contain a-z, A-Z, 0-9"
    }
@powerkimhub powerkimhub added bug Something isn't working CloudDriver labels Feb 8, 2024
@SungWoongz
Copy link
Contributor

  • 확인 결과 공백이 존재하면 안되는 것으로 확인되었습니다.

    • 기존 Compute%20Instance -> ComputeInstance로 변경 후 실행 결과 출력 됩니다.
  • 또한, productFamily를 AmazonEC2만 사용할 수 있어서 고정 시켜놨기 때문에 AmazonEC2를 사용하시면 될 것 같습니다.

  • ex)

    curl -sX GET [http://localhost:1024/spider/priceinfo/AmazonEC2/us-east-2\\?ConnectionName\\=aws-config-01](http://localhost:1024/spider/priceinfo/AmazonEC2/us-east-2%5C%5C?ConnectionName%5C%5C=aws-config-01) | json_pp

@powerkimhub
Copy link
Member Author

@SungWoongz

  • 약간의 조정이 필요한 거 같습니다.
  • 다음 내용을 참고해주시기 바랍니다.

[서비스 코드 및 AmazonEC2 & ProductFamily]

  • 다음 2가지 서비스 코드(AmazonS3, AmazonEC2) 예시를 참고해주시기 바랍니다.
  • 현재 저희는 AmazonEC2(컴퓨트 서비스) 서비스 코드만 핸들링하면 되는 상황입니다.
  • AmazonEC2 서비스 코드는 Driver 내부에서 Filter로 활용하시고,
  • 저희의 사용자에게 보여줄 필요는 없습니다.
    aws pricing get-products --service-code AmazonS3 --filters "Type=TERM_MATCH,Field=location,Value='US East (N. Virginia)'" | jq '.PriceList[] | fromjson' |grep productFamily |sort |uniq
    
        "productFamily": "API Request",
        "productFamily": "Fee",
        "productFamily": "Storage",
    
    aws pricing get-products --service-code AmazonEC2 --filters "Type=TERM_MATCH,Field=lo
    cation,Value='US East (N. Virginia)'" | jq '.PriceList[] | fromjson' |grep productFamily |sort |uniq
    
        "productFamily": "CPU Credits",
        "productFamily": "Compute Instance (bare metal)",
        "productFamily": "Compute Instance",
        "productFamily": "Dedicated Host",
        "productFamily": "EBS direct API Requests",
        "productFamily": "Elastic Graphics",
        "productFamily": "Fast Snapshot Restore",
        "productFamily": "Fee",
        "productFamily": "Load Balancer",
        "productFamily": "Load Balancer-Application",
        "productFamily": "Load Balancer-Network",
        "productFamily": "NAT Gateway",
        "productFamily": "Provisioned Throughput",
        "productFamily": "Storage Snapshot",
        "productFamily": "Storage",
        "productFamily": "System Operation",
    

[productName 관련]

  • PriceInfo 관련 Spider Driver API 현황

      (1) ListProductFamily(regionName string) ([]string, error)
      (2) GetPriceInfo(productFamily string, regionName string, filterList []KeyValue) (string, error)
    
  • (1)의 결과는 CSP 제공하는 전체 ProductFamily 또는 현재 Driver가 제공하는 ProductFamily 목록을 제공

  • (1)의 결과는 CSP가 제공하는 목록 이름을 그대로 제공

  • 사용자는 (1)의 결과로 얻은 ProductFamily 중 1개의 문자열을 (2)의 productFamily 인자로 사용하여 요청

  • 세부 내용: CB-Spider 가격 정보 제공 대상 서비스 분류


[제안]

  • 제 생각으로는 AmazonEC2는 Driver 내부에서 AWS에 요청시 Filter로 사용하시고,
  • 사용자에게 제공하거나, 입력 받는 ProductFamilyAmzaonEC2에서 제공하는 다음 수준의 카테고리를 활용하여 제공
  • 가급적 space도 유지
    "CPU Credits"
    "Compute Instance (bare metal)"
    "Compute Instance"
    "Data Transfer"
    ... 중략 ...
    

@SungWoongz
Copy link
Contributor

@powerkimhub

  • 현재 ProductFamily가 어떤 단위인지 확인이 필요합니다.

  • 다른 CSP(GCP, ALIBABA, Tencent)들은 ProductFamily가 VM Instance입니다.

    • GCP - “Compute”
    • ALIBABA - “ecs”
    • Tencent - “cvm”
  • AWS의 구조

    • ServiceCode = “AmazonEC2”, “AmazonS3”, , , ,
    • 등이 있으며 각각의 ServiceCode밑에
    • ProductFamily = “Compute Instance”, “Cpu Credit”, , , ,
    • 위와 같이 구성되어 있습니다.
  • 따라서 AWS에서도 VM Instance가 다른 CSP들의 ProductFamily와 동일한 단위일 것이라고 보고

  • AWS의 ServiceCode를 CB-Spider의 ProductFamily 로 작업 했습니다.

  • 만약 AWS상의 productFamily(“CPU credit”, “Compute Instance”,,,) 등을 CB-Spider의 ProductFamily라고 한다면, ServiceCode는 AWS API 호출 시 필수 키로 AmazonEC2, AmazonS3 ,,, 등으로 AWS ServiceCode와 AWS의 ProductFamily의 매핑 관계를 다시 정의해야 합니다.

  • GetPriceInfo의 인자로 ProductFamily가 들어간다면

  • ProductFamily는 AWS의 ServiceCode(AmazonEC2)가 맞는 것 같다고 생각합니다.

  • 확인 부탁드립니다.

@powerkimhub
Copy link
Member Author

@SungWoongz

  • 사용자가 AmazonEC2를 ProductFamily 인자로 GetPriceInfo()를 요청한다고 하면,

  • 사용자는 아래 ProductFamily에 해당되는 모든 제품/가격 정보를 얻을 거라고 생각할 것 같습니다.

  • 현재, Driver가 제공하는 제품/가격 정보는 이중에 VM Instance 정보에 해당되는 Compute Instance 값만 제공하고 있지 않나요?

    • 그렇다면, 사용자는 Compute Instance를 인자로 넘기고 그에 해당하는 제품/가격 정보를 반환 받는 것이 매끄러울 것 같은데요.
  • 참고: AmazonEC2 서비스 코드로 제공되는 제품/가격 정보에 포함되는 productFamily 목록

      "productFamily": "CPU Credits",
      "productFamily": "Compute Instance (bare metal)",
      "productFamily": "Compute Instance",
      "productFamily": "Dedicated Host",
      "productFamily": "EBS direct API Requests",
      "productFamily": "Elastic Graphics",
      "productFamily": "Fast Snapshot Restore",
      "productFamily": "Fee",
      "productFamily": "Load Balancer",
      "productFamily": "Load Balancer-Application",
      "productFamily": "Load Balancer-Network",
      "productFamily": "NAT Gateway",
      "productFamily": "Provisioned Throughput",
      "productFamily": "Storage Snapshot",
      "productFamily": "Storage",
      "productFamily": "System Operation",
    
  • 현재는 구현이 되어 있지 않지만, GerPriceInfo("Load Balancer")를 향후 구현한다고 하면,

    • 위에서 "productFamily": "Load Balancer"에 포함되는 제품/가격 정보들을 제공하는 식으로 되었습니다.
  • 다시 확인 및 검토 부탁드립니다.

@powerkimhub
Copy link
Member Author

powerkimhub commented Feb 14, 2024

  • AWS의 ServiceCode를 CB-Spider의 ProductFamily 로 작업 했습니다.
  • 만약 AWS상의 productFamily(“CPU credit”, “Compute Instance”,,,) 등을 CB-Spider의 ProductFamily라고 한다면, ServiceCode는 AWS API 호출 시 필수 키로 AmazonEC2, AmazonS3 ,,, 등으로 AWS ServiceCode와 AWS의 ProductFamily의 매핑 관계를 다시 정의해야 합니다.
  • GetPriceInfo의 인자로 ProductFamily가 들어간다면
  • ProductFamily는 AWS의 ServiceCode(AmazonEC2)가 맞는 것 같다고 생각합니다.

@SungWoongz

  • 매핑관계 관련해서는, 별도로 수정할 필요가 없을 것 같습니다.
  • 현재 제공 해주시는 제품/가격 정보 목록은 Compute Instance(for VM Instance)를 filtering 해서 제공해주시는 것으로 보이며, 이는 그대로 유지 해 주시면 될것 같습니다.
    • 다만, 사용자에게 제공되고 사용자로부터 입력되는 PruductFamily 목록을 CPU Credits ~ System Operation 수준에서 제공

  • 혹시, 제가 놓치는 부분이 있을 것 같아서,
  • 좀더 부연 설명드립니다.
  • 현재 Spider 규격의 범위는 AmazonEC2(Compute Infra)에 포함 되는 제품/가격들만이 대상이며,
    • AmazonS3 등과 같은 다른 서비스 제공은 추후 별도 추가 고려 예정(아마도, 힘들 듯합니다만 개념적으로 보자면)
  • AmazonEC2로 제공되는 ProductFamily는 위에서 설명드린 바와 같이 CPU Credits ~ System Operation 등이 모두 포함되어 제공
  • 그중 일부가 Spider 규격의 대상이 될 수 있습니다.
    • 현재는 대략, Compute Instance, Load Balancer, Storage
    • Compute Instance (bare metal) 등을 Spider의 Compute Instance 항목에 포함시켜서 제공할지는 확인/고려 필요
  • 그중 현재 버전이 제공할 ProductFamily는 VM Instance에 해당하는 Compute Instance로 한정
    • CPU Credits, Compute Instance (bare metal), Dedicated Host 등이 Compute Instance와 유사하게 VM Type 형태로 제품/가격이 제공되는지 확인 후 Compute Instance에 포함시켜 제공할지 여부 결정

@SungWoongz
Copy link
Contributor

@powerkimhub

  • 현재 ProductFamily를 바라보는 관점이 다른 것으로 보입니다.

  • AWS에는 AmazonEC2, AmazonS3, AmazonRDS, AmazonCloudWatch등 과 같이 다양한 상품들이 있고

  • 이 상품들 중 AmazonEC2�를 CB-spider의 ProductFamily로 보았습니다. (Compute Infra)

  • 말씀주신 CPU Credits ~ System Operation 등은 AWS 상에서의 ProductFamily이고

  • 확인 결과 각 상품들(AmazonEC2, AmazonS3 ,,,)을 내에서 나누는 상품들 입니다.

  • 말씀주신 Compute Instance는 filtering한 것이 아닌 AmazonEC2내의 ProductFamily(aws상 표기된)이며 Compute Instance, Compute Instance(bare metal)이 있습니다.

  • 확인 결과와 json파일은 개인 메세지로 보내드리겠습니다.

  • 예시) AmazonEC2 [Compute Instance, Compute Instance(bare metal)] / AmazonS3 [storage, fee, API Request] /

  • AmazonRDS [Database Instance] / AmazonCloudWatch [Alarm, Data Payload, Api Request, Application Signals, Metric, Canaries 등..]

@powerkimhub
Copy link
Member Author

@SungWoongz

  • AWS Driver에서 호출되고 있는 AWS API 코드 내에 포함된

    • image
  • 다음 API docs link를 따라가 보면,

  • 다음 link로 forwarding 됩니다.

  • API에 포함된 인자 중, NextToken을 확인해 볼 필요가 있을 것 같습니다.

  • 반환 되는 데이터가 매우 많기 때문에, 호출할 때마다 조금씩 반환해주는 걸로 생각됩니다.

    • 반환되는 NextToken이 무효화 될때까지 순환하셔야 될 것 같습니다.
    • 아니면, NextToken 없이 한번에 다 받는 옵션이 있다면 설정.
  • 현재 제공되는 PriceInfo는 앞 부분의 일부 정보만 제공되고 있는 상황으로 보입니다.

  • 앞 부분에 제공되는 제품/가격 정보가 공교롭게 모두 Compute Instance이었을 걸로 예상됩니다.


  • 추가로, 위 링크의 문서 마지막에 보이는 Sample Response를 보시면,
    • request filter에 AmazonEC2만 걸었는데, Storage Family를 제공하고 있는 것을 볼수 있습니다.
      image

@SungWoongz
Copy link
Contributor

SungWoongz commented Feb 19, 2024

@powerkimhub

  • productFamily, NextToken 이슈 확인 후 반영했습니다.
  • 테스트 시 코드 상에서는 결과 값 출력이 잘 되지만 adminWeb은 첨부 이미지와 같이 뻗는 것 같은데 PR 진행해도 괜찮을 지 여쭙습니다.
    (productFamily : Compute Instance로 설정 / region : us-west-1 설정 테스트 결과 출력 개수 39200개)
    image

@powerkimhub
Copy link
Member Author

@SungWoongz

  • 역시 종류가 어마 어마 하네요~
  • 일단, 올려주시기 바랍니다.
  • AdminWeb 단의 문제이므로 조치를 취해보도록 하겠습니다.

@powerkimhub
Copy link
Member Author

@SungWoongz

  • 일단, 다음처럼 조치/마무리 하였습니다.
  • 활용에 참고해주시기 바랍니다.

[AdminWeb: 대규모 PriceInfo에 대한 제공 방법]

  • Fetch 결과로 얻은 전체 제품/가격 개수 제공
  • Browser로는 200 product 정보만 제공
    • 200개 이하일 경우 전과 동일
    • JSON Veiw 또는 Table View는 200개 까지의 제품/가격 정보만 제공
    • 전체 제품/가격 정보를 원할 경우 Json 파일 다운로드 활용으로 가이드
    • 결과가 200개 이상일 경우에는 관련 가이드 메시지 제공
    • 200개 기준은 변경될 수 있음
  • 참고: 200개 이상의 AWS 제공 예시
    • image

  • 참고: 필요시, Caching된 PriceInfo json 파일 참고 가능(유지:1Day)
    • 캐시 위치: cb-spider/cache/priceinfo

      • image
    • 캐싱 파일 저장할 때 마다, 하루 이상 지난 모든 캐시 파일 삭제

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working CloudDriver
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants