はまったのでまとめ。
これをやると、「nginx は DNS問合せ結果をキャッシュして、再起動されるまで更新しない」事象にあたるので、別途考慮が必要。
概要
要件
- プライベートネットワーク環境にあるクライアント (A) から Azure BLOB(パブリックエンドポイント) (B) 上へ、ファイルをダイレクトに転送したい
- (A)→(B)
環境的制約
- (A)は直接インターネットへは出ていけない
- (B)はパブリックエンドポイントを持ち、Express Route 上に構築された Azure VM (C) からのみアクセス可
解決方法
- (C)上にリバースプロキシを構築して、(A)からのリクエストを転送する
- (A)→(C)→(B)
やったこと
クライアント(A)
hosts ファイルでクライアントを騙す。これをやることでクライアントは(C)を意識せずに(B)と会話できるようになる。
/etc/hosts
[(C)のプライベートIPアドレス] [(B)のストレージアカウント].blob.core.windows.net
Azure VM(C)
nginx (Windows版)でリバプロ構築。nginxインストール手順・起動手順等は割愛。
ローカルの443番ポートに来たTCPリクエストを(中身を見ないで)upstream側に飛ばす。
nginx.conf
worker_processes 1;
error_log C:\\nginx\logs\error.log;
error_log C:\\nginx\logs\error.log notice;
error_log C:\\nginx\logs\error.log info;
error_log C:\\nginx\logs\error.log warn;
pid C:\\nginx\logs\\nginx.pid;
events {
worker_connections 1024;
}
# リバプロ設定追加
stream {
upstream azureblob {
server [(B)のストレージアカウント].blob.core.windows.net:443;
}
server {
listen 443;
proxy_pass azureblob;
}
}
はまったポイント
nginx に http を解釈させようとして、「クライアントからのリクエストは http で、バックエンドが https なんだがどうやるんだ?」となっていた
青天の霹靂
nginx は stream という機能により L3 スイッチ 的な挙動をすることができる!( http を解釈しない)
やればよかったと思ったこと
時間的に余裕がなくて後回しにしていたが、先にやっていればこんなにはまらなかったかも、というもの。
- テスト環境が圧倒的に足りなかった
- Azure BLOB で提供されている REST API を知らなさすぎ
- Azcopy 仕様を知らなさすぎ
- nginx を知らなさすぎ
何をしたか
最終的に暗闇から抜け出せたのは nginx の本を読んだことだった。