paint-brush
従来の Web アプリを Postgres データベースに接続する@ockam
993 測定値
993 測定値

従来の Web アプリを Postgres データベースに接続する

Ockam8m2023/08/31
Read on Terminal Reader

長すぎる; 読むには

従来の Web アプリを postgres データベースに接続する方法を学びます。安全な設計で、コード変更やファイアウォール管理が最小限または不要な方法で接続できます。
featured image - 従来の Web アプリを Postgres データベースに接続する
Ockam HackerNoon profile picture
0-item


オカムは、エンドツーエンドの暗号化、相互認証、キー管理、資格情報管理、認可ポリシーの適用をすべて大規模に調整するための、Rust ライブラリ、コマンド ライン ツール、およびマネージド クラウド サービスのスイートです。オッカムのエンドツーエンド安全なチャネルアプリケーション層で移動中のすべてのデータの信頼性、完全性、機密性を保証します。


データをリレーショナル データベース、 NoSQL 、グラフ データベース、または類似のものに保存している場合、そのデータはおそらくプライベートです。そしておそらくそれをインターネットに公開したくないでしょう。したがって、プライベート サブネット内に配置することで、この問題を解決できます。ただし、他のマシンがデータベースへの接続を開くことを許可するには、ネットワーク アクセス制御リスト、セキュリティ グループ、またはルート テーブルを管理する必要があります。それは多大なオーバーヘッドです。


Ockam を使用すると、ネットワーク管理者はネットワーク アクセス コントロール リスト、セキュリティ グループ、またはルート テーブルを更新する必要がありません。 Ockam は、属性ベースのアクセス制御を通じてサービスにきめ細かい制御を適用します。そして、あなたもできます外部 ID プロバイダーと統合するOkta のように、サービスにアクセスできるユーザーを制限します。


このブログ投稿では、Ockam コマンド ライン インターフェイスであるockamを調査し、最小限のコード変更またはまったくコード変更を行わずに、従来の Web アプリを PostgreSQL データベースに接続する方法を確認します。 PostgreSQL データベース内のカウンターをインクリメントするだけの、非常に基本的な Python Flask アプリを作成します。次に、アプリケーションとデータベース間の接続を Ockam の安全なチャネル経由で移動します。


私たちの旅

始める前に、このブログ投稿で実行する手順を見てみましょう。

私たちの旅


  1. ockam enroll使用して、Ockam アプリケーションをインストールし、Ockam プロジェクトを作成します。これが最初の前提条件です。


  2. PostgreSQL データベースをセットアップします。これが 2 番目の前提条件です。次に、データベース サーバーへの Ockam の「アウトレット」を構成します。これについては、以下の「データベースの接続」セクションで詳しく説明します。


  3. Web アプリ (Python Flask) をセットアップします。これが 3 番目の前提条件です。次に、Python アプリから Ockam の「インレット」を構成します。これについては、以下の「Web アプリの接続」セクションで詳しく説明します。


前提条件

手順を進めるには、以下にリストされているすべての前提条件を必ずインストールしてください。


  1. オッカムコマンド
    • brew install build-trust/ockam/ockam実行して、 brew経由でこれをインストールします。これで、ターミナルでockam CLI アプリを実行できるようになります。


  2. Python、およびライブラリ: Flash、psycopg2
    • brew install python実行して、 brew経由でこれをインストールします。これで、ターミナルでpython3コマンドを実行できるようになります。

    • 依存関係 ( Flaskpsycopg2 ) を取得する方法については、 Pythonコード以下のセクション。


  3. ポストグレSQL
    • 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と入力します。



Web アプリ - Python コード

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_PORT5432に設定します (手順は以下を参照)。

  • したがって、データベース接続文字列は単純にlocalhost:5432を指します。


pg_port Python 変数とAPP_PG_PORT環境変数をメモしておきます。実稼働環境では、通常、環境変数からポートをロードし、ソースにハードコーディングされません。


Web アプリを実行する

Web アプリを実行するには、以下の手順に従ってください。


  1. まず、必要な Python 依存関係を次のように追加してください。

     # Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary


  1. 次に、 Flaskアプリ ( main.py ) を次のように起動します。

     export APP_PG_PORT=5432 flask --app main run


  1. 最後に、Web ブラウザで次の URL を開きます: http://localhost:5000/


オカムをインストールする

Web アプリとデータベースを設定したので、次にこれを実行しましょう。


  1. オカムをミックスに加えます。

  2. APP_PG_PORT環境変数を更新して、新しいポート (PostgreSQL サーバーが実行される5432ではない) に接続するようにします。


まず、 ockam enrollを実行しましょう。上記の前提条件セクションで説明したように、Ockam CLI がすでにインストールされていることを確認してください。


ターミナル ウィンドウでこのコマンドを実行し、プロンプトに従って (Ockam Orchestrator への) 登録プロセスを完了します。

 ockam enroll


ockam enrollコマンドの動作は次のとおりです。

  • Ockam Orchestrator への登録が成功した後、すべてが正しくインストールされていることを確認します。
  • Ockam Orchestrator にスペースとプロジェクトが作成され、 /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を作成します。

リレーを使用すると、リモートのプライベート ネットワークで動作するサービスとのエンドツーエンド プロトコルを確立できます。これにより、リモート サービス上のポートを (インターネットなどの敵対的なネットワークに) 公開する必要がなくなります。


Web アプリを接続する

最後に、ローカル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 に再度接続します。


  1. $APP_PG_PORT $OCKAM_PORT ( 5433 ) と同じ値に変更しました。私たちの Web アプリ ( main.pyスクリプト) は、安全でないデータベース サーバー (ポート5432上) に直接接続しません。安全なチャネル 🔐 を経由するようになりました。

  2. アプリケーションのコードを変更することなく、カウンターは以前と同じように増加し続けます。ただし、Web アプリは Ockam の安全なチャネル 🎉 を介してデータベースと通信するようになりました。


複数のマシン

この例を拡張して、PostgreSQL サービスを Docker コンテナまたはまったく別のマシンに移動することもできます。ノードが登録されると ( ockam enrollの実行後)、このデモはアプリケーション コードを変更せずに引き続き動作し、PostgreSQL ポートをインターネットに直接公開する必要もありません。


また、Web アプリとデータベースを別のマシンで実行することもできます。これをする:


  1. main.pyスクリプトのlocalhost 、データベースをホストするマシンの IP アドレスに変更します。

  2. 両方のマシン (Web アプリ マシンとデータベース サーバー マシン) でockam enrollを実行します。


他のコマンドを調べる

この例は完了したので、次にいくつかのコマンドを試して、その動作を確認してみましょう。いつでもその内容の詳細を調べることができます。マニュアル。これらをそれぞれ試すときは、この演習で作成したものに注目してください。


  • ockam node list試してください。この演習で作成したノードが表示されますか?
  • ockam node --helpを試してください。これらは、コマンドに慣れるための短い例です。
  • ockam node show webを試してください。この演習で作成したtcp-inlet見えますか?
  • ockam node show dbを試してください。この演習で作成したtcp-outlet表示されますか?
  • ockam identity listを試してください。この演習で作成したアイデンティティが表示されますか?