Amazon Redshift Spectrum 利用費と課金状況を把握する

2018.04.04

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

はじめに

Amazon Redshift Spectrum は、データウェアハウスであるRedshiftからシームレスにS3データを直接クエリ出来る機能です。その課金体系は、S3データをどれだけスキャンしたかによって課金されます。この手のサービスは知らず知らずのうちに課金されるのではないかと不安を抱え、導入を躊躇されることが少なくありません。今回は、安心して Amazon Redshift Spectrum を利用して頂けるように利用費と課金状況について解説します。

利用費の詳細

Amazon Redshift Spectrum の利用費

  • スキャンされたバイト数に対して課金されます
  • バイト数はメガバイト単位で切り上げられ、10 MB 未満のクエリは 10 MB と計算されます
  • スキャンされたデータ 1 TB あたり 5 USD
  • CREATE TABLE、ALTER TABLE、DROP TABLE などのDDL、パーティションを管理するステートメント、および正常に実行されなかったクエリに対しては課金されません
  • Amazon Redshift インスタンス料金が課金されます

例えば:

  • 10 ギガバイトのデータをスキャンした場合:0.05 USD が課金されます
  • 1 テラバイトのデータをスキャンした場合は 5 USD が課金されます

つまり、GZIP を使用してファイルを圧縮したり、Apache Parquet などの列指向形式に変換することで、スキャンするバイト数を削減して利用費を抑えることが可能です。

参考: Amazon Redshift Spectrum 料金

その他の利用費

Amazon S3

データはS3に保存するので、標準の Amazon S3 料金が課金されます。しかし、Amazon Redshift のストレージと比較すると圧倒的に低価格です。

  • ストレージおよびリクエストには、標準の Amazon S3 料金が課金されます
  • 2018/04時点: Amazon S3 の料金

AWS Glue Data Catalog

外部スキーマ、外部テーブルの定義(メタ情報)は、AWS Glue Data Catalogに保存するため、その利用費を考慮します。しかし、データカタログのストレージ、リクエスト数は最初の100万まで無料であり、ほとんどのユースケースにおいて無料の範囲で利用できるのではないかと考えています。

  • データカタログのストレージは、最初の100万のオブジェクトは無料、10万のオブジェクトにつき1USD
  • データカタログのリクエストは、最初の100万のリクエストは無料、100万のリクエストにつき1USD
  • 2018/04時点: AWS Glue の料金

クエリあたりのスキャンバイト数・利用費の調べる

S3データを直接クエリ出来る同様のサービスであるAmazon Athenaでは、Athenaコンソールからクエリによって何バイトスキャンしたかを参照できますが、Amazon Redshift Spectrum は参照するUIを持ちません。代わりに Amazon Redshift Spectrum クエリの料金は、システムビュー SVL_S3QUERY_SUMMARY にて Amazon S3 からスキャンされたデータ量を確認できます。

課金対象のスキャンバイト数から支払対象のバイト数を取得する

「バイト数はメガバイト単位で切り上げられ、10 MB 未満のクエリは 10 MB」 と計算されます。10 MBで切り上げした支払対象のバイト数(s3_paid_bytes)を算出します。

cmdb=# SELECT
cmdb-# userid, query, starttime, endtime, elapsed, is_partitioned, s3_scanned_bytes,
cmdb-# CASE
cmdb-# WHEN s3_scanned_bytes % (1024*1024*10) = 0
cmdb-# THEN s3_scanned_bytes
cmdb-# ELSE s3_scanned_bytes - (s3_scanned_bytes % (1024*1024*10)) + (1024*1024*10)
cmdb-# END AS s3_paid_bytes
cmdb-# FROM SVL_S3QUERY_SUMMARY
cmdb-# ORDER BY 1,2;
userid | query | starttime | endtime | elapsed | is_partitioned | s3_scanned_bytes | s3_paid_bytes
--------+--------+----------------------------+----------------------------+----------+----------------+------------------+---------------
100 | 202414 | 2018-04-02 04:37:11.848404 | 2018-04-02 04:37:13.079684 | 1231280 | f | 2304877 | 10485760
100 | 210346 | 2018-04-03 16:17:46.21936 | 2018-04-03 16:17:59.313646 | 13094286 | t | 10527294 | 20971520
100 | 210354 | 2018-04-03 16:19:07.987391 | 2018-04-03 16:19:10.570398 | 2583007 | t | 326235172 | 335544320
100 | 210360 | 2018-04-03 16:20:08.522317 | 2018-04-03 16:20:32.070534 | 23548217 | t | 3836095160 | 3837788160
(4 rows)

支払対象のバイト数から利用費を算出する

上記のクエリを利用して、支払対象のバイト数から利用費(ドル(USD))を算出します。

cmdb=# SELECT userid, query, s3_scanned_bytes, 5.000*s3_paid_bytes/1024/1024/1024/1024 as "price(USD)"
cmdb-# FROM (
cmdb(# SELECT
cmdb(# userid, query, starttime, endtime, elapsed, is_partitioned, s3_scanned_bytes,
cmdb(# CASE
cmdb(# WHEN s3_scanned_bytes % (1024*1024*10) = 0
cmdb(# THEN s3_scanned_bytes
cmdb(# ELSE s3_scanned_bytes - (s3_scanned_bytes % (1024*1024*10)) + (1024*1024*10)
cmdb(# END AS s3_paid_bytes
cmdb(# FROM SVL_S3QUERY_SUMMARY
cmdb(# )
cmdb-# ORDER BY 1,2,3;
userid | query | s3_scanned_bytes | price(usd)
--------+--------+------------------+---------------------
100 | 202414 | 2304877 | 0.00004768371582031
100 | 210346 | 10527294 | 0.00009536743164062
100 | 210354 | 326235172 | 0.00152587890625000
100 | 210360 | 3836095160 | 0.01745223999023437
(4 rows)

SVL_S3QUERY_SUMMARYに関する注意事項

  • SVL_S3QUERY_SUMMARY はすべてのユーザーから参照できます。スーパーユーザーはすべての行を表示できるのに対して、通常のユーザーは自分のデータのみの表示となります
  • データの保存期間は3日前後のため、それよりも長い期間の料金を把握するには一定期間の差分データを他のテーブルに保存する、もしくはS3に保存する必要があります

最後に

今後、分析データ量の拡大やコスト効率の改善などを鑑みると、Amazon Redshift Spectrum を効果的に採用することが求められます。正しい知識と、今回、ご紹介したクエリあたりのスキャンバイト数・利用費を算出する方法を利用し、これらを監視することで、知らず知らずのうちに想定以上の課金が発生することは避けられるはずです。Amazon Redshift をすでに導入済みの場合は、Amazon Redshift Spectrum を段階的に導入して、費用感の目処を付けていただくことをお薦めします。