AWS × Docker × Spring Boot × PostgreSQL の TCP KeepAlive 設定完全ガイド
AWS環境でSpring Boot(Java)とPostgreSQLをDockerで運用していると、**「タイムアウトで接続が切れる」「アプリが不安定になる」**といった問題が発生することがあります。
その原因の一つが、TCP接続がアイドル状態で切断されてしまうことです。
本記事では、その対策として有効な TCP KeepAlive の設定方法 を、以下の4レイヤーに分けて解説します。
設定すべき4つのレイヤー
レイヤー | 内容 |
---|---|
OS(ホスト) | TCP KeepAliveのカーネルパラメータ設定 |
Docker コンテナ | sysctlによるコンテナ内の設定 |
Javaアプリ | JDBC URLでKeepAliveを有効にする |
PostgreSQL側 | サーバーのKeepAliveパラメータ設定 |
1. ホストOS(EC2など)での設定
LinuxカーネルのTCP KeepAlive設定を変更します。
/etc/sysctl.conf
に追記:
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5
設定を反映:
sudo sysctl -p
2. Dockerコンテナの設定
Docker Compose で sysctl の値をコンテナに渡すことができます。
docker-compose.yml
の例:
services:
app:
image: my-springboot-app
sysctls:
- net.ipv4.tcp_keepalive_time=60
- net.ipv4.tcp_keepalive_intvl=10
- net.ipv4.tcp_keepalive_probes=5
一部の環境では
cap_add: SYS_ADMIN
やprivileged: true
が必要になることがあります。
3. Javaアプリ(Spring Boot)での設定
PostgreSQL JDBCドライバは、URLに tcpKeepAlive=true
を指定することで、TCP KeepAliveを有効化できます。
application.properties
の設定例:
spring.datasource.url=jdbc:postgresql://your-db-host:5432/yourdb?tcpKeepAlive=true
spring.datasource.username=your-username
spring.datasource.password=your-password
application.yml
の場合:
spring:
datasource:
url: jdbc:postgresql://your-db-host:5432/yourdb?tcpKeepAlive=true
username: your-username
password: your-password
4. PostgreSQLサーバーの設定
PostgreSQLでも接続維持のためのパラメータが用意されています。
postgresql.conf
の例:
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 5
注意:AWS RDS や Aurora PostgreSQL を利用している場合は、パラメータグループでの設定が必要です。RDS コンソールから該当インスタンスのパラメータグループを編集してください。
AWSでの追加考慮事項
- セキュリティグループの設定:長時間接続があっても遮断されないように、セキュリティグループでタイムアウトやポート制限を確認しておきましょう。
-
RDSのパラメータグループ:上記のPostgreSQL設定は、RDSでは
DBパラメータグループ
で管理します。編集後はRDSの再起動が必要です。
まとめ
TCP KeepAlive を正しく設定することで、以下のようなメリットがあります。
- コネクションが不意に切れる問題の防止
- コネクションプールの安定運用
- ネットワーク障害時の早期検知
各レイヤーでしっかりと設定を行い、安定した通信を確保しましょう。