Azure originからCDNへの転送にかかる料金について

※ドキュメントを読み漁ったり、Azureのサポートに問い合わせたりしていますが、私の解釈も大きく入っているため、誤った情報の可能性もあります

オリジンからAzure CDNへの転送にかかる料金について調べたり問い合わせしたりしてました。

背景として、たまたまAzureMediaService(AMS)のCDN利用についてMSの方に相談させてもらったときの会話で「AMSでCDN統合を使わなかった場合のCDN利用は別途料金がかかりますね」という話があり「AMSのCDN統合を使う使わないで違いがあるのか？」というのが気になり調べ始めたという感じです。
過去に6時間ぐらい書いて公開したんですが間違ってたことが分かり下書きに戻してから時間が空いてしまいましたが、[掲題の件が明文化されたまともなソース](https://azure.microsoft.com/en-us/pricing/details/cdn/#faq)が出てきたので書き上げた次第であります。

...なので、この記事はもはや役立たずなんですが、Azure CDNについてや料金の話も書いたので少しは役に立つかと...


要約
-----------

オリジン→CDN PoP間のインターネットのアウトバウンド通信料金がどういう時にかかるのかを調べました。（※CDN PoP→ユーザ間は常に別途かかります）
以下はその表です。

| | Microsoft Standard | Akamai Standard | Verizon Standard |  Verizon Premium | 参考:外部CDN(Cloudflare,Fastly等) |
|---|---|---|---|---|---|
|Azure Origin(AMS以外のAzureのサービス) | **無料** | 有料 | 有料 | 有料 | 有料 |
|Azure Media Service | 有料 | **CDN統合で無料** | **CDN統合で無料** | **CDN統合で無料** | 有料 |

現状、Azure Media Service(AMS)が特殊のようです。
が、気になる場合は都度、各サービスでどう対応されているか問い合わせるのがよいでしょう。

プランが複数あるのはAzure CDNが現在4つのプランから選べるからです。

そして[Microsoft CDNの無料の対象について書かれているドキュメントがあります](https://docs.microsoft.com/ja-jp/azure/cdn/cdn-billing#which-origin-services-are-eligible-for-free-data-transfer-with-azure-cdn-from-microsoft)が正しくないようです。少なくともAzure Media Serviceに関しては帯域幅(Bandwidth)価格表のFAQドキュメントと矛盾します。


なお、オリジン→CDN PoPへの転送料金と、OriginがAzure Media Serviceの場合の転送料金がかかる旨については帯域幅(Bandwidth)やCDNの各価格表のFAQなどで触れられています。（[帯域幅のほうは2021/10頃は触れられていませんでした](https://web.archive.org/web/20211006123123/https://azure.microsoft.com/en-us/pricing/details/bandwidth/)）

https://azure.microsoft.com/en-us/pricing/details/bandwidth/#faq

https://azure.microsoft.com/en-us/pricing/details/cdn/#faq

とくに帯域幅のFAQでは以下のように書かれており、上記の疑問を答えてくれています。

> **Is data transfer between Azure services and Azure CDN charged?**
> Data transfer between Azure origin to Azure CDN Standard from Microsoft is not charged unless origin is Azure Media Services.
>
> Data transfer between Azure origin to Azure CDN Standard from Akamai, Azure CDN Standard from Verizon, or Azure CDN Premium from Verizon is not charged only if the origin is Azure Media Services and CDN resources are created via theCDN integration within an Azure Media Service resource through the Azure Portal or API.


なお、Azure Frontdoorの場合のCDNは正直よくわかっていません。が、[MicrosoftのCDNという扱いで見ていい](https://docs.microsoft.com/en-us/azure/frontdoor/standard-premium/tier-comparison)はずです。でも自信ないのでサポートに聞いてください・・・






予備知識
-----------

### CDNの仕組み

多分書くまでもないと思いますが一応。

コンテンツを配信する元（サービス）のことをCDNの用語でしばしば「オリジン」と呼ばれています

通常、Webサービスを提供するときは「オリジン」←→「ユーザ」の通信のみですが、これで運用していると以下が問題になることがあります。

- 「オリジン」←→「ユーザ」間の物理的な距離によるレイテンシ（遅延）
    - ググった感じではAzureバックボーンを使った東日本→西日本間でも10ms弱のレイテンシ
- オリジンへの負荷
    - オリジンの負荷へ対処するためにオリジンのリソースを増強が必要になりコストが掛かる

そこで「ユーザ」に近い場所に「CDN（CDN Pop）」を設けて、「オリジン」←→「CDN」←→「ユーザ」という通信になるよう設計します。
初回のみはオリジンに問い合わせて結果をCDNにキャッシュし、以降はオリジンに問い合わせないようにすることで上記の問題を改善するという寸法です。

今回はこの時の「オリジン」→「CDN」の方向のデータ転送料金のお話です。


### Azureにおいてデータ転送にかかる料金について

Azureでは以下の通りです。

- オリジン→ユーザ間（インターネットのアウトバウンド通信料金で計算）
    - →https://azure.microsoft.com/ja-jp/pricing/details/bandwidth/ の「インターネット エグレス (Microsoft Premium グローバル ネットワーク経由でルーティング)」に該当
- CDN PoP→ユーザ間（CDNのアウトバウンド通信料金で計算）
    - →https://azure.microsoft.com/ja-jp/pricing/details/cdn/ の「Content Delivery Network Standard 送信データ転送」に該当

そのため「インターネットのアウトバウンド通信料金」と「CDNのアウトバウンド通信料金」の2つの課金が発生します。この2つはよくある課金ポイントです。

しかし、「オリジン」→「CDN PoP」については書かれていません。「オリジン」から見れば「CDN PoP」は「ユーザ」ともいえるので「インターネットのアウトバウンド通信料金」として計算されそうでもあります。しかし無料になるケースもあるようです。無料、いい響きですね。気になってきましたね？

今回はここの **「オリジン」→「CDN PoP」の転送料金がどうなのか？** という話です。

（もちろんキャッシュヒット率が十分に高い場合は「オリジン」→「CDN PoP」の転送料金は無視できる内容になるでしょう。ただ、今回は気にすることにします。）


### CDN プロバイダ

Azure CDNといってもAzure CDNというものがあるわけではありません。実際のCDNのサービスは「Microsoft」「Akamai」「Verizon」の3社から提供(Provide)されているものを選びます。これらをAzure CDNではCDNプロバイダと呼んでいます。

なんでCDN プロバイダの話をするかというと、Azure CDNといっても、CDN プロバイダで出来ることや料金やドキュメントの読み方が違うからです。CDNとしての基本的な機能はだいたい同じなのですが、細かい機能は違いますし、一緒くたにまとめてると痛い目を見ます（私は見ました）

ドキュメントの事あるごとに「MicrosoftのCDN」とか「VerizonのCDN」とか書かれています。ここはちゃんと区別してください。以下は例です

- https://docs.microsoft.com/en-us/azure/cdn/cdn-features
- https://docs.microsoft.com/ja-jp/azure/cdn/cdn-billing#which-origin-services-are-eligible-for-free-data-transfer-with-azure-cdn-from-microsoft


ここまでが予備知識です。


本題：オリジン→CDN PoP間のインターネットのアウトバウンド通信料金がかからないケース
----------

次のドキュメントにて、オリジン→CDN PoP間の「インターネットのアウトバウンド通信料金」が無料になるサービスが列挙されています。

https://docs.microsoft.com/ja-jp/azure/cdn/cdn-billing#which-origin-services-are-eligible-for-free-data-transfer-with-azure-cdn-from-microsoft

が、具体的にどういった使い方を行った場合に無料になるかまでは書かれていません。(特にVirtual NetworkやExpressRouteやAzure DNSやAzure SQL データベースは何を指すのかわからないと思います。Virtual NetworkとかデータベースってCDNって組み合わせられるの・・・？)

この点をサポートに確認したところ、 **気になる場合は各サービスに問い合わせてください** とのことでした。
CDNのサポートで聞いたわけではないのでちゃんとCDNのサポートに聞けばもう少し詳細に教えてくれるかもしれません

後述しますが、上記のドキュメントには「Azure Media Service→Microsoft CDNは無料」と読める部分ですが、サポート回答と後日更新された帯域幅のFAQから誤りです。直されてませんが。

また、次のIssueも上がっており、やっぱりここの部分の料金はよくわからんかったようです。

https://github.com/MicrosoftDocs/azure-docs/issues/45228


### Azure Media Service(AMS)の場合

今回はAMSの場合を特に知りたかったのでここを深堀していきました。

AMSのサポートに聞いたところ、AMSはCDN統合をサポートしており、こちらを用いるとストリーミングエンドポイント(オリジン)からCDN PoPへの「インターネットのアウトバウンド通信料金」が無料となり、CDNからユーザへの「CDNのアウトバウンド通信料金」のみになるとのことでした。これは料金表のドキュメントに書かれています。

https://azure.microsoft.com/ja-jp/pricing/details/media-services/

> **Azure Content Delivery Network が Media Services ポータルまたは API を通じてストリーミング エンドポイントに対して有効になっている場合**、Standard Content Delivery Network の価格がすべての転送データに適用されます。**Azure Content Delivery Network でストリーミング エンドポイントが有効になっていない場合**、データ転送はデータ転送の価格に基づいて課金されます。

ただ、これを見て「なるほどCDN統合すると無料になるのね」となるかというと、かなり怪しいと思います...。

一応、CDN統合について発表があった記事で、引用部分の最後の部分で軽く触れられています。ただこれではCDN統合のことを指す話なのかは分かりませんね。

https://azure.microsoft.com/ja-jp/blog/announcing-azure-media-services-integration-with-azure-cdn-content-delivery-network/

> Without CDN, you are charged for each streaming unit and outbound traffic from the Azure data center. With CDN, you are charged for each streaming unit and only the outbound traffic from the CDN POPs to end users. **You are not charged for the outbound traffic from the Azure data center to the CDN.**

なお、AMSのCDN統合で使えるCDNプロバイダはAkamaiとVerizonのみで、Microsft CDNはなぜか対応してないようです。
なので、AkamaiとVerizonへの転送料金はCDN統合を使えば無料になります。逆を言えば使わないと有料です。

しかし、CDNプロバイダとして「Microsoft CDN」を選んだ場合の[FAQの記載を見る限り、AMSは該当しそうに見えます](https://docs.microsoft.com/ja-jp/azure/cdn/cdn-billing#which-origin-services-are-eligible-for-free-data-transfer-with-azure-cdn-from-microsoft)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/0fcb8dee-847d-ce97-eedc-a19e9a12d44f.png) 

AMSではMicrosoft CDNはCDN統合でサポートされていません。なのでCDN統合とは別の話のように思えますが、そもそも無料だからCDN統合できないのか？とも考えられそうです。よくわからなくなってきました。

サポートに聞いたところ、AMS→Microsft CDNは有料になるとのことでした。ややこしい。

追記: 2022/06/16 転送量のFAQにこの点も記述されてました。

https://azure.microsoft.com/en-us/pricing/details/bandwidth/#faq

> **Is data transfer between Azure services and Azure CDN charged?**
> Data transfer between Azure origin to Azure CDN Standard from Microsoft is not charged unless origin is Azure Media Services.
> Data transfer between Azure origin to Azure CDN Standard from Akamai, Azure CDN Standard from Verizon, or Azure CDN Premium from Verizon is not charged only if the origin is Azure Media Services and CDN resources are created via the CDN integration within an Azure Media Service resource through the Azure Portal or API.

日本語でも書かれていますが、Azure CDN Profileの概念を理解していないと伝わらない残念な機械翻訳でした。しかしこれがAzureクォリティです。

要は **Azure Media Serviceを除くAzure origin**→Microsoft CDNの場合は無料だが、Azure Media Service→Akamai Standard | Verizon Standard | Verizon Premiumの場合はAzure Media ServiceのCDN統合を用いていれば無料（CDN統合を用いずとも設定できるがその場合は有料）というわけです。なお、Azure Media ServiceのCDN統合にはMicrosoft Standard CDNは選べませんので有料になります。~~お前んちのサービスだろぉ！？~~

文字だとわからないですね。それをまとめたのが[要約にある表](#要約)です。ご参照ください。

なお、Azure Origin→Akamai/Verizonが有料の話は、[CDNのFAQに載ってます](https://azure.microsoft.com/en-us/pricing/details/cdn/)。

Azure OriginはStorage AccountやPublic IP(VM, LB, Application Gateway), App ServiceなどのAzureが提供している外向きのトラフィックを持つサービスを指します。


蛇足
-------------------

### 蛇足: AMSのCDN統合の有効の確認について

ちなみに、AMSにおいてCDN統合が有効になっている状態かどうかはストリーミングエンドポイントのステータスから確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/a03ca69d-118e-0073-432a-ddbd69c81236.png)

CDN統合を有効にするには、AMSのストリーミングエンドポイントを追加・変更する際に「CDNを有効にする」にチェックをいれます。（動作中は変更不可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/1d8427c2-9a49-7d14-dda4-00d7b489857c.png)

AMSはこれでCDN統合が有効になります。

なお、ポータルからはVerizon Standardで固定ですが、REST APIからであればAkamai,Verizon PremiumのCDNプロファイルを用意しておき指定することで他のCDNプロバイダを選べます。


ちなみに、CDN統合を利用しない場合の設定というのは、以下のCDNの手順を使った場合です。

https://docs.microsoft.com/ja-jp/azure/cdn/cdn-create-new-endpoint

この手順もCDNから配信できるのですが、この場合は料金が変わってくるので注意が必要です。


### 蛇足: AMSのCDN統合を行うと内部的に何が違うのか？

作ってみればすぐわかりますが、CDN統合を行った場合、ストリーミングエンドポイントのドメインとして「`cdn--{エンドポイント名}-{AMSアカウント名}-{リージョン名}.streaming.media.azure.net`」という`cdn--`が先頭についた特別なドメインが用意されて、CDNプロファイルにはこれがオリジンとして設定されます（インターネット側から見ると`{エンドポイント名}-{AMSアカウント名}-{リージョン名}.streaming.media.azure.net`と同じものが設定されているだけに見える）
恐らく、ドメイン名を元に課金を免除していたりするのかもしれません。

### 蛇足: FrontDoorはAMSのCDN統合はサポートしているのか？

不安であればサポートに確認しましょう。

Azure Frontdoor Classic/Standard/Premiumは、MicrosoftのCDNを使うようなので転送にかかる料金の仕組みについては同様の認識です。

なぜこれに触れているのかというと、AMSの[高可用性の例](https://docs.microsoft.com/en-us/azure/media-services/latest/media-services-high-availability-encoding)では、FrontDoorを使っていますが、バックエンドプールに各AMSインスタンスのストリーミングエンドポイントを設定しているだけのようでした。これはCDN統合に該当しない設定方法なので、インターネットのアウトバウンド通信料金が発生するかと思われます。

ただ、実際に試したわけではありません。もし不安であればサポートに確認しましょう。


蛇足：他のCDNサービスは？
----------------

色々見てみましたが、どこも私が理解できる程度の記述はなさそうでした（私の理解力が足りないだけのように思えてきます。）

### AWS

私が気にしているのは、次のスライドのP85の(5)の通信にあたります。

https://www.slideshare.net/AmazonWebServicesJapan/20190730-aws-black-belt-online-seminar-amazon-cloudfront#85

料金表やFAQにも明記されています。

https://aws.amazon.com/jp/cloudfront/pricing/

> AWS オリジンを使用している場合、2014 年 12 月 1 日以降、オリジンからエッジロケーションへのデータ転送 (Amazon CloudFront の「オリジンフェッチ」) は無料になります。

https://aws.amazon.com/jp/cloudfront/faqs/

> また、AWS オリジン (Amazon S3 や Amazon EC2 など) を使用している場合、2014 年 12 月 1 日以降、Amazon CloudFront への AWS データ転送に対しては課金されなくなりました。これは、すべての AWS リージョンからすべてのグローバル CloudFront エッジロケーションへのデータ転送に適用されます。

なので、最初のスライド通り「AWS オリジン」→CDN間の通信（オリジンフェッチ）は無料になるとみてよさそうです。

しかし何が「AWS オリジン」となるのかは不明なように思います。「いやEC2って書いてあるじゃん」と素直に受け取ればその通りだとは思います。
しかし、技術的にどのようにしてAWSオリジンとして扱うのかは明確にできるのに、それをしていないのが逆に気になります。現時点ではあいまいだから書けないのでしょうか？例えば、EC2といっても別のAWSアカウントのEC2はどうでしょうか？単純にパブリックIPがAWSのものであればAWS オリジンという扱いになるのか？

つまり、私にはよくわからないということです。

### GCP

(GCPはあまり詳しくないうえに、調査不足かもしれない)

https://cloud.google.com/cdn/pricing

> ケース: キャッシュ可能なコンテンツ、キャッシュミス
> 課金の対象: キャッシュ検索 + キャッシュ下り + **キャッシュ フィル + 該当する Cloud Load Balancing データ処理または Cloud Storage オペレーションの料金**
> 注: こうした費用は、Compute Engine または Cloud Storage から直接配信される場合に適用される下り（外向き）ネットワークの料金に代わるものです。

「こうした費用」というのが何を指すのかわかりにくいですが「キャッシュフィル」に相当するように思います。「Compute Engine または Cloud Storage から直接配信される場合に適用される下り（外向き）ネットワークの料金に代わるものです。」とあることからおそらくはこれらをの転送料金に代わりキャッシュフィル料金として適用されるものと思います。

つまり、私にはよくわからないということです。



### その他の外部CDNサービス（FastlyやCloudflare等）

クラウド（オリジン）→CDNの通信は通常のインターネットエグレス扱いなはずなので、クラウドサービスのインターネットエグレスの料金に従うはずです。ただ、サービス間で連携しているものもありその辺の事情でも変化しそうです（[FastlyとGCPはパートナーのようなので最適化が効くようですが料金は別みたいです](https://cloud.google.com/community/tutorials/cdn-fastly)）

つまり、私にはよくわからないということです。

なお、結構転送量が多くなるときは「インターネットのアウトバウンド通信料金」が掛かっても外部CDNを使ったほうが安く利用できるケースもあるみたいです（お得意様特別価格もあるかもしれませんが計算機を叩いてみましょう）