よ〜んです。

個人的に、AWS上で何かを動かすときは、

  1. Step Functions で実現可能?
  2. Lambda
  3. ECS(Fargate)

大体こんな感じの思想で選んでいます。

で、とりあえずECSを選択すると立ちはだかるのがALB、ALBは時間課金+通信料がかかります。

個人的な用途なのに、毎月15 USD以上の固定費は正直つらい……

タスクを使う時だけ起動にしても、ALBは起動しっぱなしなので、節約の恩恵がめちゃくちゃ薄いです。

ということで、今回は API Gateway HTTP API をロードバランサーっぽく使ってECSを動かしてみます。

やりたいことはざっくり以下です。

  • API Gateway → VPC Link → Cloud Map(Service Discovery) → ECS(Fargate)

この構成自体は、2020年にAWSアーキテクチャブログで公開された記事をベースに構築していきます。

Field Notes: Integrating HTTP APIs with AWS Cloud Map and Amazon ECS services

AWS Cloud Map とは#

AWS Cloud Map はリソースを検出するサービスです。

ECSのタスクは起動のたびにIPアドレスが変わったりしますが、Cloud Map を使うことで、backend.ecs.local みたいな名前でECSのタスクのIPアドレスを引くことが可能になります。

構築&デプロイ#

CDKで管理します。

コードはこちらにございます。

動作チェック#

API Gatewayのエンドポイントにアクセスしてみます。

アクセスできました。後々の検証のため、レスポンスでIPアドレスを表示させています。

タスク数を2つにしてみます。

IPアドレスが異なっています、ロードバランシングされていることがわかります。

マネコンからCloud Mapを見ると、サービス(backend)にタスクが登録されていました。

コスト#

大阪リージョンでの概算です。

ServiceCost per month
Fargate (0.25 vCPU, 0.5 GB)11.25 USD
Application Load Balancer17.75 USD
ECR1.08 USD
Total30.08 USD

これが、ALBからAPI Gateway + Cloud Mapの構成に移行することで…

ServiceCost per month
Fargate (0.25 vCPU, 0.5 GB)11.25 USD
ECR1.08 USD
API Gateway≒ 0 USD
Cloud Map≒ 0 USD
Route 53 Private Hosted Zone0.50 USD
Total12.83 USD

こうなります、さらに追加でGraviton(Arm)にすると、もっと安くなります。

ServiceCost per month
Fargate (0.25 vCPU, 0.5 GB, Arm)8.99 USD
ECR1.08 USD
API Gateway≒ 0 USD
Cloud Map≒ 0 USD
Route 53 Private Hosted Zone0.50 USD
Total10.57 USD

コストを従来の構成の1/3まで減らすことができで大満足です。

今までも使う時だけタスク起動はやっていましたが、ALBは常時起動なので固定費が残り続けて、節約の恩恵が薄かったんですよね。

この構成だと、その固定費を削げるのでコストをかなり抑えることができました。

私は🉐🉐ケチケチ星人なので、さらに Fargate Spot + 使う時間帯だけ起動 で運用しています。

まとめ#

開発環境や個人で使用する環境であればこれで十分ではないでしょうか

「ECS使いたいけど、ALBのコストが気になる」みたいなときの選択肢として、頭の片隅に置いていただけると嬉しいです。

それではみなさん🉐して良いコンテナライフを