You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过编程方式获取Amazon Fargate定价的问题求助

通过编程方式获取Amazon Fargate定价的问题求助

我完全懂你现在的头疼——想用AWS Pricing API(Java SDK)获取Fargate的定价数据,但试了两次都没拿到想要的结果:要么是价格为0的EC2关联计量项,要么是ECS托管实例的管理费用,完全和Fargate不沾边。我之前做成本分析工具时也踩过一模一样的坑,给你梳理下问题根源和解决办法:

问题出在筛选条件的精准度上

你之前的筛选没定位到Fargate的专属定价条目,原因如下:

  • 第一次用productFamily: "Compute Metering"拿到的是ECS在EC2集群上的资源计量项,这类计量本身是免费的(因为EC2的计算费用已经单独收取),所以价格为0,和Fargate无关。
  • 第二次用productFamily: "Compute"拿到的是ECS托管EC2实例的管理费用,Fargate是Serverless容器服务,不需要托管EC2实例,所以这些数据也不是你要的。

Fargate的定价条目其实藏在serviceCode: "AmazonECS"下,但需要两个关键筛选条件:

  1. productFamily: "Container"
  2. usagetype包含Fargate关键字(区分开EC2类型的容器计量)

修正后的Java代码示例

首先要确保你的Pricing客户端初始化时指定us-east-1区域——因为AWS Pricing API仅在该区域提供服务,这是很多人容易忽略的点:

// 初始化Pricing客户端,必须指定us-east-1
PricingClient pricing = PricingClient.builder()
    .region(Region.US_EAST_1)
    .credentialsProvider(DefaultCredentialsProvider.create())
    .build();

然后调整筛选条件,精准定位Fargate定价:

Filter regionFilter = Filter.builder()
    .type(FilterType.TERM_MATCH)
    .field("regionCode")
    .value("ap-northeast-1") // 替换为你需要的区域
    .build();

Filter productFamilyFilter = Filter.builder()
    .type(FilterType.TERM_MATCH)
    .field("productFamily")
    .value("Container")
    .build();

// 用正则匹配包含Fargate的使用类型
Filter usageTypeFilter = Filter.builder()
    .type(FilterType.REGEX)
    .field("usagetype")
    .value(".*Fargate.*")
    .build();

GetProductsRequest req = GetProductsRequest.builder()
    .serviceCode("AmazonECS")
    .filters(List.of(regionFilter, productFamilyFilter, usageTypeFilter))
    .build();

GetProductsResponse resp = pricing.getProducts(req);

解析返回的有效数据

调整后你会拿到两类核心Fargate定价条目:

  • usagetype: "APN1-Fargate-vCPU-Hours":对应Fargate的vCPU小时费用
  • usagetype: "APN1-Fargate-GB-Hours":对应Fargate的内存GB小时费用

返回的JSON结构里,有效价格在terms.OnDemand[xxx].priceDimensions[xxx].pricePerUnit.USD,比如东京区的典型返回会是这样(非0价格):

{
  "product": {
    "productFamily": "Container",
    "attributes": {
      "regionCode": "ap-northeast-1",
      "usagetype": "APN1-Fargate-vCPU-Hours",
      // 其他属性...
    }
  },
  "terms": {
    "OnDemand": {
      "xxx": {
        "priceDimensions": {
          "xxx": {
            "pricePerUnit": {
              "USD": "0.0408000000"
            },
            "unit": "Hrs"
            // 其他维度...
          }
        }
      }
    }
  }
}

额外注意事项

  • 确保你的IAM角色/用户有pricing:GetProducts权限,否则会返回权限错误。
  • Pricing API返回的是JSON字符串的列表,你需要自己遍历并解析每个条目(可以用Jackson或Gson等库处理)。
  • 如果你需要涵盖Spot定价,可以在解析时同时处理terms.Spot下的条目,但Fargate Spot的筛选逻辑和OnDemand一致,只是terms类型不同。

我当初就是因为没注意到productFamily的正确值,折腾了好半天,你按这个调整应该就能拿到想要的Fargate定价数据了。如果解析返回结果时遇到问题,或者还有其他细节没搞懂,随时补充提问就行!

火山引擎 最新活动