「サーバ - REST API」の版間の差分
88行目: | 88行目: | ||
<br> | <br> | ||
Pythonと仮想環境の設定を行う。<br> | Pythonと仮想環境の設定を行う。<br> | ||
python3 -m venv | これにより、プロジェクトごとに独立したPython環境を作成することができる。<br> | ||
python3 -m venv <作成する仮想環境のディレクトリ名> | |||
<br> | <br> | ||
Pythonの仮想環境をアクティベートする。<br> | |||
<br> | |||
source venv/bin/activate | source venv/bin/activate | ||
<br> | <br> | ||
必要なPythonライブラリをインストールする。<br> | 必要なPythonライブラリをインストールする。<br> | ||
pip install fastapi uvicorn sqlalchemy | pip install fastapi uvicorn sqlalchemy | ||
<br> | |||
<u>※注意</u><br> | |||
<u>venv/bin/activateスクリプトを~/.profileファイル等に設定することは非推奨である。</u><br> | |||
* <u>activateスクリプトは相対パスで動作するため、フルパスで指定する必要がある。</u> | |||
* <u>常に特定の仮想環境がアクティブになってしまうため、他のプロジェクトで異なる仮想環境を使用する場合に問題が発生する。</u> | |||
* <u>シェルのセッションごとに自動的にアクティベートすると、どの環境で作業しているのか理解しにくい。</u> | |||
<br> | |||
<u>代替案として、以下に示すような方法が推奨される。</u><br> | |||
<u>以下に示すような方法ならば、必要な時のみ仮想環境をアクティベートすることが可能なため、柔軟な運用が可能になる。</u><br> | |||
<br> | |||
<u>特に、複数のプロジェクトを扱う場合は、2番目や3番目の方法が便利である。</u><br> | |||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# 方法 1 | |||
# エイリアスを設定する方法 (~/.profileファイル等に記述) | |||
alias activate-myproject='source <activateスクリプトのパス>' | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# 方法 2 | |||
# プロジェクトディレクトリに入った時のみ自動的にアクティベートする方法 (~/.profileファイル等に記述) | |||
function cd() | |||
{ | |||
builtin cd "$@" | |||
# プロジェクトディレクトリに入った時のみ仮想環境をアクティベート | |||
if [ -d "venv" ]; then | |||
# 既に仮想環境がアクティブでない場合のみ | |||
if [ -z "$VIRTUAL_ENV" ]; then | |||
source venv/bin/activate | |||
fi | |||
fi | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# 方法 3 | |||
# direnvのような専用ツールを使用する方法 | |||
# プロジェクトディレクトリの.envrcファイルに記述 | |||
layout python3 # Pythonの仮想環境を自動的に管理 | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== Node.js + Expressを使用する場合 ==== | ==== Node.js + Expressを使用する場合 ==== |
2025年1月1日 (水) 15:29時点における版
概要
REST APIは、HTTPプロトコルを使用して、クライアントとサーバ間でリソースのやり取りを行うインターフェースである。
主なHTTPメソッド (GET、POST、PUT、DELETE) を使用して、リソースの取得、作成、更新、削除等の操作を実現する。
サーバの実装において、Linuxディストリビューションに必要なプログラム言語とフレームワークをインストールする。
一般的な選択肢としては、PythonのFlaskやDjango、Node.jsのExpress、RubyのRails、JavaのSpring Boot等がある。
以下の例では、PythonのFlaskを使用した基本的なREST APIを構築している。
from flask import Flask, request, jsonify
app = Flask(__name__)
# データストアの代わりとなる簡単なディクショナリ
books = {}
@app.route('/api/books', methods=['GET'])
def get_books():
return jsonify(books)
@app.route('/api/books', methods=['POST'])
def add_book():
book = request.get_json()
books[len(books) + 1] = book
return jsonify({'message': 'Book added successfully'})
if __name__ == '__main__':
app.run(debug=True)
セキュリティでは、APIキーの実装、HTTPS通信の設定、入力データのバリデーション、SQLインジェクション対策等を行う必要がある。
また、認証・認可の仕組みとして、JWTトークンやOAuth2.0の実装も検討する必要がある。
パフォーマンスとスケーラビリティでは、キャッシュの実装 (例: Redis)、データベースの最適化 (インデックス設計等)、ロードバランサの設置が重要である。
また、コンテナ化 (Podman等) やオーケストレーション (Kubernetes) の導入も検討する。
APIのドキュメント化も重要な要素となる。
Swagger / OpenAPIを使用することにより、APIの仕様を明確に定義して、自動的にドキュメントを生成することができる。
これにより、他の開発者がAPIを理解および使用することが容易になる。
モニタリングとログ収集の設定において、PrometheusやGrafanaを使用してメトリクスを収集・可視化して、
ELKスタック (Elasticsearch、Logstash、Kibana) でログを収集・分析することにより、APIの健全性を監視することができる。
REST APIサーバを構築・運用する場合は、以下に示す事柄に注意する。
- 定期的なバックアップの実施
- セキュリティアップデートの適用
- アクセスログの監視
- レート制限の実装
- 適切なエラーハンドリング
- データベースの最適化
- APIドキュメントの作成と管理
サーバ環境のインストール
まず、システムを更新を行う。
# RHEL sudo dnf update # SUSE sudo zypper update # Raspberry Pi sudo apt update sudo apt upgrade
次に、Linuxサーバに必要な基本環境をインストールする。
# RHEL sudo dnf install curl wget git # SUSE sudo zypper install curl wget git # Raspberry Pi sudo apt install curl wget git build-essential
開発言語とフレームワークの選択
Python + FastAPIを使用する場合
Pythonと仮想環境をインストールする。
# RHEL sudo dnf install python3 python3-pip python3-virtualenv # SUSE sudo zypper install python3 python3-pip python3-virtualenv # Raspberry Pi sudo apt install python3 python3-pip python3-venv
Pythonと仮想環境の設定を行う。
これにより、プロジェクトごとに独立したPython環境を作成することができる。
python3 -m venv <作成する仮想環境のディレクトリ名>
Pythonの仮想環境をアクティベートする。
source venv/bin/activate
必要なPythonライブラリをインストールする。
pip install fastapi uvicorn sqlalchemy
※注意
venv/bin/activateスクリプトを~/.profileファイル等に設定することは非推奨である。
- activateスクリプトは相対パスで動作するため、フルパスで指定する必要がある。
- 常に特定の仮想環境がアクティブになってしまうため、他のプロジェクトで異なる仮想環境を使用する場合に問題が発生する。
- シェルのセッションごとに自動的にアクティベートすると、どの環境で作業しているのか理解しにくい。
代替案として、以下に示すような方法が推奨される。
以下に示すような方法ならば、必要な時のみ仮想環境をアクティベートすることが可能なため、柔軟な運用が可能になる。
特に、複数のプロジェクトを扱う場合は、2番目や3番目の方法が便利である。
# 方法 1
# エイリアスを設定する方法 (~/.profileファイル等に記述)
alias activate-myproject='source <activateスクリプトのパス>'
# 方法 2
# プロジェクトディレクトリに入った時のみ自動的にアクティベートする方法 (~/.profileファイル等に記述)
function cd()
{
builtin cd "$@"
# プロジェクトディレクトリに入った時のみ仮想環境をアクティベート
if [ -d "venv" ]; then
# 既に仮想環境がアクティブでない場合のみ
if [ -z "$VIRTUAL_ENV" ]; then
source venv/bin/activate
fi
fi
}
# 方法 3
# direnvのような専用ツールを使用する方法
# プロジェクトディレクトリの.envrcファイルに記述
layout python3 # Pythonの仮想環境を自動的に管理
Node.js + Expressを使用する場合
Node.jsをインストールする。
Node.jsの詳細なインストール手順は、インストール_-_Yarnを参照すること。
プロジェクトディレクトリを作成する。
mkdir <任意のディレクトリ 例: ~/my-api> cd <作成したディレクトリ 例: ~/my-api>
プロジェクトに必要なJavaScriptライブラリをインストールする。
npm init npm install express body-parser cors
データベースの設定
PostgreSQLを使用する場合
PostgreSQLをインストールする。
# RHEL sudo dnf install postgresql libpq5 # SUSE sudo zypper install postgresql libpq5 # Raspberry Pi sudo apt install postgresql postgresql-contrib
データベースを作成する。
sudo -u postgres createdb myapi_db sudo -u postgres createuser myapi_user
APIの基本的な実装
Python + FastAPIを使用する場合
# main.pyファイル
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
@app.get("/items")
async def read_items():
return {"items": []}
@app.post("/items")
async def create_item(item: Item):
return item
HTTPS対応
Let's Encryptを使用する場合
Certbotをインストールする。
# RHEL sudo dnf install ca-certificates python3-certbot # SUSE sudo zypper install python3-certbot python3-certbot-nginx # Raspberry Pi sudo apt install certbot python3-certbot-nginx
SSL証明書を取得する。
sudo certbot --nginx -d <ドメイン名 例: example.com>
リバースプロキシの設定
Nginxを使用する場合
# /etc/nginx/sites-available/myapiファイル
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Systemdサービスファイルの作成
# /etc/systemd/system/<任意のサービス名>.serviceファイル
[Unit]
Description=<サービスファイルの説明>
After=network.target
[Service]
User=<実行する任意のユーザ名>
WorkingDirectory=<REST APIのプロジェクトディレクトリ 例: /home/<ユーザ名>/my-api>
ExecStart=/<uvicorn実行ファイルのパス> main:app --host <ホスト名またはIPアドレス> --port <ポート番号>
# 例: ExecStart=/home/myapi_user/my-api/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
ファイヤーウォールの設定
Firewalldの場合
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
UFWの場合
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
監視とログ管理
PrometheusのGithubにアクセスして、Prometheusをインストールする。
ダウンロードしたファイルを解凍する。
tar xf prometheus-<バージョン>.tar.gz
Grafanaをインストールする。
sudo apt install apt-transport-https sudo apt install software-properties-common sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
CI/CD環境の構築
GitLabを使用する場合
# .gitlab-ci.ymlファイル
stages:
- test
- deploy
test:
stage: test
script:
- pip install -r requirements.txt
- pytest
deploy:
stage: deploy
script:
- ssh user@yourserver 'cd /path/to/api && git pull && systemctl restart myapi'
only:
- master