Fargate のメモ
Fargate
AWS で簡単に Docker コンテナを動かせるサービス。
ただし、独自の概念が多く、慣れる必要がある。
筆者は以前に導入を試みて、挫折した。今日(2020/03/23)試してみたら、ドキュメントが良くなったのか、オンボーディングが良くなったのか、意外とすんなり理解できたので、記録しておく
なぜ Fargate なのか
前提として
- PV 換算すると 月20万PVほどのアクセスのWebサービスを運用している
- インフラエンジニアが不在なので、あまり煩わしい作業はしたくない
- かといって、 EC2 はプロビジョニングとか面倒だし、ElasticBeanstalk はデプロイに時間かかるし小回りが効かない(経験談)
- とりあえず動けばOKなサービスに適用する(本サービスではなく、LP + アルファな感じ。Next.js利用)
AWS には EKS など魅力的なサービスがあるが、意外と高い。コントロールパネルを動かしているだけで、15000円くらいかかるらしい(と、AWS の方に言われた)
さくっとサービス動かすだけなら、 Fargate の方が簡単で安いらしい(と、AWS の方に言われた)
値下げされたのも大きい。
EKS でも、 EKS + Fargate とかあるので、どうせならシンプルな方にしたい。
ので、再入門した。
独自概念の説明
登場人物は4人。
- Cluster
- Service
- Task
- Task Definition
- Elastic Container Registry (ECR)
色々あって戸惑うが、このうち、 Service と Task Definition だけ考えれば良い(多分)
Task Definition
多分これが大事で、 Task Definition は Docker Image の定義だと考えれば良い。 Docker Image だけで完結できれば楽なのだが、バージョニングとかの関係でこうなっていると思う。
オブジェクト指向的に考えると、 Task Definition はクラス、 Task はクラスのインスタンス、である。
AWS EC2的に考えると、 Task Definition は AMI、Task はEC2 Instance、 である。
Service
基本的には、 Task Definition を定義して、 Service にその Task Definition を適用する。
Task Definition を Service に適用すると、 Task が作成される。つまり、 Private/PublicIP アドレスなどは Task に割り当てられる。
ECR
ECR はただ Docker Image をプッシュするだけなので、特に難しいことは一切ない。ログインが必要なくらいだが、 「View push commands」 押せば難しいことはない。
運用
今回は、導入なので、非常に簡単な Web API をデプロイしてみることにした。具体的には下記。
require('http')
.createServer((req, res) => {
console.log(req.headers)
res.end('ok')
})
.listen(3000)
FROM node:12.16.1-alpine
WORKDIR /app
ADD app.js /app
CMD node app.js
環境構築
Cluster + Service を作成し、 Task Definition を定義して、 ALB や Route 53 の設定をすれば、意外と素直に動いてくれる。
なお、Task に割り当てられた Public IP address を叩いても、動く。 Fargate 公式デモの Nginx のクラスタも、この方式で動く。 ALB の設定等で、時間を取らせたくないのだろう。
特に設定しなくても、ログが管理コンソール上で見れるのは嬉しい。
デプロイ
デプロイに若干はまった。
はまりどころとしては、イメージの更新がある。
まず、 ECR に新しい Docker Image をプッシュする。
次に、 Task Definition を update して、 Docker Image を更新する。ここまでは良い。
次に、単純に考えると、 Task を新しい Task Definition に Update と思うが、実際には Task ではなく Service をアップデートする 。多分、一度作成した Task は更新できないようになっているのだろう。 Immutable Infrastructure 的な。
管理コンソールでは、 Service を Update しようとすると下記のような画面が出てくるので、 Task Definition を最新にすれば良い。
これで Service を更新すると、自動的に新しい Task Definition を搭載した Task が作成され、デプロイされる。
今後
管理コンソールでサービス起動/更新するのは、割と簡単にできたが、以下の4点を調べる必要があるので、引き続き調査していく。
-
- Terraform で、どこまで/どうやって管理するのか。 ecs-cli との棲み分けは?
-
- 自動的なデプロイの仕組み。多分、上記で手動でやった
ECR にプッシュ → Task Definitionのバージョン作成 → Serviceの更新
という流れは変わらないと思われるので、 ecs-cli でやればいけそう。
- 自動的なデプロイの仕組み。多分、上記で手動でやった
-
- Private IP Address が毎回変わるだが、これは固定する もしくは ALB Target Group に Fargate の Task を指定する方法はあるのだろうか・・・? Terraform なら設定できるのか、最悪 CLI で都度設定するか・・・