Fastly のサービスごとの配信容量を確認する


はじめに

Fastly のコントロールパネルでは、サービス単位、またはアカウント全体のリクエスト数や配信トラフィックの推移、キャッシュヒット率、エラー率、オリジンレイテンシーなど配信に関する様々な情報をグラフとして表示することが出来ます。

また、課金対象のトラフィックの情報を確認することも可能なのですが、こちらはアカウント配下のすべてのトラフィックが合算された形で表示されます。

場合によっては各サービスごとの課金対象となる配信容量を確認したい場合もあると思いますので、この記事では API を使って各サービスごとの配信容量を取得する手順を説明したいと思います。

API Keyの取得

API で情報を取得するためには、API Token が必要となります。API Token とはログインユーザーごとに管理される認証情報で、API を利用して Fastly のリソースにアクセスする際に必要となります。

API Token は、Fastly のコントロールパネルにアクセスして右上のメールアドレスをクリックすると表示されるメニューからAccountをクリックします。

Company Setting ページが表示されるので、左側のメニューから Personal API Tokens をクリックし、Create Token をクリックすることで作成出来ます。

手順の詳細については英文になってしまうのですが、Using API tokens をご確認下さい。

Stats API へのアクセス

それでは取得したAPI Key を利用して、API経由で情報を取得してみます。月ごとの配信容量を取得する /stats/usage_by_month というAPI があるのでそれを利用します。

この API では、指定した月のサービスごとの各リージョンごとの利用トラフィックを返却します。また、billable_units オプションを利用することで、自動的に課金の単位であるGBと10,000リクエストの単位で情報を返却してくれます。APIの詳細は Stats API ドキュメントをご確認下さい。

以下が実際のAPIコールとレスポンスのサンプルです。結果はJSON形式で返却されるのですが、そのままでは見にくいの jq に渡すことで整形して表示されます。
jq の使い方等については色々な方がわかりやすい記事を書いてくれているので検索してみて下さい。

curl -H "Fastly-Key:<token>" "https://api.fastly.com/stats/usage_by_month?year=2017&month=7&billable_units=true" | jq

{
  "status": "success",
  "msg": null,
  "meta": {
    "from": "2017-07-01 00:00:00 +0000",
    "to": "2017-07-31 23:59:59 +0000",
    "by": "day",
    "region": "all"
  },
  "data": {
    "customer_id": "YOUR_CUSTOMER_ID",
    "services": {
      "SERVICE_ID": {
        "name": "SERVICE_NAME",
        "anzac": {
          "bandwidth": 28.815130509,
          "requests": 131.7256
        },
        "asia": {
          "bandwidth": 180.182470562,
          "requests": 965.4324
        },
        "europe": {
          "bandwidth": 1230.23131801,
          "requests": 6082.2894
        },
        "latam": {
          "bandwidth": 18.070301895,
          "requests": 93.7146
        },
        "south_africa": {
          "bandwidth": 8.77620445,
          "requests": 37.9704
        },
        "usa": {
          "bandwidth": 2330.717545144,
          "requests": 5524.7604
        }
      }
    },
    "total": {
      "anzac": {
        "bandwidth": 28.815130509,
        "requests": 131.7256
      },
      "asia": {
        "bandwidth": 180.182470562,
        "requests": 965.4324
      },
      "europe": {
        "bandwidth": 1230.23131801,
        "requests": 6082.2894
      },
      "latam": {
        "bandwidth": 18.070301895,
        "requests": 93.7146
      },
      "south_africa": {
        "bandwidth": 8.77620445,
        "requests": 37.9704
      },
      "usa": {
        "bandwidth": 2330.717545144,
        "requests": 5524.7604
      }
    }
  }
}

上記のようにサービスごとの地域別トラフィックの総量、リクエストの数が表示され、最後に全サービスでの合計の地域別のトラフィック情報が表示されます。

特定のサービスにしぼって情報を表示したい場合、以下のように jq で Service ID を指定することで指定した Service ID の情報のみ表示することが可能です。

curl -H "Fastly-Key: <token>" "https://api.fastly.com/stats/usage_by_month?month=11&year=2018&billable_units=true" | jq '.data.services."<service_id>"'

なお、全リージョンの配信量の総量はレスポンスには含まれていませんが地域別の情報を加算することで計算が可能です。以下のようにjq コマンドを利用して合計値を表示することも可能です。

レスポンスのJSONのフォーマットの関係で個別 Service ID の合計値を計算する場合と、全サービスの合計を取得する場合の指定方法が異なりますのでご注意下さい。

個別 Service ID 指定用
curl -H "Fastly-Key:<token>" "https://api.fastly.com/stats/usage_by_month?year=2017&month=7&billable_units=true" | jq '.data.services."<service_id>" | del(.name) | [.[].bandwidth] | add'

total(全サービス合計)用
curl -H "Fastly-Key:<token>" "https://api.fastly.com/stats/usage_by_month?year=2017&month=7&billable_units=true" | jq '[.data.total[].bandwidth]|add'

bandwidth の箇所を requests に変更することでリクエストの合計値を取得することも可能です。

今回の記事で利用した API は bandwidth と requests のみを返却しますが、他の Stats API を利用すると様々な分析情報を API で取得することが可能です。 Stats API の詳細、取得可能な情報については Historical Stats API fieldsもご確認下さい。