Query external data sources with FDW
Query other Tiger Cloud services or external PostgreSQL databases using foreign data wrappers
You use PostgreSQL foreign data wrappers (FDWs) to query external data sources from a Tiger Cloud service. These external data sources can be one of the following:
- Other Tiger Cloud services
- PostgreSQL databases outside of Tiger Cloud
If you are using VPC peering, you can create FDWs in your Customer VPC to query a service in your Tiger Cloud project. However, you can’t create FDWs in your Tiger Cloud services to query a data source in your Customer VPC. This is because Tiger Cloud VPC peering uses AWS PrivateLink for increased security. See VPC peering documentation for additional details.
PostgreSQL FDWs are particularly useful if you manage multiple Tiger Cloud services with different capabilities, and need to seamlessly access and merge regular and time-series data.
Prerequisites
To follow the steps on this page:
-
Create a target Tiger Cloud service with the Real-time analytics capability.
You need your connection details. This procedure also works for self-hosted TimescaleDB.
Query another data source
To query another data source:
You create PostgreSQL FDWs with the postgres_fdw extension, which is enabled by default in Tiger Cloud.
- Connect to your service
See how to connect.
- Create a server
Run the following command using your connection details:
CREATE SERVER myserverFOREIGN DATA WRAPPER postgres_fdwOPTIONS (host '<host>', dbname 'tsdb', port '<port>'); - Create user mapping
Run the following command using your connection details:
CREATE USER MAPPING FOR tsdbadminSERVER myserverOPTIONS (user 'tsdbadmin', password '<password>'); - Import a foreign schema (recommended) or create a foreign table
-
Import the whole schema:
CREATE SCHEMA foreign_stuff;IMPORT FOREIGN SCHEMA publicFROM SERVER myserverINTO foreign_stuff ; -
Alternatively, import a limited number of tables:
CREATE SCHEMA foreign_stuff;IMPORT FOREIGN SCHEMA publicLIMIT TO (table1, table2)FROM SERVER myserverINTO foreign_stuff; -
Create a foreign table. Skip if you are importing a schema:
CREATE FOREIGN TABLE films (code char(5) NOT NULL,title varchar(40) NOT NULL,did integer NOT NULL,date_prod date,kind varchar(10),len interval hour to minute)SERVER film_server;
-
A user with the tsdbadmin role assigned already has the required USAGE permission to create PostgreSQL FDWs. You can enable another user, without the tsdbadmin role assigned, to query foreign data. To do so, explicitly grant the permission. For example, for a new grafana user:
CREATE USER grafana;
GRANT grafana TO tsdbadmin;
CREATE SCHEMA fdw AUTHORIZATION grafana;
CREATE SERVER db1 FOREIGN DATA WRAPPER postgres_fdwOPTIONS (host '<host>', dbname 'tsdb', port '<port>');
CREATE USER MAPPING FOR grafana SERVER db1OPTIONS (user 'tsdbadmin', password '<password>');
GRANT USAGE ON FOREIGN SERVER db1 TO grafana;
SET ROLE grafana;
IMPORT FOREIGN SCHEMA public FROM SERVER db1 INTO fdw;You create PostgreSQL FDWs with the postgres_fdw extension. See documentation on how to enable it.
- Connect to your database
Use
psqlto connect to your database. - Create a server
Run the following command using your connection details:
CREATE SERVER myserverFOREIGN DATA WRAPPER postgres_fdwOPTIONS (host '<host>', dbname '<database_name>', port '<port>'); - Create user mapping
Run the following command using your connection details:
CREATE USER MAPPING FOR postgresSERVER myserverOPTIONS (user 'postgres', password '<password>'); - Import a foreign schema (recommended) or create a foreign table
-
Import the whole schema:
CREATE SCHEMA foreign_stuff;IMPORT FOREIGN SCHEMA publicFROM SERVER myserverINTO foreign_stuff ; -
Alternatively, import a limited number of tables:
CREATE SCHEMA foreign_stuff;IMPORT FOREIGN SCHEMA publicLIMIT TO (table1, table2)FROM SERVER myserverINTO foreign_stuff; -
Create a foreign table. Skip if you are importing a schema:
CREATE FOREIGN TABLE films (code char(5) NOT NULL,title varchar(40) NOT NULL,did integer NOT NULL,date_prod date,kind varchar(10),len interval hour to minute)SERVER film_server;
-