砂漠の旅人(たびと)|新天地:たびとの旅路

電脳砂漠を旅する、ある旅人の日記。フロッピーを頼りに歩いた日から、クラウドの地平を見つめる今日まで。見つけたオアシスも、迷い込んだ砂の迷宮も、全てこの羊皮紙に。

鉄壁の門番を配置せよ ~Nginxリバースプロキシで護る、gRPCのゴーレム~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

前回の旅で、我々はDockerという名の器に、gRPCサーバというゴーレムの魂を封じ込めた。しかし、そのゴーレムはまだ、無防備なまま砂漠に佇んでいる。真に頼れる相棒とするには、その前に立ち、あらゆる来訪者を選別する、Nginxという名の「鉄壁の門番」が必要だ。

今回は、前回召喚したgRPCのゴーレムの前に、Nginxをリバースプロキシとして配置する。これにより、我々のゴーレムは、HTTP/2という光の道を安全に行き来できるようになるのだ。これは、ただのゴーレムを、堅牢な城塞に守られた真の守護神へと進化させる、高度な錬金術の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • gRPCという名のゴーレムを、より堅牢な城塞で護りたいと願う者
  • Nginxをリバースプロキシとして配置し、HTTP/2通信を安全に中継する術を知りたい探求者

儀式の準備:門番の設計図を追加する

前回のgRPCの資産に、門番(Nginx)のための設計図を追加する。 webという名の新たな区画を設け、そこに門番の魂の設計図であるDockerfileと、その行動規範を記したdefault.confを配置する。

ゴーレムの隣に、門番のための区画を設ける

第一の儀式:世界の契約書を書き換える(docker-compose.yml)

docker-compose.ymlという名の世界の契約書に、門番(Nginx)の存在を追記する。 ゴーレム(app)と門番(web)が、互いに依存し、連携して動くよう、ここに力強く宣言するのだ。

version: '3.8'
services:
  # gRPC (ASP.NET Core)
  app:
    container_name: 'greeter'
    build:
      context: ./src
      dockerfile: Dockerfile
    ports:
      - "5094:80"
      - "7094:443"
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./ssl_greeter.crt:/etc/ssl/certs/ssl_greeter.crt
      - ./ssl_greeter.key:/etc/ssl/private/ssl_greeter.key
    tty: true
    restart: always
    stdin_open: true

  # Web (Nginx)
  web:
    container_name: 'nginx'
    build: ./web
    ports:
      - "5011:80"
      - "7011:443"
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./ssl_greeter.crt:/etc/ssl/certs/ssl_greeter.crt
      - ./ssl_greeter.key:/etc/ssl/private/ssl_greeter.key
    tty: true
    restart: always
    depends_on:
      - app

第二の儀式:門番の魂を定義する

Dockerfile

門番の魂には、軽量にして高速なAlpine版Nginxを選ぶ。

FROM nginx:alpine
# ENV TZ Asia/Tokyo

default.conf:門番の行動規範

これが、門番の行動原理を記した、最も重要な古文書だ。 upstreamで、背後に控えるゴーレムの居場所を教え、locationで、どんな来訪者をゴーレムへ通すかを厳密に定義する。

# gRPCゴーレムの居場所
upstream grpc_service_servers {
    server greeter:80;
}
# SSLで武装したgRPCゴーレムの居場所
upstream grpcs_service_servers {
    server greeter:443;
}

server {
    # 通常の来訪者には、歓迎の門(Welcomeページ)を見せる
    listen 80;
    # gRPCの呪文を唱える者だけを、魔法の門へ通す
    listen 443 ssl http2;

    # ...(証明書の設定など)...

    # 「/greet.Greeter」という合言葉を唱えた者を、ゴーレムの元へ導く
    location /greet.Greeter {
        grpc_pass grpc://grpc_service_servers;
    }

    # 「/greet.Greeter.SSL」という、より厳格な合言葉を唱えた者を、
    # SSLで武装したゴーレムの元へ導く
    location /greet.Greeter.SSL {
        grpc_pass grpcs://grpcs_service_servers;
    }
}

最終儀式:城塞の起動と確認

全ての設計図が揃ったら、docker-compose buildで魂を錬成し、docker-compose up -dで城塞を起動する。 docker psで、ゴーレムと門番が、共に力強く稼働していることを確認する。

$ docker ps
CONTAINER ID   IMAGE         COMMAND                  ...   NAMES
b79b5edfb252   greeter-web   "/docker-entrypoint.…"   ...   nginx
87c0bb4a8d40   greeter-app   "dotnet GrpcGreeter.…"   ...   greeter

二つの魂が、それぞれの役割を果たしている。これこそが、城塞が正常に稼働している何よりの証拠だ。

ブラウザでhttp://localhost:5011を訪れ、門番が掲げる歓迎のページが表示されれば、儀式は成功だ。

鉄壁の門番が、我々を歓迎している

gRPCクライアントからは、門番の魔法の門(https://localhost:7011)を通して、安全にゴーレムと対話することができる。

羊皮紙を巻く前に

前回の旅で召喚したgRPCのゴーレムに、Nginxという鉄壁の門番を追加する儀式は、想像以上にスムーズなものだった。 これで、我々のゴーレムは、ただのむき出しの魂ではなく、堅牢な城塞に守られた、真の守護神へと進化した。

次の旅では、この城塞にDBサーバという名の「宝物庫」を加え、フロントエンドとバックエンドを分離した、より本格的な魔法体系を構築していこうと思う。

この羊皮紙が、同じように自らのゴーレムを、より強固な存在へと進化させたいと願う、未来の冒険者の助けとなることを願う。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が創り出したゴーレムの前に、今度は「もんぱん」とかいう、やたらガタイのいい別のゴーレムを立たせている。なんでも、悪い奴らから守るためらしいが、俺に言わせりゃ、最初からそんなに心配なら、大事なもんは砂の中にでも埋めときゃいいんだ。まったく、人間ってのは、物事を大げさにするのが好きだな。やれやれだぜ。