近年、WebアプリケーションやAPIのセキュリティ対策として、SSL/TLSによる暗号化通信が必須となっています。
本記事では、Python製のWebフレームワークであるFastAPIで構築したAPIをSSL化する方法を解説します。
アーキテクチャ
FastAPIで構築したAPIをSSL化する際、以下のようなアーキテクチャを想定します。
Client <-- HTTPS --> Nginx <-- HTTP --> FastAPI (Uvicorn)
クライアントからのHTTPSリクエストをNginxで受け取ります。
Nginxはリバースプロキシとして機能し、HTTPSを解読して、HTTPを使用して内部のFastAPIサーバーに転送します。
必要なパッケージのインストール
前提条件
- FastAPIでAPIが構築済みであること
- Nginxのインストールが完了していること
- Certbotのインストールが完了していること
これらのインストールがまだの場合は、以下の記事を参考にしてください。
Certbotに加えて、以下のNginx用プラグインをインストールします。
sudo apt install python3-certbot-nginx
このプラグインにより、Nginxサーバーを使用している場合のSSL証明書の取得と設定を自動化できます。
SSL証明書の取得
Certbotを実行してSSL証明書を取得します。
事前にポート80と443を開放し、DNSレコードの設定を済ませておきます。
準備が整っていたら、次のコマンドを実行するだけです。
sudo certbot certonly --non-interactive --agree-tos -m yourmail@gmail.com --nginx -d example.com
もちろん、「yourmail@gmail.com」や「example.com」は変更してください。
SSL証明書が正常に取得されると、以下のようなメッセージが表示されます。
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
Nginxの設定
取得したSSL証明書のパスを使用して、Nginxの設定ファイルを編集します。
/etc/nginx/sites-available/default
server { listen 80; listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
設定ファイルを保存後、Nginxの設定をテストします。
sudo nginx -t
問題がなければ、Nginxを再起動して設定を反映します。
sudo systemctl restart nginx
FastAPIアプリケーションの起動
最後に、FastAPIアプリケーションを指定のポートで起動します。
uvicorn api:app --reload --port 8000
なお、ポートを指定しない場合はデフォルトでポート8000が選択されます。
動作確認
ブラウザから https://example.com にアクセスし、SSL証明書が適用されていることを確認します。
FastAPIアプリケーションが想定通りに動作すれば、設定は完了です。
以上の手順により、FastAPIで構築したAPIをNginxとLet’s Encryptを用いてSSL化することができます。
セキュアな通信環境を提供することで、ユーザーの信頼を得られるAPIを運用しましょう。