大規模な効率:AWSコスト最適化の物語

公開: 2022-07-22

私は最近、暗号通貨分析プラットフォームを立ち上げました。これは、毎日のユーザー数が少ないことを期待しています。 ただし、人気のあるYouTubeユーザーがサイトを参考にしてレビューを公開すると、トラフィックが急速に増加してサーバーが過負荷になり、プラットフォーム(Scalper.AI)にアクセスできなくなりました。 私の元のAWSEC2環境には、追加のサポートが必要でした。 複数のソリューションを検討した後、AWSElasticBeanstalkを使用してアプリケーションをスケーリングすることにしました。 物事は見栄えが良く、順調に進んでいましたが、請求ダッシュボードのコストに驚かされました。

これは珍しい問題ではありません。 2021年の調査によると、ITおよびクラウドの意思決定者の82%が不要なクラウドコストに遭遇しており、86%はすべてのクラウド支出の包括的なビューを取得できるとは感じていません。 Amazonはドキュメントで追加費用の詳細な概要を提供していますが、価格設定モデルは成長するプロジェクトにとって複雑です。 理解しやすくするために、関連するいくつかの最適化を分析して、クラウドのコストを削減します。

AWSを選んだ理由

Scalper.AIの目標は、暗号通貨ペア(取引所で取引するときに交換される資産)に関する情報を収集し、統計分析を実行し、暗号トレーダーに市場の状態に関する洞察を提供することです。 プラットフォームの技術的構造は、次の3つの部分で構成されています。

  • データ取り込みスクリプト
  • Webサーバー
  • データベース

取り込みスクリプトは、さまざまなソースからデータを収集し、それをデータベースにロードします。 AWSサービスの使用経験があったので、EC2インスタンスを設定してこれらのスクリプトをデプロイすることにしました。 EC2は多くのインスタンスタイプを提供し、インスタンスのプロセッサ、ストレージ、ネットワーク、およびオペレーティングシステムを選択できます。

スムーズなアプリケーション管理が約束されているため、残りの機能にはElasticBeanstalkを選択しました。 ロードバランサーはサーバーのインスタンス間で負荷を適切に分散し、自動スケーリング機能は負荷を増やすために新しいインスタンスを追加する処理を行いました。 更新の展開は非常に簡単になり、わずか数分で完了しました。

Scalper.AIは安定して動作し、ユーザーはダウンタイムに直面しなくなりました。 もちろん、サービスを追加したことで支出が増えると予想していましたが、予想をはるかに上回りました。

どうすればクラウドコストを削減できたでしょうか

振り返ってみると、私のプロジェクトでのAWSサービスの使用には多くの複雑な領域がありました。 AWS EC2の一般的な機能(バースト可能なパフォーマンスインスタンス、アウトバウンドデータ転送、エラスティックIPアドレス、終了状態と停止状態)の操作中に発見した予算の最適化について検討します。

バースト可能なパフォーマンスインスタンス

私の最初の課題は、成長するプロジェクトのCPU消費電力をサポートすることでした。 Scalper.AIのデータ取り込みスクリプトは、ユーザーにリアルタイムの情報分析を提供します。 スクリプトは数秒ごとに実行され、暗号交換からの最新の更新をプラットフォームに提供します。 このプロセスを繰り返すたびに数百の非同期ジョブが生成されるため、サイトのトラフィックが増えると、処理時間を短縮するためにより多くのCPUパワーが必要になります。

4つのvCPUを備えたAWSが提供する最も安価なインスタンスa1.xlargeは、その時点で月額75ドルの費用がかかりました。 代わりに、2つのvCPUとそれぞれ1GBのRAMを備えた2つのt3.microインスタンス間で負荷を分散することにしました。 t3.microインスタンスは、a1.xlargeのコストの5分の1で、必要なジョブに十分な速度とメモリを提供しました。 それにもかかわらず、私の請求額は月末に予想していたよりもまだ大きかった。

理由を理解するために、Amazonのドキュメントを検索して、答えを見つけました。インスタンスのCPU使用率が定義されたベースラインを下回ると、クレジットが収集されますが、インスタンスがベースラインの使用量を超えると、以前に獲得したクレジットを消費します。 利用可能なクレジットがない場合、インスタンスはAmazonが提供する「余剰クレジット」を使用します。 クレジットを獲得して使用するこの機能により、AmazonEC2は24時間にわたってインスタンスのCPU使用率を平均化します。 平均使用量がベースラインを超えると、インスタンスはvCPU時間あたりの定額料金で追加料金が請求されます。

データ取り込みインスタンスを数日間監視したところ、コストを削減することを目的としたCPUセットアップが逆のことを行っていることがわかりました。 ほとんどの場合、私の平均CPU使用率はベースラインよりも高かった。

チャートには、画面の上部で選択された3つのドロップダウン選択があります。左側の最初の2つは、「2022年2月10日-2022年2月19日」と「毎日」で、その後に小さな丸で囲まれた「i」が続きます。 3つ目は画面の右側にあり、線グラフの記号が付いた「線」と表示されます。ドロップダウンの選択の下に、グラフにはフィルター付きの2つの線グラフが含まれています。上部のフィルター行には、「Group by:Usage Type」(選択したフィルター、背景は青色)と表示され、選択されていないフィルター(「Service、Linked Account、Region、Instance Type、Resource、Cost Category、Tag」)が表示されます。 、More」、「Resource」がグレー表示され、最後の3つにはドロップダウン矢印が横に表示されます。一番上の折れ線グラフのy軸には、0.0から2.5の範囲の「コスト($)」があります。一番下の折れ線グラフでは、y軸に0から40の範囲の「使用量(vCPU-時間)」があります。両方の折れ線グラフは、x軸にラベル付けされた2月10日から2月19日までの日付とキーを共有します。紫色の線にラベルを付ける:「USE2-CPUCredits:t3」。一番上の線のグラフには、直線的に接続された約8つのポイントがあり、時間の経過とともに上昇傾向にあります。 4回目(2014年2月、2.1ドル)、5回目(15年2月、2.4ドル)、6回目(16年2月、2.3ドル)、7回目(18年2月、2.3ドル)、8回目(2月- 19、2.6ドル)。一番下の線のグラフにも、直線的に接続された約8つのポイントがあり、時間の経過とともに上昇傾向にあります。1つは(2月10日、5 vCPU-時間)、2つ目は(2月11日、15 vCPU-時間)、3つ目は(2月-12、10 vCPU-Hours)、4番目の周り​​(Feb-14、40 vCPU-Hours)、5番目の周り​​(Feb-15、50 vCPU-Hours)、6番目の周り​​(Feb-16、45 vCPU-Hours) 、7番目の周り​​(2月18日、45 vCPU-時間)、および8番目の周り​​(2月19日、55 vCPU-時間)。
上のグラフは、CPU使用率がベースラインを上回った期間中のコストの急増(上のグラフ)とCPUクレジット使用量の増加(下のグラフ)を示しています。 インスタンスはvCPU時間ごとに請求されるため、ドルのコストは費やされた余剰クレジットに比例します。

私は最初、いくつかの暗号ペアのCPU使用率を分析しました。 負荷が小さかったので、成長の余地は十分あると思いました。 (暗号ペアが少ないほど多くのCPUパワーを必要としないため、データの取り込みに1つのマイクロインスタンスのみを使用しました。)しかし、洞察をより包括的にし、データの取り込みをサポートすることを決定した後、元の分析の限界に気づきました。何百もの暗号ペアの場合-クラウドサービス分析は、正しい規模で実行されない限り、何の意味もありません。

アウトバウンドデータ転送

私のサイトの拡張のもう1つの結果は、小さなバグのためにアプリからのデータ転送が増加したことです。 トラフィックが着実に増加し、ダウンタイムがなくなったため、ユーザーの注意をできるだけ早く捉えて保持する機能を追加する必要がありました。 私の最新のアップデートは、暗号ペアの市況がユーザーの事前定義されたパラメーターと一致したときにトリガーされる音声アラートでした。 残念ながら、コードを間違えたため、オーディオファイルが数秒ごとに何百回もユーザーのブラウザに読み込まれました。

影響は大きかった。 私のバグは私のウェブサーバーからオーディオダウンロードを生成し、追加のアウトバウンドデータ転送を引き起こしました。 私のコードの小さなエラーにより、請求額は以前の請求額のほぼ5倍になりました。 (これだけが結果ではありませんでした。バグによりユーザーのコンピューターでメモリリークが発生する可能性があるため、多くのユーザーが戻ってくるのをやめました。)

前のグラフと似ていますが、最初のドロップダウンに「2022年1月6日-2022年1月15日」と表示され、上の折れ線グラフの「コスト($)」は0から30の範囲で、下の折れ線グラフには「 0から300の範囲のy軸の使用量(GB)」。両方の折れ線グラフは、x軸にラベル付けされた日付(2006年1月から15年1月まで)と、紫色の線にラベル付けされたキー「USE2- DataTransfer-Out-Bytes。」一番上の線のグラフには、直線的に接続された約8つのポイントがあり、時間の経過とともに上昇傾向にあります。 4回目(Jan-10、$ 6)、5回目(Jan-12、$ 15)、6回目(Jan-13、$ 25)、7回目(Jan-14、$ 24)、8回目(Jan- 15、29ドル)。一番下の線のグラフにも、直線的に接続された約8つのポイントがあり、時間の経過とともに上昇傾向にあります。1つは(2006年1月、10 GB)、2つ目は(2008年1月、50 GB)、3つ目は(09、80 GB)、4番目の周り​​(Jan-10、70 GB)、5番目の周り​​(Jan-12、160 GB)、6番目の周り​​(Jan-13、270 GB)、7番目の周り​​(Jan-14、260 GB) 、および約8分の1(1月15日、320 GB)。
上のグラフは、コストの急増(上のグラフ)と増加するアウトバウンドデータ転送(下のグラフ)を示しています。 アウトバウンドデータ転送はGBごとに請求されるため、ドルコストはアウトバウンドデータの使用量に比例します。

データ転送コストは、AWSの価格急騰の30%以上を占める可能性があります。 EC2のインバウンド転送は無料ですが、アウトバウンド転送料金はGBごとに請求されます(Scalper.AIを構築した場合はGBあたり0.09ドル)。 難しい方法を学んだので、アウトバウンドデータに影響を与えるコードに注意することが重要です。 可能な場合はダウンロードやファイルの読み込みを減らす(またはこれらの領域を注意深く監視する)ことで、高額な料金から保護されます。 EC2からインターネットへのデータ転送の料金はワークロードとAWSリージョン固有のレートに依存するため、これらのペニーはすぐに加算されます。 多くの新しいAWSのお客様には知られていない最後の警告:異なる場所間でのデータ転送はより高価になります。 ただし、プライベートIPアドレスを使用すると、同じリージョンの異なるアベイラビリティーゾーン間での余分なデータ転送コストを防ぐことができます。

ElasticIPアドレス

Elastic IPアドレス(EIP)などのパブリックアドレスを使用する場合でも、EC2のコストを下げることができます。 EIPは、動的クラウドコンピューティングに使用される静的IPv4アドレスです。 「エラスティック」部分とは、EIPを任意のEC2インスタンスに割り当てて、停止するまで使用できることを意味します。 これらのアドレスを使用すると、アドレスをアカウント内の別のインスタンスに再マッピングすることで、異常なインスタンスを正常なインスタンスとシームレスに交換できます。 EIPを使用して、ドメインのDNSレコードを指定し、EC2インスタンスを指すようにすることもできます。

AWSは、リージョンごとにアカウントごとに5つのEIPしか提供しないため、リソースが限られており、非効率的な使用でコストがかかります。 AWSは、追加のEIPごとに低い時間料金を請求し、月に100回を超えてEIPを再マッピングすると追加料金を請求します。 これらの制限を下回ると、コストが削減されます。

状態の終了と停止

AWSには、実行中のEC2インスタンスの状態を管理するための2つのオプションがあります。終了または停止です。 終了するとインスタンスがシャットダウンされ、そのためにプロビジョニングされた仮想マシンは使用できなくなります。 接続されているElasticBlockStore(EBS)ボリュームはすべて切り離されて削除され、インスタンスにローカルに保存されているすべてのデータが失われます。 インスタンスの料金は請求されなくなります。

インスタンスの停止も同様ですが、わずかな違いが1つあります。 アタッチされたEBSボリュームは削除されないため、データは保持され、いつでもインスタンスを再起動できます。 どちらの場合も、Amazonはインスタンスの使用に対して課金しなくなりましたが、終了する代わりに停止することを選択した場合、EBSボリュームは存在する限りコストが発生します。 インスタンスをすぐに再アクティブ化する予定がある場合にのみ、インスタンスを停止することをお勧めします。

ただし、インスタンスを停止するのではなく終了した場合でも、月末にAWSの請求額を拡大できる機能があります。EBSスナップショットです。 これらは、AmazonのSimple Storage Service(S3)に保存されているEBSボリュームの増分バックアップです。 各スナップショットには、以前のデータを使用して新しいEBSボリュームを作成するために必要な情報が含まれています。 インスタンスを終了すると、関連するEBSボリュームは自動的に削除されますが、スナップショットは残ります。 S3は保存されているデータの量に応じて課金されるため、すぐに使用しない場合は、これらのスナップショットを削除することをお勧めします。 AWSは、CloudWatchサービスを使用してボリュームごとのストレージアクティビティを監視する機能を備えています。

  1. AWSコンソールにログインしているときに、左上の[サービス]メニューからCloudWatchサービスを見つけて開きます。
  2. ページの左側の[メトリクス]折りたたみメニューで、[すべてのメトリクス]をクリックします。
  3. このページには、EBS、EC2、S3などの利用可能なメトリックを含むサービスのリストが表示されます。 [ EBS]をクリックしてから、[ボリュームごとのメトリック]をクリックします。 (注: EBSオプションは、アカウントにEBSボリュームが構成されている場合にのみ表示されます。)
  4. [クエリ]タブをクリックします。 エディタビューで、コマンドSELECT AVG(VolumeReadBytes) FROM "AWS/EBS" GROUP BY VolumeIdをコピーして貼り付け、[ファイル名を指定して実行]をクリックします。 (注:CloudWatchは、固有の構文を持つSQLの方言を使用します。)

ウェブページが表示され、ページの上部に濃い青色のヘッダーメニューが表示されます。このメニューには、左から右にawsロゴ、[サービス]ドロップダウン、検索バー、コードアイコン、ベルアイコン、疑問符アイコンが含まれています。 「N.Virginia」と書かれたドロップダウンテキストと「ToptalTestAccount」と書かれたドロップダウンテキスト。その下には、ウェブページの主要部分が白で表示されています。ページの左側には、「CloudWatch」と「X」というタイトルのスクロールメニューがあります。その下のメニューには、「お気に入りと最近」、「ダッシュボード」、「アラーム」(太字で、「アラーム中」、「すべてのアラーム」、「請求」の3つのドロップダウンがあります)、 「ログ」(太字、2つのドロップダウン:「ロググループ」と「ログインサイト」)、「メトリック」(太字、3つのドロップダウン:「すべてのメトリック」、明るいオレンジ色で強調表示、「 「エクスプローラー」、「ストリーム」)、「X線トレース」(太字)、「イベント」(太字)、「アプリケーション監視」(太字)。メニュー内のすべての太字のテキストには、テキストの左側にドロップダウンメニューの三角形があります。 Webページの中央には、ページの上半分にグラフが表示され、ページの下半分にエディターが表示されます。グラフには2行のヘッダーがあります。最初の行は、左側に「CloudWatch> Metrics」(「CloudWatch」のテキストは青色)、右側に「Switch to youroriginalinterface」と表示されています。 2行目は、左側に編集アイコンが付いた「無題のグラフ」と表示され、右側に「1h、3h、12h、1d、3d、1w、カスタム」(「3h」は青、「カスタム」)のオプションが表示されます。カレンダーアイコン)、「行」(ドロップダウンアイコン付き)、「アクション」(ドロップダウンアイコン付き)、およびドロップダウンアイコン付きの更新ボタンがあります。グラフ自体の中央には、「CloudWatchグラフは空です。ここに表示するメトリックスをいくつか選択してください。」というテキストがあります。エディターには2行のヘッダーもあります。最初の行には、左側に「参照」、「クエリ」(オレンジ色で強調表示)、「グラフ化されたメトリック」、「オプション」、「ソース」、「数学の追加」(ドロップダウンアイコン付き)、「追加」と表示されます。右側の「クエリ」(ドロップダウンアイコン付き)。 2行目は、左側に「Metrics Insights-クエリエディター」と「情報」(青色)、右側に「ビルダー」と「エディター」(「エディター」が選択されている)と表示されます。エディタの下には、左側にオレンジ色の[実行]ボタンがあり、右側に「Ctrl + Enterを使用してクエリを実行し、Ctrl+スペースを使用してオートコンプリートする」というテキストがあります。ウェブページの右側には白いメニューがあり、上から下に「クエリ」と「ヘルプ」と表示されます。
上記のCloudWatchモニタリングセットアップの概要(空のデータとメトリックスが選択されていない状態で表示)。 アカウントに既存のEBS、EC2、またはS3インスタンスがある場合、これらはメトリックスオプションとして表示され、CloudWatchグラフに入力されます。

CloudWatchは、円グラフ、線、棒、積み上げ面グラフ、数値など、ストレージアクティビティを分析するためのさまざまな視覚化フォーマットを提供します。 CloudWatchを使用して非アクティブなEBSボリュームとスナップショットを特定することは、クラウドコストを最適化するための簡単なステップです。

あなたのポケットに余分なお金

CloudWatchなどのAWSツールは、クラウドのコストを監視するための適切なソリューションを提供しますが、さまざまな外部プラットフォームがAWSと統合されて、より包括的な分析が可能になります。 たとえば、VMWareのCloudHealthなどのクラウド管理プラットフォームは、傾向分析、異常検出、コストとパフォーマンスの監視に使用できる上位の支出領域の詳細な内訳を示しています。 また、CloudWatch課金アラームを設定して、チャージが過剰になる前にサージを検出することをお勧めします。

Amazonは、サーバー、データベース、ハードウェアのメンテナンス作業をAWSチームに委任するのに役立つ多くの優れたクラウドサービスを提供しています。 クラウドプラットフォームのコストはバグやユーザーエラーのために簡単に増加する可能性がありますが、AWSモニタリングツールは開発者に追加の費用から身を守るための知識を提供します。

これらのコストの最適化を念頭に置いて、プロジェクトを軌道に乗せる準備が整い、その過程で数百ドルを節約できます。

「PARTNER」という単語とその下に「AdvancedTierServices」というテキストが付いたAWSロゴ。
アマゾンパートナーネットワーク(APN)の高度なコンサルティングパートナーとして、Toptalは企業にAWS認定の専門家へのアクセスをオンデマンドで世界中のどこにでも提供します。