新しいサーバーは立てない。
既存のEC2インスタンス((サーバーのIP))にはDXゲーム、予約システム、入退室管理システムなど複数のサービスが動いている。本システムも同じインスタンスに追加する。インフラコストをゼロで増やしながら本番環境を作る、というのがこのシステムの制約だった。
ポートで分離する
nginxが玄関として立っている。ドメインとポートの組み合わせで、どのサービスにリクエストを渡すかを振り分ける。
本システムのFastAPIは9200番ポートで起動する。nginxがorderocr.simplesystem.co.jpへのリクエストを9200番にプロキシする。
server {
listen 443 ssl;
server_name orderocr.simplesystem.co.jp;
ssl_certificate /etc/letsencrypt/live/simplesystem.co.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/simplesystem.co.jp/privkey.pem;
location / {
auth_basic "orderocr";
auth_basic_user_file /etc/nginx/.htpasswd_orderocr;
proxy_pass http://127.0.0.1:9200;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
既存サービスのnginx設定ファイルは変えない。本システム用の設定ファイルを/etc/nginx/conf.d/に追加するだけだ。
SSL証明書は共用
simplesystem.co.jpのワイルドカード証明書(*.simplesystem.co.jp)をLet's Encryptで取得していた。サブドメインを追加するだけで、追加費用なしでHTTPS化できる。
certbotが90日ごとに自動更新する設定になっている。証明書の更新が必要なときは、EC2上のタイマーが動く。
Basic認証で十分な理由
外部に公開するシステムだが、使うのは特定の担当者だけだ。
JWTやGoogleアカウント連携を実装するより、Basic認証はシンプルで確実だ。担当者はブラウザが表示するユーザー名・パスワードのダイアログで認証する。HTTPS通信のため、Basic認証でもパスワードは平文で送信されない。
htpasswdコマンドで認証ファイルを生成した。これだけだ。
htpasswd -c /etc/nginx/.htpasswd_orderocr orderocr
systemdで自動起動
本システムのFastAPIは、EC2が再起動しても自動で起動するようにsystemdサービスとして登録した。
[Unit]
Description=Order OCR FastAPI Application
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/orderocr
ExecStart=/home/ubuntu/.venv/bin/uvicorn api.main:app --host 127.0.0.1 --port 9200
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
ANTHROPIC_API_KEYなどの環境変数はsystemdのoverride.confに設定した。APIキーをコードに直書きしない。設定ファイルに書く。
Route 53でDNS設定
simplesystem.co.jpのDNSはAWS Route 53で管理している。サブドメインorderocr.simplesystem.co.jpのAレコードをEC2のElastic IPに向ける。
注意点が1つあった。お名前.comのDNS設定はこのドメインに効かない。NSレコードがRoute 53を指しているため、追加・変更はRoute 53コンソールでしか反映されない。初回設定時に「お名前.comで設定したのに反映されない」という状況に陥った。DNSを変更したい場合の場所を間違えると、なんの反応もなく時間が過ぎる。
PostgreSQLのバックアップ
PostgreSQLのデータはEC2のローカルディスクに保存されている。EC2インスタンスが削除されたらデータが消える。
pg_dumpで定期実行してS3に保存するスクリプトをcrontabに設定した。本格的な本番環境ではRDSに移行することも視野に入れながら、まずはシステムが使われることを優先した。
*次回は「AI帳票読取の現実——なぜプロンプトより確認UIが重要か」*
*シンプルシステム株式会社 代表 伊藤勝彦*