Traefik を触ってみた話

:

はじめに

この記事はUEC Advent Calendar 2021 7 日目の記事となっています。

6 日目の記事は つまみ(@TrpFrog)さんの徒歩ブログでした。この記事の元となったイベントには私も参加したのでぜひ記事を見てくださいね!

画像がてんこ盛りで大量にダウンロードするので安定した回線で閲覧することを推奨します。

中央環状線+湾岸線を歩いて一周した

Docker

みなさんは Docker 使っていますか? Docker 便利ですよね。

私も色々な目的で使用していますが、今回は時間割サイト1を VPS にホストするために使用した事例を紹介します。

時間割の説明

快適な大学生活を送るためにも手間はなるべく省きたい。

  • 授業ページを閲覧するのにいちいちシラバスを見る
  • Zoom リンクを見るために何かしらのアプリを開く

上の事項を一括で管理したかったと思っていた矢先に時間割の Docker イメージを配布している徒歩バカ人がいました!!!!使うぞ!!!!!

時間割を自宅のサーバに置いても外部からアクセスできない環境にいます。(ドーム友達がいないとも言う) ということで、適当なサーバを借りてホストすることにしました。

Traefik に出会う

適当なサーバに置くからには認証を掛けないといけません。Zoom のリンクや授業資料のパスワードが漏れてしまいます。

友人のネットワークスペシャリスト資格も持っている Docker とか Kubernetes のオタク2に Traefik を教えてもらいました。

Traefik 公式サイト

これはあるサーバに来た HTTP リクエストなどを適切なコンテナに割り振ってくれるソフトウェアです。一言で言えばリバースプロキシです。割り振りのルールはパスやHostヘッダーの内容など、沢山用意されています。

下にtraefikを使用したときのdocker-compose.ymlの例を掲載します。

 1version: '3'
 2
 3services:
 4  traefik:
 5    image: traefik:v2.5.3
 6    ports:
 7      - "80:80"
 8      - "443:443"
 9    volumes:
10      - /var/run/docker.sock:/var/run/docker.sock
11      - /opt/traefik/traefik.yml:/etc/traefik/traefik.yml
12      - /opt/traefik/letsencrypt/acme.json:/letsencrypt/acme.json
13    scale: 1
14
15  traefik-forward-auth:
16    image: thomseddon/traefik-forward-auth:2.2
17    environment:
18      - DEFAULT_PROVIDER=generic-oauth
19      - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://github.com/login/oauth/authorize
20      - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=https://github.com/login/oauth/access_token
21      - PROVIDERS_GENERIC_OAUTH_USER_URL=https://api.github.com/user
22      - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=XXXXXXXXXXXXX
23      - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=XXXXXXXXXXXXX
24      - INSECURE_COOKIE=false # Example assumes no https, do not set true in production
25      - SECRET=XXXXXXXXXXXXXXXXXXX
26      - WHITELIST=mail@example.com
27    labels:
28      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181"
29      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User"
30      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.trustForwardHeader=true"
31      - "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
32  timetable:
33    image: ghcr.io/trpfrog/timetable:latest
34    volumes:
35      - ./timetable-page/src:/usr/share/nginx/html:ro
36    labels:
37      - "traefik.http.routers.timetable.rule=Host(`somedomain.example.com`)"
38      - "traefik.http.routers.timetable.middlewares=traefik-forward-auth"
39      - "traefik.http.routers.timetable.tls.certresolver=myresolver"
40      - "traefik.http.routers.timetable.entrypoints=websecure"
41
42      - "traefik.http.routers.timetable_http.entrypoints=web"
43      - "traefik.http.routers.timetable_http.rule=Host(`somedomain.example.com`)"
44      - "traefik.http.routers.timetable_http.middlewares=timetable_http"
45      - "traefik.http.middlewares.timetable_http.redirectscheme.scheme=https"
46      - "traefik.http.middlewares.timetable_http.redirectscheme.permanent=true"

このようにdockerのlabelとしてtraefikにして欲しいことを記述することでtraefikが交通整理してくれます。

またtraefik ではミドルウェアとして認証機能やその他のコンテナを挟むことが出来ます。説明は公式ドキュメントの図が詳しいです。

そこで今回は以下のイメージを挟んで認証を掛けることにしました。

thomseddon/traefik-forward-auth

このイメージを経由することでGoogle OAuthなどの認証を掛けることができます。今回はGitHubが提供しているOAuthを間に挟みました。これにより機密情報を全世界に公開することを避けることができました。ヤッタネ!

まとめ

Dockerを用いたサービスの提供をしたいならTraefikを使用することをおすすめします。簡単な設定で面倒な交通整理をしてくれます。内容がかなり薄くなってしまいましたが、今回はこの辺りで終了させていただきます。

今回のAdvent Calendarは申し込みが遅れたこともあり本日となりましたが、中間試験が翌日に控えていて非常によろしくないですね。

次の人

UEC Advent Calendar 2021 8日目の担当は Mr.Mountain さんの『身の上話と、メンタルヘルスについて』です。記事が投稿され次第リンクを貼ります。

それでは。

参考


  1. UEC Advent Calendar 2021 6 日目の記事を書いたつまみさんが作成した時間割 ↩︎

  2. ごっちさん Twitter UEC Advent Calendar 2021 の 18 日目担当 ↩︎