APIを使ったデータ取得・加工処理をしたときSnowflake/AWSどちらのコストが安い?

本記事では、コンピューティングからテーブル格納までをSnowflake上で全て行った場合と、前者をAWSへ寄せて、テーブル格納のみをSnowflakeで行う2つのパターンでどちらがコストを抑えることができるかを紹介します。
処理フローの違い
Snowflakeで処理
- SnowflakeのNotebookもしくはWorksheet上にPythonコードを記述した関数を作成
- INSERT INTO SELECT文もしくはMERGE文でテーブルへデータ挿入
こちらの処理の流れについては下記の記事にて紹介しています。

AWS
- Lambda上にPythonコードを記述。取得したデータをS3へCSVとして格納。
- COPY INTO文を使ってテーブルへデータをインポート
こちらの手法については下記の記事にて紹介しています。


コスト計算
本記事ではコンピューティング(Pythonの実行時間)のコストに焦点を当ててみます。
下記はInstagramの場合を例に、取得するデータごとのPythonの実行時間を記録したものです。あまり件数自体も多くなく、数分で終わっている点はご了承ください。
取得データ | データ取得・加工処理時間 | クレジット消費 |
アカウントのプロファイル情報 | 5.1秒 | 1 x 1/60 = 1/60 |
投稿情報 | 90.1秒 | 2 x 1/60 = 2/60 |
投稿へのコメント | 113.1秒 | 2 x 1/60 = 2/60 |
エンゲージメント(REEL) | 16.5秒 | 1 x 1/60 = 1/60 |
エンゲージメント(FEED) | 124.7秒 | 3 x 1/60 = 3/60 |
ウェアハウスはX-Small、Standardタイプとしています。こちらを日次バッチで毎日実行した場合、コンピューティングについてひと月(30日)でどの程度かかるか試算してみます。
Snowflakeで処理
Snowflakeは最低でも1分単位のクレジット課金です。仮に10秒で終わる処理も1分として、X-Smallであれば1/60クレジット消費されます。
表の右の列を合計すると、およそ9/60クレジット消費しています。本記事の投稿時点では1クレジットあたり$2.85なので、こちらの処理を一度実行するたび、$2.85 × 9/60 = $0.4275かかります。したがって、ひと月あたり下記の程度かかります。
$0.4275 × 30日 = $12.825/月
こちらにINSERT INTO SELECTによる挿入処理の時間分加算されますが、今回は無視して話を進めちゃいます。
AWS
LambdaでのPython処理およびS3への格納という構成になります。1日一回実行なので、リクエスト数は30、実行時間は表から合計350秒程度、メモリは512MB(0.5GB)となっています。
これが意味するところは、Lambdaは無料枠で全然収まるということです。他はS3への保管料金になります。
こちらはAWSのコンソール画面での紹介で少々粗い計算ですが、月で$1前後になるかと思います。

SnowflakeではS3からのインポートにCOPY INTO文をそれぞれ実行します。現状の件数では、60秒以上かかることはないため、データ取得の数5つ分 x 1/60 × $2.85 = $0.2375が一回の実行にかかります。よって、ひと月(30日)実行すると下記のようになります。
$0.2375 × 30 = $7.125/月
ここにAWSの料金($1)を足して下記になります。
$7.125 + $1 = $8.125/月
結論
前章をまとめるとこのようになります。
- Snowflake:$12.875 + [INSERT INTO SELECT処理でかかる従量料金]
- AWS:$8.125
すなわち、コンピューティングをAWS側に寄せることですくなくとも$4/月以上のコスト削減が見込めます。INSERT INTO よりもCOPY INTOで代替することを推奨する点は、Snowflakeの公式ドキュメントでも紹介されているので、実際の効果についても確認できました。
AWSとSnowflakeでうまくコストを下げられるように、計算やデータ格納の役割分担を検討できると良いですね!