AWS Price List APIがリージョン別価格を提供するようになりました

AWS

2017/04/20 のサービスアップデートにより、サービスごとのプライスリストを提供する AWS Price List API がリージョン別のプライスリスト提供に対応しました

全リージョンでサービス展開しているわけではなく、東京リージョンなど、特定のリージョンで重点的にサービス展開しており、そのリージョンでのプライスリストが欲しいケースにおいて、プライスリストファイルのデータサイズが大幅に減ります。

例えば 10 リージョンに対応したサービスの場合、リージョン別ファイルを利用すると、取得するファイルサイズはほぼ 1/10 になります。

サービスアップデート前後での通知文の違い

プライスリストの変更は SNS を購読すると受け取れます

サービス変更前の本文

サービス別にプライスリストを受け取るSNS(arn:aws:sns:us-east-1:278350005181:price-list-api)を購読していた場合、従来は次のようなメッセージが配信されていました。サービスアップデート前は、次のようなメッセージが配信されていました。

Hello,

You have received this notification because you subscribed to receiving updates from SNS topic arn:aws:sns:us-east-1:278350005181:daily-aggregated-price-list-api

We've published a new version of the offer file for Service AmazonChime. Use the following URLs to download the file:
   - JSON Format : https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonChime/current/index.json
   - CSV Format : https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonChime/current/index.csv

To learn more about the file formats, see  http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/price-changes.html.

Thank You,
Amazon Web Services Team

サービス変更後の本文

サービスアップデート後は、次のようなメッセージが配信されるようになりました。

Hello,

You have received this notification because you subscribed to receiving updates from SNS topic arn:aws:sns:us-east-1:278350005181:daily-aggregated-price-list-api

We've published a new version of the offer file for Service AmazonApiGateway. Use the following URLs to download the file:
   - JSON Format : https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonApiGateway/current/index.json
   - CSV Format : https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonApiGateway/current/index.csv
   - Region Index Url : https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonApiGateway/current/region_index.json

To learn more about the file formats, see  http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/price-changes.html.

Thank You,
Amazon Web Services Team
  • JSON Format
  • CSV Format

に追加して

  • Region Index Url

も含まれるようになっています。

このインデックスファイルをもとに、実際にリージョン別プライスリストデータを取得してみます。

URL の違い

List Price API で提供されている URL の違いをまとめたのが以下です

全リージョン分プライスリストデータ

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/{AWS Service Name}/current/index.json

例) https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/index.json

リージョン別のインデックスデータ

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/{AWS Service Name}/current/region_index.json

例) https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/region_index.json

リージョン別プライスリストデータ

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/{AWS Service Name}/{Specific Date}/{Region}/region_index.json

例) https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-1/index.json

リージョン別プライスリストを取得する

それでは、今回追加された Region Index Url を利用して、特定のリージョンのプライスリストを取得しましょう。

リージョン別インデックスファイルの取得

プライスリスト変更通知文の Region Index Url のURLを GET すると、リージョン別プライスリストのインデックスファイルを取得できます。

$ curl -o s3_region_index.json https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/region_index.json

実際に取得したファイルは以下です。

{
  "formatVersion" : "v1.0",
  "disclaimer" : "This pricing list is for informational purposes only. All prices are subject to the additional terms included in the pricing pages on http://aws.amazon.com. All Free Tier prices are also subject to the terms included at https://aws.amazon.com/free/",
  "publicationDate" : "2017-04-24T23:01:14Z",
  "regions" : {
    "ap-south-1" : {
      "regionCode" : "ap-south-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/ap-south-1/index.json"
    },
    "eu-west-2" : {
      "regionCode" : "eu-west-2",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/eu-west-2/index.json"
    },
    "eu-west-1" : {
      "regionCode" : "eu-west-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/eu-west-1/index.json"
    },
    "ap-northeast-2" : {
      "regionCode" : "ap-northeast-2",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-2/index.json"
    },
    "ap-northeast-1" : {
      "regionCode" : "ap-northeast-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-1/index.json"
    },
    "sa-east-1" : {
      "regionCode" : "sa-east-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/sa-east-1/index.json"
    },
    "ca-central-1" : {
      "regionCode" : "ca-central-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/ca-central-1/index.json"
    },
    "us-gov-west-1" : {
      "regionCode" : "us-gov-west-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/us-gov-west-1/index.json"
    },
    "ap-southeast-1" : {
      "regionCode" : "ap-southeast-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/ap-southeast-1/index.json"
    },
    "ap-southeast-2" : {
      "regionCode" : "ap-southeast-2",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/ap-southeast-2/index.json"
    },
    "eu-central-1" : {
      "regionCode" : "eu-central-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/eu-central-1/index.json"
    },
    "us-east-1" : {
      "regionCode" : "us-east-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/us-east-1/index.json"
    },
    "us-east-2" : {
      "regionCode" : "us-east-2",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/us-east-2/index.json"
    },
    "us-west-1" : {
      "regionCode" : "us-west-1",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/us-west-1/index.json"
    },
    "us-west-2" : {
      "regionCode" : "us-west-2",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/20170424230114/us-west-2/index.json"
    }
  }
}

リージョン別に currentVersionUrl が定義されたインデックスデータが並んでいます。

リージョン別プライスリストファイルの取得

先程と同じホスト名(pricing.us-east-1.amazonaws.com)を利用し、パス部分に、プライスリストデータが欲しいリージョンの currentVersionUrl を指定して GET すると、リージョン別プライスリストデータを取得できます。

$ curl -o s3_tokyo.json https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-1/index.json

実際に取得したファイルは以下です。

{
  "formatVersion" : "v1.0",
  "disclaimer" : "This pricing list is for informational purposes only. All prices are subject to the additional terms included in the pricing pages on http://aws.amazon.com. All Free Tier prices are also subject to the terms included at https://aws.amazon.com/free/",
  "offerCode" : "AmazonS3",
  "version" : "20170424230114",
  "publicationDate" : "2017-04-24T23:01:14Z",
  "products" : {
    "YTBTUFDC7FRAJJAP" : {
      "sku" : "YTBTUFDC7FRAJJAP",
      "productFamily" : "Data Transfer",
      "attributes" : {
        "servicecode" : "AWSDataTransfer",
        "transferType" : "Accelerated InterRegion Outbound using edge locations within US, Europe or Japan",
        "fromLocation" : "EU (Ireland)",
        "fromLocationType" : "AWS Region",
        "toLocation" : "South America (Sao Paulo)",
        "toLocationType" : "AWS Region",
        "usagetype" : "EU-SAE1-AWS-Out-ABytes-T1",
        "operation" : ""
      }
    },
    ...

リージョン別プライスリストデータをもう少し細かく確認

先程取得した S3 のリージョン別プライスリストを例に、実際のデータをもう少し詳細に追って、リージョン別データであることを確認します。

productFamily は以下の4種類が存在します。

  • API Request
  • Data Transfer
  • Fee
  • Storage

順に確認します。

API Request

"productFamily" : "API Request" は以下のようなデータ構造をしています。

"DUCV6P6RVNW3CNWJ" : {
  "sku" : "DUCV6P6RVNW3CNWJ",
  "productFamily" : "API Request",
  "attributes" : {
    "servicecode" : "AmazonS3",
    "location" : "Asia Pacific (Tokyo)",
    "locationType" : "AWS Region",
    "group" : "S3-API-SIA-Retrieval",
    "groupDescription" : "Object Retrieval in Standard-Infrequent Access",
    "usagetype" : "APN1-Retrieval-SIA",
    "operation" : ""
  }

location が対象リージョンです。

Data Transfer

"productFamily" : "Data Transfer" は以下のようなデータ構造をしています。

"PYGPVTGGW5GRFAPU" : {
  "sku" : "PYGPVTGGW5GRFAPU",
  "productFamily" : "Data Transfer",
  "attributes" : {
    "servicecode" : "AWSDataTransfer",
    "transferType" : "Accelerated InterRegion Outbound using edge locations outside US, Europe or Japan",
    "fromLocation" : "Asia Pacific (Tokyo)",
    "fromLocationType" : "AWS Region",
    "toLocation" : "US East (N. Virginia)",
    "toLocationType" : "AWS Region",
    "usagetype" : "APN1-USE1-AWS-Out-ABytes-T2",
    "operation" : ""
  }
},

Data Transfer であれば、

  • fromLocation
  • toLocation

のどちらかが対象リージョンです。

Fee

"productFamily" : "Fee" は以下のようなデータ構造をしています。

"XVWPJG9SMSSHZ9HQ" : {
  "sku" : "XVWPJG9SMSSHZ9HQ",
  "productFamily" : "Fee",
  "attributes" : {
    "servicecode" : "AmazonS3",
    "location" : "Asia Pacific (Tokyo)",
    "locationType" : "AWS Region",
    "feeCode" : "S3-Expedited-Retrieval",
    "feeDescription" : "Fee for Expedited Retrieval of data stored",
    "usagetype" : "APN1-Expedited-Retrieval-Bytes",
    "operation" : ""
  }
},

location が対象リージョンです。

Storage

"productFamily" : "Storage" は以下のようなデータ構造をしています。

"VYPMFZ3C34HQCUWR" : {
  "sku" : "VYPMFZ3C34HQCUWR",
  "productFamily" : "Storage",
  "attributes" : {
    "servicecode" : "AmazonS3",
    "location" : "Asia Pacific (Tokyo)",
    "locationType" : "AWS Region",
    "availability" : "N/A",
    "storageClass" : "Archive",
    "volumeType" : "Amazon Glacier",
    "usagetype" : "APN1-TimedStorage-GlacierByteHrs",
    "operation" : "",
    "durability" : "99.999999999%"
  }
},

location が対象リージョンです。

ファイルフォーマットについて

従来のリストプライスは

  • JSON
  • CSV

の2形式に対応していました。

リージョン別ファイルの JSON/CSV 対応状況を確認します。

インデックスファイルについて

インデックスファイルURLの最後の拡張子部分を csv に変更してCSV形式のインデックスファイルを要求すると、次のように 403 Forbidden エラーがかえってきました。

$ curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/region_index.csv
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>8B1E91CB351C6280</RequestId><HostId>ldzLVYmGNDlV1ffWatLRV/VYE6Oo74/uJ+mCCjxfNCZHWcaIJaePkYGA0MIY/SEBL+7dOwR+/R4=</HostId></Error>

残念ながらリージョン別インデックスファイルは JSON のみに対応しているようです。

リージョン別プライスリストデータファイルについて

JSON型のリージョン別インデックスファイルから参照されるリージョン別プライスリストデータのURL(currentVersionUrl)もJSON形式のものとなっています。

このURLの最後の拡張子部分を csv に変更すると、次のように CSV 形式のデータを取得できました。

$ curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-1/index.csv
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0"FormatVersion","v1.0"
"Disclaimer","This pricing list is for informational purposes only. All prices are subject to the additional terms included in the pricing pages on http://aws.amazon.com. All Free Tier prices are also subject to the terms included at https://aws.amazon.com/free/"
"Publication Date","2017-04-24T23:01:14Z"
"Version","20170424230114"
"OfferCode","AmazonS3"
"SKU","OfferTermCode","RateCode","TermType","PriceDescription","EffectiveDate","StartingRange","EndingRange","Unit","PricePerUnit","Currency","Product Family","serviceCode","Location","Location Type","Availability","Storage Class","Volume Type","Fee Code","Fee Description","Group","Group Description","Transfer Type","From Location","From Location Type","To Location","To Location Type","usageType","operation","Durability"
"JDTB869VVEH9D6S6","JRTCKXETXF","JDTB869VVEH9D6S6.JRTCKXETXF.6YS6EN2CT7","OnDemand","$0.040 per GB - Asia Pacific (Tokyo) Amazon S3 accelerated data transfer to Asia Pacific (Mumbai)","2017-04-01","0","Inf","GB","0.0400000000","USD","Data Transfer","AWSDataTransfer","","","","","","","","","","Accelerated InterRegion Outbound from close by location","Asia Pacific (Tokyo)","AWS Region","Asia Pacific (Mumbai)","AWS Region","APN1-APS3-AWS-Out-ABytes","",""
"9T23NTZE42HNQSMG","JRTCKXETXF","9T23NTZE42HNQSMG.JRTCKXETXF.6YS6EN2CT7","OnDemand","$0.040 per GB - South America (Sao Paulo) Amazon S3 accelerated data transfer from Asia Pacific (Tokyo)","2017-04-01","0","Inf","GB","0.0400000000","USD","Data Transfer","AWSDataTransfer","","","","","","","","","","Accelerated InterRegion Inbound using edge locations within US, Europe or Japan","South America (Sao Paulo)","AWS Region","Asia Pacific (Tokyo)","AWS Region","SAE1-APN1-AWS-In-ABytes-T1","",""
"PKC9TNBVZA4G6BZ5","JRTCKXETXF","PKC9TNBVZA4G6BZ5.JRTCKXETXF.6YS6EN2CT7","OnDemand","$0.09 per GB - Asia Pacific (Tokyo) data transfer to EU (London)","2017-04-01","0","Inf","GB","0.0900000000","USD","Data Transfer","AWSDataTransfer","","","","","","","","","","InterRegion Outbound","Asia Pacific (Tokyo)","AWS Region","EU (London)","AWS Region","APN1-EUW2-AWS-Out-Bytes","",""
"R9DT92BCYWWH9KQW","JRTCKXETXF","R9DT92BCYWWH9KQW.JRTCKXETXF.6YNURZBX9Y","OnDemand","$0.0264 per GB - first 1 TB / month of storage used - Reduced Redundancy Storage","2017-04-01","0","1024","GB-Mo","0.0264000000","USD","Storage","AmazonS3","Asia Pacific (Tokyo)","AWS Region","99.99%","Non-Critical Data","Reduced Redundancy","","","","","","","","","","APN1-TimedStorage-RRS-ByteHrs","","99.99%"
...

CSVのリストプライスデータを利用してきた場合は、リージョン別インデックスデータファイルのURLを一部加工してCSVデータを要求するのが良いかと思います。

リージョン別プライスリストデータを current で要求

従来の全リージョン分のプライスリストデータやリージョン別プライスリストインデックスは current で要求するのに対して

  • https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/index.json
  • https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/region_index.json

リージョン別プライスリストデータは年月日指定しています。

  • https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-1/index.json

現時点の動作としては current と 指定する年月日が同じものを指している場合、この2つは置き換え可能なようです。

例えば current が 20170424230114 を指している場合、

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/index.json

のかわりに

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/20170424230114/index.json

としたり、

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/20170424230114/ap-northeast-1/index.json

のかわりに

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/ap-northeast-1/index.json

としても同じデータを取得できました。

(サービス, タイムスタンプ) を何処かに残しておくと、やんごとなき理由により過去のある時点のプライスリストが欲しくなったときに、救世主となるかもしれません。

まとめ

本日は、日本国内ではごく少数しか活用していないと思われる、プライスリスト API のリージョン別提供対応を紹介しました。

どこかの誰かのお役に立てば嬉しいです。

参照

AWS Cloud Roadshow 2017 福岡