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 プランではサポートされていません。