データをリレーショナル データベース、 NoSQL 、グラフ データベース、または類似のものに保存している場合、そのデータはおそらくプライベートです。そしておそらくそれをインターネットに公開したくないでしょう。したがって、プライベート サブネット内に配置することで、この問題を解決できます。ただし、他のマシンがデータベースへの接続を開くことを許可するには、ネットワーク アクセス制御リスト、セキュリティ グループ、またはルート テーブルを管理する必要があります。それは多大なオーバーヘッドです。
Ockam を使用すると、ネットワーク管理者はネットワーク アクセス コントロール リスト、セキュリティ グループ、またはルート テーブルを更新する必要がありません。 Ockam は、属性ベースのアクセス制御を通じてサービスにきめ細かい制御を適用します。そして、あなたもできます
このブログ投稿では、Ockam コマンド ライン インターフェイスであるockam
を調査し、最小限のコード変更またはまったくコード変更を行わずに、従来の Web アプリを PostgreSQL データベースに接続する方法を確認します。 PostgreSQL データベース内のカウンターをインクリメントするだけの、非常に基本的な Python Flask アプリを作成します。次に、アプリケーションとデータベース間の接続を Ockam の安全なチャネル経由で移動します。
始める前に、このブログ投稿で実行する手順を見てみましょう。
ockam enroll
使用して、Ockam アプリケーションをインストールし、Ockam プロジェクトを作成します。これが最初の前提条件です。
PostgreSQL データベースをセットアップします。これが 2 番目の前提条件です。次に、データベース サーバーへの Ockam の「アウトレット」を構成します。これについては、以下の「データベースの接続」セクションで詳しく説明します。
Web アプリ (Python Flask) をセットアップします。これが 3 番目の前提条件です。次に、Python アプリから Ockam の「インレット」を構成します。これについては、以下の「Web アプリの接続」セクションで詳しく説明します。
手順を進めるには、以下にリストされているすべての前提条件を必ずインストールしてください。
brew install build-trust/ockam/ockam
実行して、 brew
経由でこれをインストールします。これで、ターミナルでockam
CLI アプリを実行できるようになります。
brew install python
実行して、 brew
経由でこれをインストールします。これで、ターミナルでpython3
コマンドを実行できるようになります。
依存関係 ( Flask
、 psycopg2
) を取得する方法については、
brew
経由でbrew install postgresql@15
を実行します。これで、マシン上のデフォルト ポート5432
で PostgreSQL データベース サーバーを実行できるようになります。必ずbrew
の指示に従い、PostgreSQL をパスに追加してください。
brew services start postgresql@15
を実行して PostgreSQL サーバーを起動します。
次に、データベース ユーザーpostgres
の新しいパスワードを設定できます。このパスワードをpassword
に設定します。以下の Python コードでは、db ドライバーの接続文字列としてpostgres:password@localhost
を使用します。
以下の手順により、 Linuxおよび macOS でこれを行うことができます。
ターミナルでsudo -u postgres psql --username postgres --password --dbname template1
を実行して、 postgres
ユーザーとしてローカルにデータベースにログインします。
次に、これを REPL に入力します。 ALTER USER postgres PASSWORD 'password';
、最後にexit
と入力します。
Python Flask Web アプリは、PostgreSQL データベース内のカウンターをインクリメントします。アプリ全体が 1 つのファイルに収まります。
マシン上にmain.py
ファイルを作成し、以下のコードをコピーしてそこに貼り付けます。
import os import psycopg2 from flask import Flask CREATE_TABLE = ( "CREATE TABLE IF NOT EXISTS events (id SERIAL PRIMARY KEY, name TEXT);" ) INSERT_RETURN_ID = "INSERT INTO events (name) VALUES (%s) RETURNING id;" app = Flask(__name__) pg_port = os.environ['APP_PG_PORT'] # 5432 is the default port url = "postgres://postgres:password@localhost:%s/"%pg_port connection = psycopg2.connect(url) @app.route("/") def hello_world(): with connection: with connection.cursor() as cursor: cursor.execute(CREATE_TABLE) cursor.execute(INSERT_RETURN_ID, ("",)) id = cursor.fetchone()[0] return "I've been visited {} times".format(id), 201
このスクリプトでは、 "postgres://postgres:password@localhost:%s/"%pg_port
使用してデータベースへの接続を確立します。
pg_port
環境変数APP_PG_PORT
から値を取得します。
Python スクリプトを実行する前に、環境変数APP_PG_PORT
を5432
に設定します (手順は以下を参照)。
したがって、データベース接続文字列は単純にlocalhost:5432
を指します。
pg_port
Python 変数とAPP_PG_PORT
環境変数をメモしておきます。実稼働環境では、通常、環境変数からポートをロードし、ソースにハードコーディングされません。
Web アプリを実行するには、以下の手順に従ってください。
まず、必要な Python 依存関係を次のように追加してください。
# Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary
次に、 Flask
アプリ ( main.py
) を次のように起動します。
export APP_PG_PORT=5432 flask --app main run
http://localhost:5000/
。Web アプリとデータベースを設定したので、次にこれを実行しましょう。
オカムをミックスに加えます。
APP_PG_PORT
環境変数を更新して、新しいポート (PostgreSQL サーバーが実行される5432
ではない) に接続するようにします。
まず、 ockam enroll
を実行しましょう。上記の前提条件セクションで説明したように、Ockam CLI がすでにインストールされていることを確認してください。
ターミナル ウィンドウでこのコマンドを実行し、プロンプトに従って (Ockam Orchestrator への) 登録プロセスを完了します。
ockam enroll
ockam enroll
コマンドの動作は次のとおりです。
/project/default
default
あるデフォルト プロジェクトにエンドツーエンド暗号化リレーがプロビジョニングされます。
次に、生の TCP トラフィックをポート5432
で PostgreSQL サーバーに送信できるようにするtcp-outlet
を設定しましょう。次に、デフォルトの Orchestrator プロジェクトにリレーを作成します。これを行うには、ターミナルで次のコマンドを実行します。
export PG_PORT=5432 ockam tcp-outlet create --to $PG_PORT ockam relay create
ノート:
APP_PG_PORT
(Web アプリで使用される) ではなく、 PG_PORT
環境変数を使用します。これは、デフォルトの PostgreSQL ポート5432
を指します。以下のセクションでは、 APP_PG_PORT
別の値に変更します。tcp-inlet
を作成します。リレーを使用すると、リモートのプライベート ネットワークで動作するサービスとのエンドツーエンド プロトコルを確立できます。これにより、リモート サービス上のポートを (インターネットなどの敵対的なネットワークに) 公開する必要がなくなります。
最後に、ローカルtcp-inlet
をセットアップして、生の TCP トラフィックを転送する前にポート5433
で受信できるようにしましょう。
export OCKAM_PORT=5433 ockam tcp-inlet create --from $OCKAM_PORT
ノート:
$OCKAM_PORT
新しいポート5433
を指します。tcp-inlet
がリッスンするポートです。また、デフォルトの PostgreSQL ポートとは異なります。TCP インレットは、ノードが接続をリッスンする場所を定義する方法です。そして、そのトラフィックをどこに転送するかです。入口と出口が連携してポータルを形成します。
次に、以下のコマンドを使用して Web アプリを再度起動します。
export APP_PG_PORT=$OCKAM_PORT flask --app main run
最後に、Web ブラウザhttp://localhost:5000/
からこの URL に再度接続します。
$APP_PG_PORT
$OCKAM_PORT
( 5433
) と同じ値に変更しました。私たちの Web アプリ ( main.py
スクリプト) は、安全でないデータベース サーバー (ポート5432
上) に直接接続しません。安全なチャネル 🔐 を経由するようになりました。
アプリケーションのコードを変更することなく、カウンターは以前と同じように増加し続けます。ただし、Web アプリは Ockam の安全なチャネル 🎉 を介してデータベースと通信するようになりました。
この例を拡張して、PostgreSQL サービスを Docker コンテナまたはまったく別のマシンに移動することもできます。ノードが登録されると ( ockam enroll
の実行後)、このデモはアプリケーション コードを変更せずに引き続き動作し、PostgreSQL ポートをインターネットに直接公開する必要もありません。
また、Web アプリとデータベースを別のマシンで実行することもできます。これをする:
main.py
スクリプトのlocalhost
、データベースをホストするマシンの IP アドレスに変更します。
両方のマシン (Web アプリ マシンとデータベース サーバー マシン) でockam enroll
を実行します。
この例は完了したので、次にいくつかのコマンドを試して、その動作を確認してみましょう。いつでもその内容の詳細を調べることができます。
ockam node list
試してください。この演習で作成したノードが表示されますか?ockam node --help
を試してください。これらは、コマンドに慣れるための短い例です。ockam node show web
を試してください。この演習で作成したtcp-inlet
見えますか?ockam node show db
を試してください。この演習で作成したtcp-outlet
表示されますか?ockam identity list
を試してください。この演習で作成したアイデンティティが表示されますか?