Lapis Lazuli

technical blog for web developer

【AWS】ECSの動的ポートマッピングを使う

どうもこんにちは。
最近はECSを使って本番構築しているので、しばらくはその時に学んだ内容を書いていきます。
今回は動的ポートマッピングについてです。

動的ポートマッピングとは

ECSのサービスがホスト側のポートを動的に割当する機能です。
何故これが必要なのかと言いますと・・・
ECSonEC2の場合、1つのインスタンスに複数のサービスが動いていて、それぞれポートを割当すると思います。
その時、重複するポート番号が使えなくて面倒な事になってしまいます。(nginxのコンテナを複数動かしたいけど、80番ポートは1つのコンテナしか使えないなど)
そこでAWSには動的ポートマッピングでは、このポートを動的にして適宜空いているポートを割り振る便利機能なのです。
選択されるポート番号はエフェメラルポート(32768~65535)から選ばれます。
これによって重複を避ける事が出来るのです。

設定方法

全体の流れとしては下記のようになります。

  1. ALBとそれに紐づく空のターゲットグループを作成する
  2. TaskDefinisionのホスト側のポート指定を0に設定する
  3. サービスを新規作成するときに上記のALBとターゲットグループを指定する

以上になります。結構簡単ですね。

ALBとそれに紐づく空のターゲットグループを作成する

既にある場合は作成しなくても良いのですが、ターゲットグループは空にしておく必要があります。
僕は作る時にECS動いているインスタンスを入れてしまいミスしましたw
注意点としてはALBしか対応していないので、もし既存のロードバランサーがCLBだった場合は注意でしょうか。
まぁALBはいくら作っても課金されないので、この際作ってしまいましょう。

TaskDefinisionのホスト側のポート指定を0に設定する

次にサービスで動かすタスク定義です。
portの項目を0にするのが動的にする条件です。僕は間違ってコンテナ側を0してしまいエラー出たのはここだけの話。

サービスを新規作成するときに上記のALBとターゲットグループを指定する

これで条件は揃いました。あとはサービスの作成時に上記のALBとターゲットグループ、そしてタスク定義を指定してあげるだけです。
ちなみにALBとターゲットグループの指定はサービスの新規作成時しか指定出来ません。
なので変更したい時は新しく作成しましょう。


これで設定は完了です。
タスクが立ち上がった後にターゲットグループでポート番号を見てみると、エフェメラルポートが割り当てられているはずです。
AWSがすごいなーと思うのは、こういう面倒な所をマネージドに解決出来る事だと思うんですよね。
仕組みを理解する必要がありますが、一度慣れたら自分でやるなんてちょっと考えられなくなりますね。
では今回はこの辺りで。