Azure Data Factory の費用試算方法

# はじめに
Data Factoryの費用の試算は結構複雑でいつも苦労する。ただ、アクティビティなどに対して細かく使った分だけの費用モデルになっているから、それによって受けられるメリットのほうが大きい。いろいろと複雑なパイプラインを組んでも、結構安く済んでしまうことが多いからだ。
とはいえ、だいたいの費用を試算しておけないと困るので、試算方法をここにメモしておく。

Data Factoryの料金については下記に記載されており、本投稿はこちらの情報をもとにまとめている。それぞれの単価とかもこちらを参照。
https://azure.microsoft.com/ja-jp/pricing/details/data-factory/

# Azure Data Factoryの費用にかかる要素

Data Factoryの費用を構成するのは以下の6つの要素になる。

1. パイプラインのオーケストレーションと実行
1. Data Factoryの操作 (パイプラインの作成やパイプラインの監視など) の数
1. 非アクティブなパイプライン
1. SQL Server Integration Services (SSIS)パッケージ実行環境 + カタログ DB
1. データフローの実行とデバッグ *Preview中のオプション機能 (今回は対象外)
1. その他、外部サービスにかかる費用、データの転送にかかる費用も考慮が必要

さてここで、いろいろわけが分からない用語が出てきているので忘れないようにこれもメモしておく。

|用語|ざっくり説明|
|---|---|
|パイプライン|アクティビティと呼ばれる複数の別々のステップの制御フロー|
|アクティビティ|1個の個別の操作 (データコピー、変換、など)|
|ランタイム|処理を実行するもの|
|Azure統合ランタイム|Azure上で処理を実行するときに使用|
|セルフホステッド統合ランタイム|オンプレミスや仮想ネットワークや他のクラウドなどで処理を実行するときに使用|
|SSISランタイム|SQL Server Integration Services (ETL)を動かすときに使用|
|DIU|料金のページに説明が無いのでびっくりするが、ドキュメントには書いてある。データ統合ユニットの略。Data Factoryの1つの単位の能力 (CPU、メモリ、ネットワーク リソース割り当ての組み合わせ) を表す尺度で、Azure統合ランタイムのみに適用される考え方。データコピーの性能が欲しい時に増やしたりする。[詳しくはこちらを参照](https://docs.microsoft.com/ja-jp/azure/data-factory/copy-activity-performance#data-integration-units)|

## 要素1 パイプラインオーケストレーションと実行

### オーケストレーション
* パイプライン内のアクティビティ、トリガー (パイプラインの実行を開始するもの(時間やイベント等))、デバッグ実行の総数によって決定
* 例えば、毎朝9時にAzureストレージからDBにデータをコピーするパイプラインの場合、トリガー x 1、コピーアクティビティ x 1 = 2 実行 / 日
* Azure上のアクティビティとオンプレ (セルフホステッド統合ランタイム) のアクティビティで単価が異なるので注意

### 実行時間
* 上記の実行回数とは別に、実行している時間にかかるコストを考慮
* データの移動にかかる時間、パイプライン全体の実行時間、Data Factory外のアクティビティ実行時間
* 同様にAzure上のアクティビティとオンプレ (セルフホステッド統合ランタイム) のアクティビティで単価が異なるので注意

## 要素2 Data Factoryの操作

### 読み取り/書き込み操作
* エンティティ (データセット、リンクされたサービス、パイプライン、統合ランタイム、トリガー) の読み取り/書き込み
* 読み取り/書き込みとは、エンティティの作成、読み取り、更新、削除の操作を指す

### 監視操作
* パイプライン、アクティビティ、トリガー、デバッグの実行の監視にそれぞれかかる
* 例えば 1 つのトリガー、2 つのアクティビティの実行の取得を行うと 3 つの監視操作となる

## 要素3 非アクティブなパイプライン

### 非アクティブなパイプラインとは
* トリガーに関連付けられていないものや、過去 1 か月間で一度も実行されなかったもの
* 料金は、一度も実行されなかった 1 か月間が過ぎた後に発生

## 要素4 SQL Server Integration Services (SSIS) パッケージ実行環境 + カタログDB

これはSSISパッケージを使う場合のみ必要な要素となる。

### SSIS パッケージ実行環境
* StandardおよびEnterpriseがあり、価格が異なる
* StandardとEnterpriseの機能の違いは [SQL Server のエディションと同じ](https://docs.microsoft.com/ja-jp/sql/integration-services/integration-services-features-supported-by-the-editions-of-sql-server?view=sql-server-2017)
* 実行環境は仮想マシンを必要なスペック (スケールアウト構成含め) で選定する。
* 2019/4 現在ではA, D, Eシリーズの仮想マシンを選択可能

### カタログ DB
* SSISパッケージを登録するDBとしてSQL Databaseを使用する
* SQL Databaseの料金はData Factoryに加えて別途必要となる
* SQL Server向けのAzureハイブリッド特典が利用可能。SQL ServerライセンスをSA付きで所有している場合、SSISパッケージ実行環境の価格の割引が可能

選択できるランタイム用仮想マシンサイズ等はこちらを参照
https://azure.microsoft.com/ja-jp/pricing/details/data-factory/ssis/

# 費用試算に必要なもの

### 事前にわかるとよいもの (これらをもとに要素分解して試算する)
* パイプラインの構成
* 各アクティビティの実行にかかる時間の見積り
* 実行タイミング

### 上記が難しい場合 (下記をもとに無理矢理構成を書いて試算してみるしかない)
* データソース (何のデータソースか、場所、一回で取得するデータサイズ)
* データソースのコピー先 (一時保管先、最終格納先)
* データの処理内容
* 実行タイミング
* など

# 費用試算の例

Azureのドキュメントサイトの例をもとに見積もり方をまとめてみる

### シナリオと構成

以下の図は1時間ごとのスケジュールでデータをAmazon S3からAzure Blobストレージにコピーし、Azure Databricksでデータを変換するパイプライン。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/144789/02d7b43f-9205-ce88-ed01-9f980502fb61.png)
From: https://docs.microsoft.com/ja-jp/azure/data-factory/pricing-concepts


### 構成概要

1. AWS S3 からコピーされるデータの入力データセットと、Azure Storage のデータの出力データセットを含む 1 つのコピーアクティビティ
1. データ変換のための１つの Azure Databricks アクティビティ
1. パイプラインを 1 時間ごとに実行する 1 つのスケジュールトリガー

### 見積もり要素

構成を見積り要素に分解すると下記のようになる。

<table>
<tr>
  <th>要素</th>
  <th> </th>
  <th>項目</th>
  <th>内容</th>
  <th>ボリューム</th>
</tr>
<tr>
  <td rowspan=3>①パイプラインのオーケストレーションと実行</td>
  <td>(A)</td>
  <td>アクティビティの実行</td>
  <td>パイプラインを実行する</td>
  <td>3つのアクティビティの実行(トリガーの実行用に1つ、アクティビティの実行用に2つ)</td>
</tr>
<tr>
  <td>(B)</td>
  <td>データ移動アクティビティの実行時間</td>
  <td>Dataをコピーする(10分かかると仮定)</td>
  <td>実行時間 = 10分。10 * 4つの Azure統合ランタイム (デフォルトDIU設定 = 4)</td>
</tr>
<tr>
  <td>(C)</td>
  <td>外部パイプラインアクティビティ実行時間</td>
  <td>Databricksアクティビティを実行する(10分かかると仮定)</td>
  <td>10 分間の外部パイプラインアクティビティの実行 *Databricksの費用は別途かかる
</td>
</tr>
<tr>
  <td rowspan=5>②Data Factoryの操作</td>
  <td rowspan=4>(D)</td>
  <td>読み取り/書き込み</td>
  <td>リンクされたサービスを作成する</td>
  <td>3つの書き込み/読み取りエンティティ</td>
</tr>
<tr>
  <td>読み取り書き込み</td>
  <td>データセットを作成する</td>
  <td>4つの読み取り/書き込みエンティティ(データセットの作成用に2つ、リンクされたサービスの参照用に2つ)</td>
</tr>
<tr>
  <td>読み取り/書き込み</td>
  <td>パイプラインを作成する</td>
  <td>3つの読み取り/書き込みエンティティ (パイプラインの作成用に1つ、データセットの参照用に2つ)</td>
</tr>
<tr>
  <td>読み取り/書き込み</td>
  <td>パイプラインを取得する</td>
  <td>1つの読み取り/書き込みエンティティ</td>
</tr>
<tr>
  <td>(E)</td>
  <td>監視</td>
  <td>パイプラインを取得する</td>
  <td>3つの監視実行レコードの再試行(パイプラインの実行用に1つ、アクティビティの実行用に2つ)</td>
</tr>
</table>

### 試算方法

①パイプラインのオーケストレーションと実行 = **&yen;19.007334**

||要素|計算|
|---|---|---|
|(A)|アクティビティの実行|0.112 x 3 = &yen;0.336 [1 実行 = &yen;112/1,000 実行 = 0.112]|
|(B)|データ移動アクティビティ|&yen;18.66667 (10 分間 x 4 DIU (最小ユニット)。 &yen;28/時間、 Azure 統合ランタイム)|
|(C)|外部パイプラインアクティビティ|&yen;0.004667 （10分間。 &yen;0.028/時間、 Azure 統合ランタイム)|

②Data Factory の操作 = **&yen;0.014**

||要素|計算|
|---|---|---|
|(D)|読み取り／書き込み|11 x 0.00112 = &yen;0.01232 [1 読み取り/書き込み = &yen;56/50,000 エンティティ = &yen;0.00112]|
|(E)|監視|3 x 0.00056 = &yen;0.00168 [1 監視 = &yen;28/50,000 エンティティ = &yen;0.00056]|


パイプライン実行あたりの費用 = ① + ② = **&yen;19.02134** / 回
1 日あたりの費用 = **&yen;456.5121** / 日
1 か月あたりの費用 = **&yen;13,695.36** / 月 (1か月=30日とした場合)

(注)
* DatabricksやStorage等のData Factory以外のサービス利用かかる費用は含んでいない
* Azureのリージョンをまたぐ場合等、データの転送に費用がかかるケースもあるが、ここでは想定していない


あってるかな？だいたいあってるよね。