Heroku Data Links
最終更新日 2023年02月15日(水)
Table of Contents
Heroku Data Links を使用すると、Heroku Postgres データベースを別の Heroku Postgres データベースに容易に接続できます。接続後は、データが存在する場所に関係なく、SQL セマンティックスを使用してデータを読み取りおよび書き込みできます。
Heroku Data Links は、Essential 層のデータベースでは使用できません。
概要
Heroku Data Links は、外部データラッパーと呼ばれる Postgres のネイティブ機能を使用します。外部データラッパーは、外部サーバーの外部テーブルの論理表現をローカルデータベースのテーブルにマップします。
リモートデータベース内のデータに対するクエリを記述すると、Postgres はリモートデータに対して透過的にクエリを実行します。データが存在する場所や、それが Postgres でどのように抽象化されているかの詳細は、2 つのデータストアを接続する Postgres 拡張機能にプッシュダウンされます。
Heroku Data Links は、ローカルデータベース内でのサーバー仕様の作成や、リモートシステムでクエリを実行する対象のテーブルの作成など、外部データラッパーを管理するための困難な部分を処理します。
用語
Heroku Data Links に関するドキュメントでは、厳密な一連の用語を使用してすべての対話を定義します。
- リモート: Heroku Postgres データベースに接続されているデータストア。この記事の例では、
HEROKU_POSTGRESQL_BLUE_URL
はリモートデータベースの URL を指定している環境設定で、postgres-colorful-33594
はリモートデータベースのアドオン名です。 - ローカル : 接続を受け付けている Heroku Postgres データベース。この用語は外部データラッパーコンテキストの外部サーバーに対応します。この記事の例では、
DATABASE_URL
はローカルデータベースの URL を指定している環境設定で、postgres-animate-91581
はローカルデータベースのアドオン名です。 - データリンク: リモートデータベースとローカルデータベースの間の接続の名前。この記事の例では、
DATA_LINK_NAME
はプレースホルダー名で、datalink_test
はデータリンクの名前です。
データリンクの一覧表示
heroku pg:links
CLI コマンドを使用して、アプリケーションの既存のデータリンクをすべて一覧表示します。
$ heroku pg:links -a example-app
=== postgresql-animate-91581
* datalink_test
created_at: 2021-10-11T14:46:22.721+00:00
remote: HEROKU_POSTGRESQL_BLUE_URL (postgresql-colorful-33594)
remote_name: postgresql_colorful_33594
=== postgresql-colorful-33594
No data sources are linked into this database.
=== postgresql-round-06985
This operation is not supported by mini databases
このコマンドは、アプリケーションにアタッチされているすべてのデータベースおよび各データベース内に存在するデータリンクを一覧表示します。上記の例では、postgresql-animate-91581
は datalink_test
データリンクのローカルデータベースです。
Remote:
行は、ローカルデータベースに接続されているデータベースの環境設定とリソース名を参照しています。Remote Name
は、ローカルデータベース内の外部サーバー参照です。
Heroku Postgres の Heroku Postgres へのリンク
heroku pg:links:create [REMOTE] [LOCAL] --as [DATA_LINK_NAME]
コマンドを使用して、2 つの Heroku Postgres データベース間にデータリンクを作成します。
$ heroku pg:links:create HEROKU_POSTGRESQL_BLUE_URL DATABASE_URL --as datalink_test -a example-app
名前には小文字の英数字とアンダースコアのみを使用し、最大の長さは 63 文字とする必要があります。
Heroku Postgres インスタンスがデータリンク経由でリンクされると、そのリンク名に基づいて Postgres に新しいスキーマが追加されます (この例では、スキーマの名前は datalink_test
です)。
データリンクを設定すると、ローカルデータベース内に新しい外部スキーマが作成され、データリンクとして名前が指定されます。リモートデータベースの public
スキーマ内のすべてのテーブルは、このスキーマ内で外部テーブルとして作成されます。
heroku pg:psql
を使用して、データベースのすべてのスキーマを \dn
コマンドで検査して、新しいスキーマを見つけます。
$ heroku pg:psql postgresql-animate-91581 -a example-app
psql (13.2, server 13.5 (Ubuntu 13.5-2.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
example-app::DATABASE_URL=> \dn
List of schemas
Name | Owner
---------------+----------------
datalink_test | u12344l89vh890
public | u12344l89vh890
(2 rows)
\det [DATA_LINK_NAME].*
を実行して、データリンクによって作成されたすべての外部テーブルを一覧表示できます。
example-app::DATABASE=> \det datalink_test.*
List of foreign tables
Schema | Table | Server
---------------+---------+------------------------------
datalink_test | people | postgresql_colorful_33594
(1 row)
リモートデータストア HEROKU_POSTGRESQL_BLUE
内に people
テーブルがある場合は、ローカルデータベースから、そのテーブルに次のようにクエリを実行できます。
SELECT * FROM datalink_test.people;
リンク作成の時点で存在するテーブルのみが使用可能になります。リンクを作成した後にテーブルを作成した場合、それらのテーブルはローカルデータベースに出現しません。新しく作成されたテーブルを含める場合は、リンクを削除し、もう一度作成する必要があります。
リモートデータストアを削除するか、またはリモートデータストアが別のホストに移動された (Postgres フェイルオーバーなど) 場合、データリンクは更新されません。また、heroku pg:reset
などのコマンドでローカルデータベースをリセットすると、データリンクと内部の外部データラッパーの設定もリセットされます。これらの場合は、データリンクを作成し直す必要があります。
Heroku Data for Redis を Heroku Postgres にリンクする
2018 年 1 月 30 日の時点で、Heroku Data for Redis から Heroku Postgres への Heroku Data Links の作成は非推奨になりました。
データリンクの削除
heroku pg:links:destroy [LOCAL] [DATA_LINK_TEST]
CLI コマンドでデータリンクを削除します。
$ heroku pg:links:destroy DATABASE_URL datalink_test -a example-app
! WARNING: Destructive Action
! This command will affect the database: DATABASE
! This will delete datalink_test along with the tables and views created within it.
! This may have adverse effects for software written against the datalink_test schema.
! To proceed, type "example-app" or re-run this command with --confirm example-app
> example-app
Deleting link datalink_test in DATABASE... done
Postgres テーブルに対して、データリンクから来た何らかのビューまたはコードが記述されている場合、データリンクが削除される前にチェックは行われません。
注意事項と考慮事項
- リモートデータベースのテーブルに、ローカルデータベースに存在しないカスタムタイプの列がある場合、データリンクの作成は失敗します。ローカルデータベースに必要なカスタムタイプがある場合は、データリンクを作成する前にあらかじめ作成しておきます。
- ingress および egress ネットワークトラフィックの制限のため、データリンクは、同じ Shield スペースにこれらが存在する場合でも、Shield Heroku Postgres プランではサポートされていません。