Amazon Redshift 『Concurrency Scaling』の利用状況と利用費を把握する

先日のブログで『Concurrency Scaling for Amazon Redshift』 の導入の容易さと費用対効果の高さを紹介しました。いくら良い機能であっても料金がどれくらい発生するのか具体的にイメージできないと導入を躊躇してしまいがちです。今回は、安心して利用して頂けるように利用費と課金状況について解説します。
2019.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

目次

はじめに

先日のブログでConcurrency Scalingの導入の容易さと費用対効果の高さを紹介しました。その利用費は、追加したクラスターで稼働したクエリに対して1秒単位の従量課金となります。いくら良い機能であっても料金がどれくらい発生するのか具体的にイメージできないと導入を躊躇してしまいがちです。今回は、安心してConcurrency Scalingを利用して頂けるように利用状況と利用費を把握できる方法について解説します。

利用費の詳細

Concurrency Scaling の利用費

「追加したクラスターで稼働したクエリに対して1秒単位の従量課金」となります。正確には、追加したスケーリングクラスタで稼働したクエリが一つでもあると課金が発生し、1秒単位で追加したスケーリングクラスタの台数に応じて従量課金が発生します。逆の言い方をすると、仮にスケーリングクラスタが稼働状態であってもクエリが一つも実行していなければ課金は発生しません。

無料クレジットの提供、最大30時間累積可能

クラスタ毎に1日1時間分のConcurrency Scalingの無料のクレジットが提供され、さらに最大30時間の無料のConcurrency Scalingクレジットを累積できます。そのため、多くの利用者はConcurrency Scalingを無料でご利用いただけるのではないかと考えています。

つまり、1時間までなら無料で利用可能で、30時間までなら貯めて一気に使うことも可能です。一月の中でピーク需要に合わせてコンピューティングが必要とされる期間だけスケーリングクラスタを活用することが可能です。

利用費の例

例えば、米国東部(US-East)の10台のコンピュートノードを含む DC2.8XLノードのRedshiftクラスターは、1時間あたり48ドルです。無料のConcurrency Scalingクレジットを超えて、2つの一時クラスターが5分間使用されるシナリオを考えてみましょう。Concurrency Scalingの1秒あたりのオンデマンドレートは、48ドル* 1/3600 = 1秒あたり0.013ドルです。この場合のConcurrency Scalingの追加コストは、1秒あたり0.013ドル* 300秒* 2一時クラスタ= 8ドルです。したがって、この場合のAmazon Redshiftクラスターと2つの一時クラスターの合計コストは56ドルです。

利用状況・利用費の把握する

利用状況を取得する

利用状況は請求情報のシステムテーブルsvcs_concurrency_scaling_usageにて確認することができます。利用した期間(start_timeとend_time)と時間(usage_in_seconds)、実行したクエリ数(queries)の情報が得られます。dateadd()関数にて9時間前にシフトしている理由は、時間をJST(日本時間)からUTCに変換するためです。

cmdb=# -- usage_in_seconds
cmdb=# select *
cmdb-# from svcs_concurrency_scaling_usage
cmdb-# where
cmdb-# start_time > dateadd('h', -9 ,'2019-03-31 12:00:00') and
cmdb-# end_time < dateadd('h', -9 ,'2019-03-31 13:00:00') cmdb-# order by start_time; start_time | end_time | queries | usage_in_seconds ----------------------------+----------------------------+---------+------------------ 2019-03-31 03:02:56.029746 | 2019-03-31 03:03:18.387701 | 5 | 23 2019-03-31 03:03:19.208457 | 2019-03-31 03:35:07.291934 | 502 | 1909 (2 rows) ``` 上記の例は2レコードしかありませんが、実際の複数スケーリングクラスタ環境では多くのレコードがヒットしますので、下記のように集計します。 ```sql cmdb=# cmdb=# -- usage_total cmdb=# select sum(usage_in_seconds) as "usage_total(sec)" cmdb-# from svcs_concurrency_scaling_usage cmdb-# where cmdb-# start_time > dateadd('h', -9 ,'2019-03-31 12:00:00')
cmdb-# and end_time < dateadd('h', -9 ,'2019-03-31 13:00:00'); usage_total(sec) ------------------ 1932 (1 row) ``` 念の為、`concurrency_scaling_status`カラムが追加になった新しい`stl_query`テーブルで、課金対象となるスケーリングクラスタで実行したクエリ数を検算すると、上記のクエリ数と一致することが確認できます。 ```sql cmdb=# -- scaled_query cmdb=# select cmdb-# count(*) as scaled_query, cmdb-# min(starttime) as starttime, cmdb-# max(endtime) as endtime cmdb-# from cmdb-# stl_query cmdb-# where cmdb-# userid = 111 cmdb-# and concurrency_scaling_status = 1 -- 1 - Ran on a Concurrency Scaling cluster cmdb-# and starttime > dateadd('h', -9 ,'2019-03-31 12:00:00')
cmdb-# and endtime < dateadd('h', -9 ,'2019-03-31 13:00:00')
cmdb-# and aborted = 0
cmdb-# ;
scaled_query | starttime | endtime
--------------+----------------------------+---------------------------
507 | 2019-03-31 03:02:48.184974 | 2019-03-31 03:35:07.29135

<a name="cs-billing-calculation"></a>

Concurrency Scalingの利用費を算出する

「利用費の例」を参考に算出します。米国東部(us-east-1)の2台のコンピュートノードを含む dc2.largeノードのRedshiftクラスターは、1時間あたり0.50USD/時間です。1つのスケーリングクラスターが1932秒間使用されるシナリオを考えてみましょう。Concurrency Scalingの1秒あたりのオンデマンドレートは、0.5ドル* 1/3600 = 1秒あたり0.00013889ドルです。この場合のConcurrency Scalingの追加コストは、1秒あたり0.00013889* 1932秒= 0.2683ドルです。

式は以下のようになります。

利用時間(秒) * コンピュートノードの1時間の利用費 * ノード数 / 3600 * スケーリングクラスタの数

よって、以下のクエリで算出できます。

cmdb=# -- billing_total
cmdb=# select sum(usage_in_seconds) * 0.25 * 2 / 3600 * 1 as "billing_total(usd)"
cmdb-# from svcs_concurrency_scaling_usage
cmdb-# where
cmdb-# start_time > dateadd('h', -9 ,'2019-03-31 12:00:00')
cmdb-# and end_time < dateadd('h', -9 ,'2019-03-31 13:00:00');
billing_total(usd)
--------------------
0.2683
(1 row)

もっと簡単に利用時間の概算を取得するには

マネジメントコンソールの[データベースパフォーマンス]タブに新たに追加されたメトリクスConcurrency Scaling Usage In Minutes (Sum)を参照すると5分毎の利用時間(秒)がグラフに表示されます。約35分間のこのグラフの面積が利用時間になりますので、2100秒(=35*60)なので、概ね利用時間(秒)を算出できます。

SVCS_CONCURRENCY_SCALING_USAGE に関する注意事項

svcs_concurrency_scaling_usageシステムビューは、システムテーブルと同様に数日でローテーションして削除されますので、長い期間の利用状況を把握したい場合は、日次で別のテーブルやファイル出力するなどをご検討ください。

最後に

Concurrency Scalingの利用費は、追加したスケーリングクラスターで稼働したクエリに対して1分単位の従量課金となります。Concurrency Scalingは、クラスタ毎に1日1時間分のConcurrency Scalingの無料のクレジットが提供され、さらに最大30時間の無料のConcurrency Scalingクレジットを累積できます。例えば、1ヶ月これまで通り運用して、最大30時間の無料のConcurrency Scalingクレジットを累積した後、まとめてPoCにご利用していただくことも可能です。

Concurrency Scalingの利用費を算出するの例のように、dc2.largeの2ノードクラスタ構成において、約30分間0.2683ドルの追加費用で済むことでご安心していただければ幸いです。

合わせて読みたい

Amazon Redshift 高い同時実行性と一貫したパフォーマンスを提供する新機能『Concurrency Scaling』がリリースされました

高い同時実行性と一貫したパフォーマンスを提供する新機能『Concurrency Scaling for Amazon Redshift』を実際に試してみました