Python製APIをSSL化!FastAPI+Nginx+Certbotの設定手順

Python製APIをSSL化!FastAPI+Nginx+Certbotの設定手順 セキュリティ

近年、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を運用しましょう。

タイトルとURLをコピーしました