LayerX エンジニアブログ

LayerX の エンジニアブログです。

Amazon ECS と AWS Fargate で動作する「LayerX インボイス」のコスト最適化手法

f:id:shun_tak:20210719111823p:plain

こんにちは!LayerXの高際 (@shun_tak) です!過去にはOCR関連の記事を書きました!

LayerX インボイスのアプリケーション・サーバーはAmazon ECS と AWS Fargateで動作しています。今回の記事ではそのコスト最適化手法について解説したいと思います。よろしくお願いします!

tech.layerx.co.jp

サマリーとしては、LayerX インボイスではオーソドックスに費用の削減タスク数の最適化という2つの方法でコスト最適化を行っています。

  1. Savings PlansとFargate Spotを活用した費用の削減
  2. Auto ScalingとScheduled scalingによるタスク数の最適化

早速次節から解説していきます!

Savings Plansを活用した費用の削減

Fargateは使った分だけ料金が請求されます(vCPU数×メモリサイズ×起動時間)。この料金体系はクラウドの最も優れた特性の一つで、事業がうまくいくかどうか分からなかったり、その負荷の量が読めないときには非常にありがたいです。

しかし、一定の顧客を獲得することに成功し事業が安定してきたならば、1年または3年契約の1時間あたりの利用金額をコミットするSavings Plansを活用することで、さらなる費用の削減を実現できます。

東京リージョンでの削減額は1年全額前払いで22%削減、3年全額前払いで47%削減です(2021年7月18日時点)。また、削減額は減りますが毎月払いも可能です。すごい!参考:Savings Plans 料金

1時間あたりの利用金額での契約なので、定常的に利用する分の利用料に合わせて契約するのが良いようです。LayerX インボイスでは多くの企業が休日となる土日など、タスク数が少ない時間の利用料に合わせて契約しています。

どのくらい契約すればいいのか分からない場合、AWSのマネジメントコンソール内のCost Explorerを見るとちょうどいい購入金額を教えてくれるので、そちらも参考に決定しましょう。

f:id:shun_tak:20210719112203p:plain

(画像はAWS Cost Explorerより引用)

Fargate Spotを活用した費用の削減

LayerX インボイスでは後述するAuto Scalingによるタスク数の最適化を行っていますが、Fargate Spotを活用することでさらなる費用の削減を実現できます。

EC2のスポットインスタンスを活用したことある方ならピンと来たと思いますが、Fargate SpotはAWSの余剰キャパシティを活用してタスクを実行することで、最大70%の割引を受けられます。参考:AWS Fargate 料金

Fargate Spotは余剰キャパシティで稼働しているため、AWSにキャパシティが必要になるとデフォルトで30秒、最大で2分前に警告が送信され、実行中のタスクにSIGTERMシグナルが送信され、アプリケーションが終了します。参考:Fargate Spot 終了通知の処理

LayerX インボイスのアプリケーション・サーバーではREST APIに go-swagger を、ジョブワーカーに go machinery (v1) を利用して実装していますが、それぞれSIGTERMシグナル受信時のGraceful Shutdownに対応しているので、Fargate Spotの終了が通知されても安全にアプリケーションを終了できます。

ただし、すべてのタスクが終了されるとさすがに困るので、一部のタスクは通常のFargateで、残りはFargate Spotで稼働するような構成にしています。

このような設定はECSサービスのキャパシティプロバイダ戦略設定によって調整できます。

以下はECSサービス設定の画面ですが、例えばこの画面のような設定をすることで、5タスクは通常のFargateで起動し、残り全てがFargate Spotで起動するような構成を実現できます。

f:id:shun_tak:20210719112556p:plain

ベースやウェイトの詳しい意味はAmazon ECSのドキュメントをご参照ください。

Auto ScalingとScheduled scalingによるタスク数の最適化

Auto Scalingは多くのサービスで利用されていると思うので詳細は省略しますが、サービスの負荷に応じてタスク数を自動的に増減することで負荷分散をコントロールするとともに、コスト最適化を実現するものです。参考:ECSサービスのAuto Scaling

LayerX インボイスでは、より自動的にタスク数が調整されるターゲット追跡スケーリングポリシーによるAuto Scalingを行っています。

加えて、予測可能な負荷の増減に対応するためのScheduled scalingという仕組みも併用しています。LayerX インボイスでは平日の日中にアクセスが増加することが分かっており、Scheduled scalingにより最小タスク数を増加させるようにしています。

最小タスク数を増やすとコストも増えますが、お客様にご不便をおかけしないよう可用性を高めるために実施しています。これまでコスト削減ではなくコスト最適化という言葉を使ってきたのにはこういう理由もあるのです。

まとめ

本記事では、Savings PlansとFargate Spotを活用した費用の削減、Auto ScalingとScheduled scalingによるタスク数の最適化を組み合わせたコスト最適化手法について解説しました。

コストをうまくコントロールすることは、利益率を高め、ひいてはサービス再投資による顧客の満足につながるものです。基本的な取り組みではありますが、こういったことこそ大切にしていかねばなと思います。

基本に忠実に、製品を磨き、顧客に向き合う。そんな仲間を募集しています。

herp.careers