stks56's tech blog

Keep it simple, stupid.

ECSでEC2インスタンスを選択する場合はEC2インスタンスタイプに配慮すること

ECSではFargateとEC2の二つの起動タイプがある。

FaegateはともかくとしてEC2を選択する場合はEC2インスタンスタイプのCPU及びメモリといったリソースを十分考慮しながら設計する必要がある。

ECSではタスク定義で動かすコンテナが使えるメモリを割り当てられるが(ハード/ソフト制限)、ここで定義されるリソースはEC2インスタンスのリソースの範囲を超えてはならない。

こちらはAWS EC2インスタンスタイプの一例である。 f:id:stks56:20190525184102p:plain

今回は無料枠で使えるt2.microインスタンスタイプで説明する。

t2.microインスタンスタイプはメモリが1GiBである(1GiB = 1024MiB)

つまりコンテナには1024MiBを超えるメモリを割くことができない。

じゃあ1024MiB割り当てればいいと思うかもしれないが、ローリングアップデートの事も考えなければならない。

ローリングアップデートでは2つのタスクが共存する瞬間があるのでその間2倍のメモリを使うことになる。

なので二分の一で512MiG割り当てればいいと思うかもしれないがこれも違く、ギリギリのメモリリソースでタスクを実行しようとすると、安定せずデプロイが失敗する可能性がある。

なのである程度余裕を持たせて設計する必要がある。

自分はt2.microインスタンスに300MiGのコンテナを割り当てることでデプロイが安定した。

t2.microインスタンス(1024MiG) > コンテナ(300MiG) + ローリングアップデート用のコンテナ(300MiG) + 余白

これのタチの悪いところはわかりやすくアナウンスされないところだ。

run task cli を叩いてもRESOURCE:MEMORYしかアナウンスされずどこのメモリが足りないかわからなかった。