やりたいこと
そのままではあるが
- 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に登録される(↓実際にポートが入れ替わったらこんな感じで自動的に変更される)
IP制限をコストをかけずかける
- AWS WAFを利用すれば、簡単にできるのだが、1ACLに付き1ドルかかるということで、そこをケチることにした
ALB自体に設定を加える
前提
ALBのリスナーには、既に80ポートへの設定がある
- ルールの表示/編集をクリック
- 1つ目
3. IFに送信元IPを設定する。ここには、複数のIPを設定可能(これが単数だったら要件外だった)
3. THENに転送先でターゲットグループを指定する - 2つ目
5. IFに全てに一致(要は、指定IP以外のことになる)
6. THENに固定レスポンスを返す
7. レスポンスコードを404
とか403
とかにする
8. Content-Typeをtext/html
にする
9. レスポンス本文を<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制限をかけたかったが、まとまった記事がなかったので、まとめた。