お試しで立ててみた Vault の HTTPS を Traefik でスルーさせたい。
前回の記事(【2020年1月版】Traefik 2.0 で Docker-Compose の"80"ポートを交通整理)で、Traefik 使っていろいろサービスを立てられるようになりましたので Concourse CI もローカルで試してみたのですが、git のキーをパイプラインに直書きするのは気に入らないので Vault との連携を試してみました。
Concourse と Vault の連携は Example の手順でおおよそ上手くできたのですが、一点だけ違うのが私の環境では Concourse と Vaultの間に Traefikがいるんですよね。
Vault は初モノなので、できるだけ Concourse の Exampleの手順通りにコトを済ませたいのですが…
状況の整理
Concourse CIのExampleの手順は認証に"クライアント証明書"を使うやり方式です。
SSL証明書の発行に certstrap を使って、Vaultのコンテナ側にSSL証明書を入れております。
このSSL証明書からConcourse CI用の証明書を発行してもらって、Concourseの認証をする、というような連携となっております。
Treafik の一般的な使い方としては Traefik でTLSしてTraefikの内側はすっぴんのHTTP通信、となります。(この方式ではクライアント証明書での認証、使えないんじゃないかな…?)
これを調整しだすと結構かかりそうなので、"Concourseのパイプラインでキーを指定して git にアクセスする"、というのを先行して疎通確認するために、このままの設定で行ってみようかというのが今回のキモなわけです。
つまり、Traefikの内側ですでにTLS入っている状況で、これをスルーできるのか、という点ですね。
いろいろやってみた結果。
以下の公式ガイドの箇所にちょっとあるのですが・・・
ここの "Configuring passthrough" という項目があるので開いてみると…
## Dynamic configuration
tcp:
routers:
Router-1:
rule: "HostSNI(`foo-domain`)"
service: service-id
tls:
passthrough: true
tls.passthrough: true
ができるようです。
というわけで Vault の docker-compose.yml では以下のようなラベルを追加すればOKでした。
vault:
image: vault
cap_add:
- IPC_LOCK
command:
- server
expose:
- 8200
networks:
- web
volumes:
- ./vault-certs:/vault/certs
- ./vault-config/local.json:/vault/config/local.json
labels:
traefik.enable: true
traefik.host: "vault"
traefik.tcp.routers.vault.rule: HostSNI(`vault.192.168.1.50.nip.io`)
traefik.tcp.routers.vault.service: vault
traefik.tcp.routers.vault.entrypoints: https
traefik.tcp.routers.vault.tls: ""
traefik.tcp.routers.vault.tls.passthrough : true
traefik.tcp.services.vault.loadbalancer.server.port: 8200
traefik.docker.network: traefik_web
また、traefik 側でhttps
のエントリーポイントも忘れずに追加をお願いします。
...
entryPoints:
http:
address: ":80"
https:
address: ":443"
...
以上でOKです!
しかし、traefik のドキュメントは肝心なところが collapsedな場合が多くて要注意ですね。。。