4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RailsプロジェクトをAWS ECS(ALBあり)で動的ポートマッピングした上で、IP制限をかけたい

Last updated at Posted at 2019-10-22

やりたいこと

そのままではあるが

  • Dockerでアプリケーションを起動するのだが、複数のタスクを起動するため、動的ポートマッピングを導入したかったので、その設定
  • ただし、社内のアプリケーションのため、IP制限をコストかけずにかけたい

前提

  • ECSで、railsアプリケーション、リバースプロキシのnginxをデプロイしている
  • ALBで、リバースプロキシのnginxをターゲットグループに登録している
  • nginxからrailsアプリケーションのpumaソケットにupstreamディレクティブを定義

やりたくないこと

以下は、docker化しており、GitHub上のデータを変更してしまうので、事情により却下

  • nginx.confやpuma.rbなどのファイルを変更すること
  • 新たにosへパッケージをインストールすること

動的ポートマッピングの設定

タスクの該当設定部分のjsonを抜き出した。

複数のタスクが存在するので、そのどちらにもその設定をする。

{
  "containerDefinitions": [
    {
      "portMappings": [
        {
          "hostPort": 0,
          "protocol": "tcp",
          "containerPort": 80
        }
      ],
    }
  ],
  "networkMode": "bridge"
}
プロパティ1 プロパティ2 プロパティ3
containerDefinitions portMappings hostPort 0
containerDefinitions portMappings protocol tcp
containerDefinitions portMappings containerPort 80
networkMode bridge

bridge ネットワークモードでタスク内のコンテナを使用する場合、予約されていないホストポートをコンテナポートマッピングに指定できます。または、containerPort の指定時に hostPort を省略 (または 0 に設定) することもできます。後者の場合、コンテナインスタンスのオペレーティングシステムと Docker バージョンに、一時ポート範囲のポートが自動的に割り当てられます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinitions-portmappings.html

こちらのHostPortにあるようにタスクの設定をしてやる。

動的ポートマッピングによる挙動の変化

  • 自動的にhost portが決定する
  • 決定したportをALBのターゲットグループに登録する
  • ALB自体がおかしくなった場合、dockerプロセスが再起動し、host portが変わり、そのportがALBに登録される(↓実際にポートが入れ替わったらこんな感じで自動的に変更される) スクリーンショット 2019-10-22 19.05.11.png

IP制限をコストをかけずかける

  • AWS WAFを利用すれば、簡単にできるのだが、1ACLに付き1ドルかかるということで、そこをケチることにした

ALB自体に設定を加える

前提

ALBのリスナーには、既に80ポートへの設定がある

  1. ルールの表示/編集をクリック
  2. 1つ目
    1. IFに送信元IPを設定する。ここには、複数のIPを設定可能(これが単数だったら要件外だった)
    2. THENに転送先でターゲットグループを指定する
  3. 2つ目
    1. IFに全てに一致(要は、指定IP以外のことになる)
    2. THENに固定レスポンスを返す
      1. レスポンスコードを404とか403とかにする
      2. Content-Typeをtext/htmlにする
      3. レスポンス本文を<h1>Not Founct</h1>にする

セキュリティグループの設定

最後に、動的ポートマッピングの設定をセキュリティグループに加えてやる。

  • これは、エファメラルポートを設定する形 Linuxは 32768-61000がデフォルトの範囲

Also note that the Linux 2.4 kernel will default the range of 32768 through 61000 if adequate kernel memory is available, so changing the range may not be necessary on newer Linux systems.
https://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html#Linux

最後に

Railsはあまり関係なかった。
AWS ECS(ALBあり)で動的ポートマッピングした上で、IP制限をかけたかったが、まとまった記事がなかったので、まとめた。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?