Rso's Jotter

日々の開発の知見のメモやその他雑記

AWS ECS奮闘メモ

ECS奮闘メモ

社内の案件管理システムをアップデートする際に、AWS ECSを使う構成に変更してみました。 もともとコンテナはDocker開発環境単体で動かすぐらいしかしていなかったので、本番でコンテナを動かすのは初めての試みでした。

本番で動かすためのDockerfileの書き方もロクにわかっていない状態からスタートして、個人的にハマったポイントを残しておきます。

ECS選定理由

コンテナのオーケストレーションサービスとして色々候補があると思いました、今回はECSを採用しました。その理由としては、

  • 基本的に社内のサービスはAWSで動いている
  • Kubernetes よりも学習コストが低そう
  • インフラ構築も片手間で行うので、そこまで時間はかけられない

という感じでした。Kubernetesもやってみたかったんですが、まずは敷居の低そうなECSを選択しました(その結果、いろいろハマりましたが・・) また別にコンテナ化しなくても、HerokuなどのPaaSに載せてしまうてもあったのですが、今回のプロダクトがサーバ間でEFSのような共有ストレージをマウントする必要があったので、その辺りをHerokuでやろうとするそれはそれで構築が面倒かなと思い、選択しませんでした。

ECSハマりポイント

ECSについてドキュメントも流し読み状態で始めたので、作業してから気づく点が色々ありました。その中でハマりポイントを残しておきます。

Fargate で EFSマウントができない。

AWS公式に以下のようにECSでEFSマウントするチュートリアルが載っていたので、できるものかと思ってFargateで構築を進めていました。

チュートリアル: Amazon ECS での Amazon EFS ファイルシステムの使用 - Amazon Elastic Container Service

ALBからFargateコンテナへのロードバランシングが終わったタイミングで、EFSマウント方法を調べていたら、 以下の記事を見つけ、なんとFargateはEFSマウントする術がないことを知りました・・ (公式での記述は見つけられませんでした)

https://forums.aws.amazon.com/thread.jspa?messageID=816397&tstart=0

そこでFargateでのコンテナを動かすのは諦めて、従来のEC2インスタンス場で動くコンテナで再構築しました。

ネットワークの種別が awsvpc だと外のネットワークにアウトバウンド通信できない

Fargateで作成したコンテナと同様にデプロイ完了して疎通してみると途中でなぜか上手く動かない状態でした。 よくよく調べるとコンテナから外のネットワークに出ようとする処理のところで詰まっていることが分かりました。

こちらの現象については、 コンテナのネットワーク種別がデフォルトで awsvpc になっているのですが、この状態だと 外へのアクセスができないとのことでした。

タスクネットワーキングと awsvpc ネットワークモード - Amazon Elastic Container Service

対策としては、以下の2つがあります。

  • NATゲートウェイを構築する。
  • ネットワーク種別を bridge にする。

NATゲートウェイを構築してもよかったのですが、手っ取り早いネットワーク種別を bridge に変更して対応しました。

コンテナデプロイ時にポートが競合してデプロイできない

コンテナが無事動いて、バージョンの異なるコンテナをリリースしたら、すでにポートが使用されているためデプロイできないというエラーが 遭遇しました。

タスクを終了させればデプロイできますが、このままだとダウンタイムが発生してしまいまいます。

対策としてはロードバランサが割り振りするポートを動的に設定してやれば解消しました。

ECS の動的ポートマッピングをセットアップする

ECS使ってみての所感

コンテナオーケストレーションツールをロクに触っていない状態で色々試しましたが、なんとか動くようになるまで 結構時間を食ってしまいました。上記のハマりポイント以外の所感としては、

  • 従来のECSとFargateの制約の違いが把握しづらい。Qiita系のドキュメントやAWS チュートリアルも従来のECSの物が多いが、Fargateに関する情報が見つかりづらかった。
  • VPCの仕組みなど、既存の設定が流用できるのは強みだが、その仕組みを理解していないと、キャッチアップに時間を取られる。
  • そもそもの前段の話で、本番向けのDockerfileとタスク定義を作るためのベストプラクティスがわからず、色々悩んでしまった。

慣れてしまえばあとあと便利になると思いますが、まだ慣れていないのでそこまで便利感の享受をできていない状態です。 コンテナオーケストレーションすごい便利!と早く言えるようになりたいですね。