Amazon Redshift Spectrum でクエリ料金を計算する方法を教えてください。

最終更新日: 2020 年 8 月 7 日

Amazon Simple Storage Service (Amazon S3) からデータがスキャンされたときに、Amazon Redshift Spectrum でクエリ料金を計算したいと考えています。Redshift Spectrum クエリの使用量またはコストはどのように計算すればよいのですか? また、料金を削減するためのベストプラクティスにはどのようなものがありますか?

簡単な説明

前提条件:

  • Amazon Redshift クラスター。
  • SQL コマンドを実行するためにクラスターに接続されている SQL クライアント。
  • Amazon Redshift クラスターと Amazon S3 バケットの両方が同じリージョンに存在する必要があります。

Redshift Spectrum を使用すると、S3 のデータに対して直接 SQL クエリを実行できます。S3 からスキャンされたバイト数に対して課金されます。リージョンに応じて、追加料金 (スキャンされたデータの TB あたり 5~6.25 USD) が発生します。バイト数は常に次の MB に切り上げられます。クエリごとの最低バイト数は 10 MB です。詳細については、Amazon Redshift の料金を参照してください。

注意: パーティションや失敗したクエリを管理するための CREATEALTERDROP TABLE ステートメントなどのデータ定義言語 (DDL) ステートメントには料金はかかりません。

解決方法

予想されるクエリコストを計算する (および Redshift Spectrum で実行されたすべての S3 クエリの要約を取得する) には、SVL_S3QUERY_SUMMARY テーブルを使用します。s3_scanned_bytes 列は、Redshift Spectrum レイヤーに送信された S3 からスキャンされたバイト数を返します。

使用状況

SVL_S3QUERY_SUMMARY に対してクエリを実行して、queryID によって転送されたバイト数を調べることができます。

SELECT s3_scanned_bytes
FROM SVL_S3QUERY_SUMMARY
WHERE query=<queryID>;

S3 からスキャンされたすべてのバイト数の合計を調べるには、次のクエリを使用します。

SELECT sum(s3_scanned_bytes)
FROM SVL_S3QUERY_SUMMARY;

また、特定の時間間隔における Redshift Spectrum からのすべてのクエリの合計バイト数を確認することもできます。次の例は、前日以降に実行を開始したクエリのすべてのバイト数の合計を計算する方法を示しています。

SELECT sum(s3_scanned_bytes)
FROM SVL_S3QUERY_SUMMARY
WHERE starttime >= current_date-1; 

米国東部 (バージニア北部) リージョンの S3 バケットに対してこのクエリを実行すると、Redshift Spectrum はテラバイトあたり 5 USD を課金します。SVL_S3QUERY_SUMMARY のクエリ時に s3_scanned_bytes の合計として 621,900,000,000 バイトが返された場合、0.565614755032584 テラバイトになります (バイト数をテラバイト数に変換する場合)。

621900000000 bytes = 621900000000/1024 = 607324218.75 kilobytes
607324218.75 kilobytes = 607324218.75/1024 =  593090.057373046875 megabytes
593090.057373046875  megabytes =  593090.057373046875 /1024 = 579.189509153366089 gigabytes
579.189509153366089  gigabytes =  579.189509153366089/1024 = 0.565614755032584 terabytes 

この例では、使用量は約 0.5657 テラバイトです。Redshift Spectrum の使用コストを計算するには、それにテラバイトあたりのコストを乗じます。

$5 * 0.5657= $2.83

また、次の SQL クエリを使用して Redshift Spectrum の使用料金を計算することもできます。

SELECT
   round(1.0*sum(s3_scanned_bytes/1024/1024/1024/1024),4) s3_scanned_tb,
   round(1.0*5*sum(s3_scanned_bytes/1024/1024/1024/1024),2) cost_in_usd 
FROM SVL_S3QUERY_SUMMARY; 

この例では、Redshift Spectrum の料金は、前日からスキャンされたデータについて、S3 バケットに対してクエリされます。

注意: 9.9 MB までスキャンするすべてのクエリは切り上げられ、10 MB として課金されます。失敗したクエリや中止されたクエリには料金はかかりません。

さらに、システムログテーブル (STL) は、ログの使用量と使用可能なディスク容量に応じて、2~5 日のログ履歴のみを保持します。したがって、毎日のクエリ料金を計算し、それを別のテーブルに保存し、転送されたバイトのレコードを保持することがベストプラクティスです。次に例を示します。

CREATE VIEW spectrum_cost AS
SELECT starttime::date as date, xid, query, trim(usename) as user, 
  CASE WHEN s3_scanned_bytes < 10000000 then 10 ELSE s3_scanned_bytes/1024/1024 end as scanned_mb, 
  round(CASE WHEN s3_scanned_bytes < 10000000 then 10*(5.0/1024/1024) 
  ELSE (s3_scanned_bytes/1024/1024)*(5.0/1024/1024) end,5) as cost_$ 
FROM svl_s3query_summary s 
LEFT JOIN pg_user u ON userid=u.usesysid 
JOIN 
(select xid as x_xid,max(aborted) as x_aborted from svl_qlog group by xid) q 
ON s.xid=q.x_xid 
WHERE userid>1 AND x_aborted=0
AND s.starttime >= current_date-1;

注意: CREATE TABLE クエリを使用して、データを計算して別のテーブルに保存することもできます。期間を指定しない場合は、「current_date-1」を削除します。

前日以降に S3 から Redshift Spectrum にスキャンされたデータの合計を計算します。そして、次のクエリを実行して、請求額の合計見積もりを計算します。

SELECT current_date-1 as query_since, SUM(scanned_mb) as total_scanned_mb, SUM(cost_$) as total_cost_$
FROM spectrum_cost;
Result:
  query_since | total_scanned_mb | total_cost_$
--------------+------------------+---------------
 2020-05-15   |            5029  |      0.02515 

Redshift Spectrum のベストプラクティス

クエリ料金を削減し、Redshift Spectrum のパフォーマンスを向上させるには、以下のベストプラクティスを検討してください。

  • Redshift Spectrum のコストコントロールと同時実行スケーリング機能を使用して、使用量をモニタリングおよび制御します。
  • 最適化されたデータ形式を使用して、パフォーマンスを向上させ、コストを削減します。PARQUET や ORC などの単票形式のデータを使用して、S3 からスキャンする列のみを選択します。
  • S3 にデータをロードし、データへのアクセス頻度が低い場合は Redshift Spectrum を使用します。
  • 複数の Amazon Redshift クラスターを使用して同時実行をスケールする場合は、ジョブが完了したらすぐにそれらのクラスターを終了します。

Redshift Spectrum のコストコントロールと同時実行スケーリング

Redshift Spectrum のコストコントロールと同時実行スケーリング機能を使用することで、日次、週次、月次の使用制限を作成できます。使用制限に達すると、Amazon Redshift は使用制限に基づいて自動的にアクションを実行します。

Amazon Redshift コンソールからコストコントロールを設定するには、以下の手順を実行します。

1.    AWS マネジメントコンソールにサインインします。

2.    Amazon Redshift コンソールを開きます。

注意: AWS コマンドラインインターフェイス (AWS CLI) または Amazon Redshift API オペレーションから使用制限を定義および管理することもできます。

3.    [Configure usage limit] (使用制限の設定) をクリックします。

4.    次の設定を更新します。

Time period (Daily/Weekly/Monthly) (期間 (日次/週次/月単位))

Usage limit (TB) (使用制限 (TB))

Action (Alert/Log to system table/Disable feature) (アクション (アラート/システムテーブルへのログ/無効化の機能))

注意: [Action] (アクション) 機能は、使用制限を管理するのに役立ちます。

[Concurrency Scaling] (同時実行スケーリング) の使用制限を設定するには、以下の手順を実行します。

1.    AWS マネジメントコンソールにサインインします。

2.    Amazon Redshift コンソールを開きます。

3.    使用制限として [Concurrency scaling usage limit] (同時実行スケーリングの使用制限) を選択します。

4.    次の設定を更新します。

Time period (Daily/Weekly/Monthly) (期間 (日次/週次/月単位))

Usage limit (hh:mm) (使用制限 (hh:mm))

Action (Alert/Log to system table/Disable feature) (アクション (アラート/システムテーブルへのログ/無効化の機能))

注意: [Time period] (期間) は UTC タイムゾーンです。[Alert] (アラート) および [Disable] (無効化) 機能では、Amazon Simple Notification Service (SNS) サブスクリプションをアラームにアタッチすることもできます。さらに、Amazon Redshift コンソールを使用してアラートを有効にすると、それらのメトリクスに対して Amazon CloudWatch アラームが自動的に作成されます。

追加のコストコントロール要件と制限

Redshift Spectrum の使用量とコストを管理する際には、以下の要件と制限に注意してください。

  • 使用制限は、サポートされているバージョン 1.0.14677 以降で使用できます。
  • カテゴリごとに最大 4 つの制限とアクションを追加できます (合計 8 つの制限)。
  • Redshift Spectrum は、Redshift Spectrum と同時実行スケーリングが利用できるリージョンでのみサポートされています。
  • 機能ごとに 1 つの制限のみが [Disable] (無効化) アクションを使用できます。
  • 使用制限は、使用制限定義自体またはクラスターが削除されるまで保持されます。
  • 期間の途中で制限を作成する場合、制限はその時点から定義された期間の終了まで測定されます。
  • ログオプションを選択する場合は、STL_USAGE_CONTROL ログの詳細を確認します。