CX事業部@大阪の岩田です。
8/9付のアップデートでECS on Fargateのタスク定義で指定可能なパラメータが増えました
今回のアップデートで指定可能になったパラメータは以下の2つです。
本ブログでは上記アップデートのうちsystemControlsについてご紹介します。
systemControlsとは
ECSのタスク定義ではsystemControlsというパラメータが指定可能です。このパラメータはdocker run の --sysctl
オプションに相当し、Linuxカーネルの各種カーネルパラメータが設定できるパラメータとなっています。従来このパラメータはECS on Fargateでは指定できず、ECS on EC2かつOSタイプがLinuxの場合のみ指定可能でした。
指定可能なカーネルパラメータ
SystemControlesはなんでもかんでも指定可能というわけではなく、現時点では以下のパラメータのみ指定可能となっています。
- kernel.msgmax
- kernel.msgmnb
- kernel.msgmni
- kernel.sem
- kernel.shmall
- kernel.shmmax
- kernel.shmmni
- kernel.shm_rmid_forced
- fs.mqueue.*
- net.*
ユースケースとして多いのはnet配下のパラメータを調整したいというケースでしょう。
- ECS上で動作するnginxなどのミドルウェアのパフォーマンスをチューニングしたい
- ECS上で動作するアプリケーションをAuroraのフェールオーバーに高速に追従させたい
といったユースケースが考えられます
やってみる
実際にタスク定義でsystemControlesを指定してカーネルパラメータが変更されることを確認していきます
systemControles指定無し
まずはsystemControles指定無しでタスクを起動してカーネルパラメータを確認してみます。
詳細は割愛しますが、タスク定義はこんな感じです。nginxのコンテナを起動するだけのシンプルなタスク定義です。
{
...略
"containerDefinitions": [
{
"name": "nginx",
"image": "public.ecr.aws/nginx/nginx:1.24-alpine",
...略
}
],
...略
}
タスクが起動できたらECS Execでnginxのコンテナに乗り込みます
$ aws ecs execute-command \
--cluster <クラスタ名> \
--task <タスクID> \
--container nginx \
--interactive \
--command "/bin/sh"
sysctl -aを叩いてtcp_keepalive関連のカーネルパラメータを確認してみます
/ # sysctl -a 2>/dev/null | grep net.ipv4.tcp_keepalive
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
systemControles指定無しだとカーネルパラメータは以下の通りでした
- net.ipv4.tcp_keepalive_intvl = 75
- net.ipv4.tcp_keepalive_probes = 9
- net.ipv4.tcp_keepalive_time = 7200
systemControles指定あり
続いてタスク定義でsystemControlesを指定してみましょう。タスク定義にsystemControlsの指定を追加し、tcp_keepalive関連のパラメータを設定していみます。ちなみにこれらのカーネルパラメータはAurora PostgreSQL利用時のベストプラクティスとして紹介されているパラメータです。
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.BestPractices.FastFailover.html#AuroraPostgreSQL.BestPractices.FastFailover.TCPKeepalives
{
...略
"containerDefinitions": [
{
"name": "nginx",
"image": "public.ecr.aws/nginx/nginx:1.24-alpine",
...略
"systemControls": [
{
"namespace": "net.ipv4.tcp_keepalive_intvl",
"value": "1"
},
{
"namespace": "net.ipv4.tcp_keepalive_probes",
"value": "5"
},
{
"namespace": "net.ipv4.tcp_keepalive_time",
"value": "1"
}
]
}
],
...略
}
先程と同様にsysctl -aを叩いてtcp_keepalive関連のカーネルパラメータを確認してみます
/ # sysctl -a 2>/dev/null | grep net.ipv4.tcp_keepalive
net.ipv4.tcp_keepalive_intvl = 1
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1
タスク定義のsystemControlsで指定したパラメータが反映されていることが確認できました!
まとめ
ECS on Fargateでカーネルパラメータが調整できるようになったことを確認してみました。このアップデートによって、ECS on Fargateがより痒いところに手が届く存在になったのではないでしょうか。ECS on Fargateでアプリを動かしているけど、Auroraのベストプラクティスに沿った設定ができない...といったお悩みを抱えていた方は是非導入を検討してみて下さい。