Contents
Traefik v3とDocker Swarmの統合設定概要
Traefik v3は、Dockerエコシステムとの連携を強化し、動的リバースプロキシとしての性能が向上しています。特に自動証明書発行機能やルーティング制御の柔軟性は、クラウド環境でのセキュアな構築に不可欠です。本記事では、Traefik v3をDocker Swarm環境で導入し、Let's Encryptを通じてワイルドカード証明書を自動取得する方法を解説します。
Traefik v3のDocker Swarm環境構築手順
Docker SwarmにおけるTraefikの導入には、ネットワーク設定とサービススコープの設計が重要です。以下に基本的な手順をまとめます。
基本的な設定ファイル作成
Traefikの設定はswarm-stack.ymlで定義します。主な構成要素は以下の通りです。
- ネットワーク:
traefik-netのような専用ネットワークを作成し、Traefikと他のサービスが通信できるようにする - サービススコープ:
--endpoint-replication=1で単一ノードでの実行を指定し、負荷分散を簡略化。この設定はDocker Swarmにおいて「レプリケーション数」を1に固定し、複数ノードへのデプロイを避けるためのオプションです
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
version: '3.8' services: traefik: image: traefik:v3.9 ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/traefik/certs networks: - traefik-net |
Docker Swarmクラスタの初期化
以下を実行し、Swarmモードを有効にします。
|
1 2 |
docker swarm init --advertise-addr <管理ノードIP> |
注意: 初期化後は、
docker node lsでクラスタ状況を確認してください。
Traefikサービスのデプロイ
docker stack deployコマンドでTraefikをデプロイします。
|
1 2 |
docker stack deploy -c swarm-stack.yml traefik |
Let's Encryptとの連携とACMEプロトコル概要
Let's Encryptは、ACMEプロトコルを通じて証明書を自動発行します。TraefikではHTTPチャレンジとDNSチャレンジの2種類が利用可能です。
ACMEプロトコルの動作フロー
- アカウント登録: Let's EncryptにユーザーID(メールアドレス)で登録
- チャレンジ実施: HTTPまたはDNSで証明を確認
- 証明書発行: 成功すると証明書が取得され、自動的に更新される
| チャレンジタイプ | 対応可能環境 | 有効期限 | 操作性 |
|---|---|---|---|
| HTTPチャレンジ | 通常のWebサーバー | 90日 | 簡単で初期設定に適する |
| DNSチャレンジ | ドメイン管理権を持つ環境 | 90日 | ウェブサーバー不要だが、DNSプロバイダーとの連携が必要 |
TraefikでのACMEハンドリングメカニズム
Traefik v3ではacme@fileを用いて証明書管理が可能です。以下に基本的な設定例を示します。
|
1 2 3 4 5 6 |
[certificatesResolvers.myresolver.acme] email = "[メールアドレス削除]" storage = "acme.json" [certificatesResolvers.myresolver.acme.httpChallenge] entryPoint = "web" |
DNSチャレンジによるワイルドカード証明書の自動取得
DNSチャレンジでは、CloudflareなどのDNSプロバイダーと連携してCNAMEレコードを自動生成します。以下にCloudflareの設定手順を示します。
Cloudflare API連携設定例
- APIトークン作成: Cloudflareダッシュボードで「API Tokens」から「Edit DNS Zone」権限を持つトークンを作成
- Traefik設定ファイル更新: DNSプロバイダーの種類(Cloudflare)と認証情報を記述
|
1 2 3 4 5 6 7 8 |
[certificatesResolvers.myresolver.acme.dnsChallenge] provider = "cloudflare" [certificatesResolvers.myresolver.acme.dnsChallenge.resolver] endpoint = "https://api.cloudflare.com/client/v4/zones" headers = { "Authorization" = "Bearer <APIトークン>" } |
注意: APIトークンはセキュリティリスクが高いため、環境変数やDocker Secretsを用いて管理し、設定ファイルに直接記載しないようご注意ください。
証明書自動取得と更新の仕組み
Traefikは証明書有効期限が残り1週間前から自動更新を開始します。acme.jsonファイルに設定内容が保存されるため、クラスタの再構築時でも情報を保持できます。
証明書自動更新機能の検証とトラブルシューティング
証明書自動更新は、セキュリティを維持する上で不可欠です。以下に確認手順と対処法を解説します。
証明書更新確認手順
- traefik.logの確認:
docker logs traefikで証明書取得・更新のログを確認 - curlコマンドによる検証:
|
1 2 |
curl -v https://example.com |
- 証明書有効期限チェック:
|
1 2 |
openssl x509 -in /etc/traefik/certs/example.com.pem -text -noout | grep "Not After" |
レート制限対策設定
Let's Encryptは1時間あたりのリクエスト数を制限しているため、以下のようにレート制限を回避する設定が必要です。
|
1 2 3 |
[certificatesResolvers.myresolver.acme] retry = true |
エラーログの解釈ガイド
| エラー内容 | 対処法 |
|---|---|
DNS propagation timeout |
DNSレコードが反映されるまで待機し、再実行する |
rate limited by Let's Encrypt |
証明書取得間隔を延長(retry = trueの設定) |
invalid domain |
ドメイン名に誤字がないか確認し、再登録 |
Traefik v3によるセキュアなDocker Swarm環境構築のポイントまとめ
Traefik v3とDocker Swarmを組み合わせた環境では、以下のようなベストプラクティスが重要です。
- 設定ファイルの明確化:
swarm-stack.ymlにルールを統一し、各サービスのルーティング情報を一元管理 - ネットワークセグメント分離: Traefik専用ネットワークとアプリケーションネットワークを別途作成
- 冗長性設計: 複数ノードでのTraefik展開を検討し、単点障害を回避
本記事を参考に環境構築を行い、コメント欄で設定時の課題を共有してみましょう。