Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

プログラミングコードの書き方一つでAWSのクラウドコストは大きく減らせる話【数値計算偏】

背景

AWSを用いた数値計算は往々にして行われているかと思います。

計算にあたって、コンピューティングリソースは、EC2ECSLambdaなど様々な選択肢があるかと思います。

一方で、数値計算クラウド環境で行う場合、

  • 数値計算を得意とする開発者の技術的素養の背景
  • オンプレからの移植コスト

などから、EC2が選択されることが多いかと思います。

数値計算などの大規模計算をEC2で行う場合、コスト面での工夫が重要であるという点を本日はお伝えできればと思います。

AWSコストにおける課題

EC2とセットで使われることが多いのが、EBSです。

オンプレでの計算に慣れている開発者にとっては、

計算機は計算とストレージに過ぎない

という観点から、ストレージサービスに対するコスト意識が希薄であることがあります。

そこで、本日は、

プログラミングコードの書き方だけで、コスト効率が大きく変わる

という点をご紹介できればと思います。

コードの書き方には2通りある

本日、紹介するのは2種類のコードの書き方に関してです。

結論としては、

コードの書き方を見直すことで、ストレージコストを最適化できる

という内容です。

コードの書き方1

計算機は計算ストレージに過ぎない

という知見をベースの方の場合(クラウド的思考がない場合)、

まずは計算を次々完了させていき、それを順次書き出す

という視点の方が多いかと思います(私自身も、全球の数値シミュレーションを専門にしていたので気持ちはよくわかります)。

AWSにおいては、上記のような実装をした場合、一時的に大量のデータがEBSに書き出されるため、EBSのストレージサイズを大きくする必要があります

EBSは、一度ストレージサイズを大きくすると、小さくすることはできません。

また、ストレージサイズに応じて、コストがかかります。

そのため、

一度きりの計算のために、ストレージサイズを大きくしたEBSによって固定費が大きくかかる

という課題が出てしまいます。

書き方1ではこの課題があるため、書き方2ではこの課題を克服しましょう。

・関連資料

www.yuta-nakata.net

コードの書き方2

上記の課題をクリアした書き方が、この書き方です。

結論としては、

for分を用いて繰り返し計算結果を出力するのではなく、一度計算が完了したらS3に転送。転送が完了したら、EBSにあるデータを削除する

という手順を推奨しています。

コスト効果

EBSからS3にデータを置く場所を変えるだけでコスト効果はあるのでしょうか?

結論、めちゃくちゃあります

下記に具体例を示します。

AWSサービス 単価 前提
EBS 0.096USD/GB 月 ・東京リージョンで計算
・gp3で試算
S3 0.023USD/GB 月 ・Standardストレージクラスで試算

このことからわかるように、データの保存先をEBSからS3に変えるだけで、75%改善されます

本手法の課題は?

ここまで聞くと、メリットだらけですが、いい面があれば悪い面もあるということでもちろんデメリットもあります。

具体的には、

S3に書き出したデータをEC2で読むときどうするの?

という点があります。

書き方1なら、同じストレージ領域にあるのでデータを読むことができます。

S3から読み出す場合は、Pythonであれば

  • awswrangler
  • BytesIO

など、多少の工夫が必要です。

CSVファイルであれば、

# S3からデータを取得できない書き方
import pandas as pd

df = pd.read_csv('result.csv')

ではなく、

# S3からデータを取得できる書き方
import awswrangler as ws

df = wr.s3.read_csv("s3://test-bucket/result.csv")

となります。

最後に

書き方一つでコストは変わります。

ぜひ、参考にしてみください〜。