From d9b2abf2f3da27f7da508808c9e49012c6a2b62d Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 14:22:34 -0400 Subject: [PATCH 01/11] stash 1 --- content/operate/rc/databases/rdi/define.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 8987ccac36..5ee56e0c03 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -82,6 +82,11 @@ After your pipeline is provisioned, you will be able to define your pipeline. Yo 1. In the **Pipeline definition** section, select the Redis data type to write keys to the target. You can choose **Hash** or **JSON** if the target database supports JSON. {{The pipeline definition screen.}} + + You can also supply one or more [transformation job files]({{< relref "/integrate/redis-data-integration/data-pipelines/transform-examples" >}}) that specify how you want to transform the captured data before writing it to the target. Select **Upload jobs** to upload your job files. + + {{The transformation jobs section. Select Upload jobs to upload transformation jobs.}} + Select **Continue**. {{The continue button.}} From c6e4a3c37df30061ff3341c055aa8f3a2d1a848d Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 14:26:50 -0400 Subject: [PATCH 02/11] Add note about SQL server editions --- .../prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md index 7f96b19481..5d7dbca456 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md @@ -18,6 +18,10 @@ weight: 3 Follow the steps in the sections below to prepare a [Microsoft SQL Server on AWS RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.SQLServer.html) database to work with RDI. +{{< note >}} +Change Data Capture (CDC) is not supported on SQL Server Express Edition. Only the Standard, Enterprise, and Developer editions support CDC and are supported by RDI. +{{< /note >}} + ## Create the Debezium user The Debezium connector needs a user account to connect to SQL Server. This From 3987df2ea9a288675e4a8a4d61ec99961d512957 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 16:10:34 -0400 Subject: [PATCH 03/11] Metrics Scraping --- content/operate/rc/databases/rdi/setup.md | 11 +++++++++-- content/operate/rc/databases/rdi/view-edit.md | 10 ++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 5242a4ca76..ed07b2577e 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -81,7 +81,7 @@ In the [AWS Management Console](https://console.aws.amazon.com/), use the **Serv - **Target type**: Select **Instances**. - **Protocol : Port**: Select **TCP**, and then enter the port number where your database is exposed. - The **IP address type** and **VPC** should be selected already and match the VPC you selected earlier. - 1. In **Register targets**, select the EC2 instance that runs your source database, enter the port, and select **Include as pending below**. Then, select **Create target group** to create your target group. Return **Listeners and routing** in the Network Load Balancer setup. + 1. In **Register targets**, select the EC2 instance that runs your source database, enter the port, and select **Include as pending below**. Then, select **Create target group** to create your target group. Return to **Listeners and routing** in the Network Load Balancer setup. 1. Set the following **Listener** properties: - **Protocol**: Select **TCP**. - **Port**: Enter your source database's port. @@ -129,6 +129,13 @@ To do this: In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Database** > **Aurora and RDS**. [Create an RDS proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy-creating.html) that can access your database. +The Proxy's IAM role must have the following permissions to access the database using the credentials secret and encryption key: +- `secretsmanager:GetSecretValue` +- `secretsmanager:DescribeSecret` +- `kms:Decrypt` + +You can set the proxy's IAM role during creation in the **Authentication** section. + #### Create network load balancer {#create-network-load-balancer-rds} In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Compute** > **EC2**. [Create a network load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html#configure-load-balancer) with the following settings: @@ -144,7 +151,7 @@ In the [AWS Management Console](https://console.aws.amazon.com/), use the **Serv - **Target type**: Select **IP Addresses**. - **Protocol : Port**: Select **TCP**, and then enter the port number where your database is exposed. - The **IP address type** and **VPC** should be selected already and match the VPC you selected earlier. - 1. In **Register targets**, enter the static IP address of your RDS proxy, enter the port, and select **Include as pending below**. Then, select **Create target group** to create your target group. Return **Listeners and routing** in the Network Load Balancer setup. + 1. In **Register targets**, enter the static IP address of your RDS proxy, enter the port, and select **Include as pending below**. Then, select **Create target group** to create your target group. Return to **Listeners and routing** in the Network Load Balancer setup. To get the static IP address of your RDS Proxy, run the following command on an EC2 instance in the same VPC as the Proxy: ```sh $ nslookup diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index b16fbcf4a3..d094a07cdb 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -99,6 +99,16 @@ At this point, the data pipeline will apply the changes. If you selected **Reset If you selected **Apply to new data changes only**, the data pipeline will enter the *change streaming* phase without ingesting data. +## View metrics endpoints + +You can use [Prometheus and Grafana]({{< relref "/integrate/prometheus-with-redis-cloud/" >}}) to track and display metrics for the data pipeline. + +To view the metrics endpoints for the source collector and pipeline processor, go to the **Data pipeline** tab and select **More actions**, and then **Show metrics**. You can add these endpoints as a Prometheus target to start tracking your RDI metrics. + +Prometheus endpoints are exposed on Redis Cloud's internal network. To access this network, enable [VPC peering]({{< relref "/operate/rc/security/vpc-peering" >}}) or [AWS Transit Gateway]({{< relref "/operate/rc/security/aws-transit-gateway" >}}). See [Prometheus and Grafana with Redis Cloud]({{< relref "/integrate/prometheus-with-redis-cloud/" >}}) for more information. + +For more information about available RDI metrics, see [Observability]({{< relref "/integrate/redis-data-integration/observability" >}}). + ## Reset data pipeline Resetting the data pipeline creates a new baseline snapshot from the current state of your source database, and re-processes the data from the source database to the target Redis database. You may want to reset the pipeline if the source and target databases were disconnected or you made large changes to the data pipeline. From 8474da5c5963d959fa86acff084da4d0dc79c0b6 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 16:16:15 -0400 Subject: [PATCH 04/11] Publicly accessible setting --- content/embeds/rdi-aur-rds-pub-access.md | 6 ++++++ .../prepare-dbs/aws-aurora-rds/aws-aur-mysql.md | 2 ++ .../prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md | 2 ++ .../prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md | 2 ++ 4 files changed, 12 insertions(+) create mode 100644 content/embeds/rdi-aur-rds-pub-access.md diff --git a/content/embeds/rdi-aur-rds-pub-access.md b/content/embeds/rdi-aur-rds-pub-access.md new file mode 100644 index 0000000000..9e47e70ee7 --- /dev/null +++ b/content/embeds/rdi-aur-rds-pub-access.md @@ -0,0 +1,6 @@ +-- +## Allow public access + +For [RDI on Redis Cloud]({{< relref "/operate/rc/databases/rdi" >}}), you must allow public access to your source database to allow the proxy to connect to it. + +To do this, [modify the database](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html) and set **Publicly accessible** to **Yes**. \ No newline at end of file diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md index 211aeae8ca..362f06086b 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md @@ -19,6 +19,8 @@ weight: 2 Follow the steps in the sections below to prepare an [AWS Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) or [AWS RDS MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html) database. database to work with RDI. +{{< embed-md "rdi-aur-rds-pub-access.md" >}} + ## Create and apply parameter group RDI requires some changes to database parameters. On AWS RDS and AWS Aurora, you change these parameters via a parameter group. diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md index ec2dee5207..eab6acaed2 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md @@ -23,6 +23,8 @@ Follow the steps in the sections below to prepare an [AWS Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html) or [AWS RDS PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html) database to work with RDI. +{{< embed-md "rdi-aur-rds-pub-access.md" >}} + ## Create and apply parameter group RDI requires some changes to database parameters. On AWS RDS and AWS Aurora, you change these parameters via a parameter group. diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md index 5d7dbca456..8b7495bccb 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md @@ -22,6 +22,8 @@ Follow the steps in the sections below to prepare a [Microsoft SQL Server on AWS Change Data Capture (CDC) is not supported on SQL Server Express Edition. Only the Standard, Enterprise, and Developer editions support CDC and are supported by RDI. {{< /note >}} +{{< embed-md "rdi-aur-rds-pub-access.md" >}} + ## Create the Debezium user The Debezium connector needs a user account to connect to SQL Server. This From 5ad31c7060965277cd26c755fb16005552809a0c Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 16:24:20 -0400 Subject: [PATCH 05/11] Fix embed formatting --- content/embeds/rdi-aur-rds-pub-access.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/embeds/rdi-aur-rds-pub-access.md b/content/embeds/rdi-aur-rds-pub-access.md index 9e47e70ee7..e0f6b08763 100644 --- a/content/embeds/rdi-aur-rds-pub-access.md +++ b/content/embeds/rdi-aur-rds-pub-access.md @@ -1,4 +1,3 @@ --- ## Allow public access For [RDI on Redis Cloud]({{< relref "/operate/rc/databases/rdi" >}}), you must allow public access to your source database to allow the proxy to connect to it. From 21309d0012163bd654d55721a45672cbe55b89dc Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 16:36:13 -0400 Subject: [PATCH 06/11] Add tabs to setup page --- content/operate/rc/databases/rdi/setup.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index ed07b2577e..e6444315db 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -51,11 +51,11 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio To ensure that you can connect your Redis Cloud database to the source database, you need to set up an endpoint service through AWS PrivateLink. -Choose the steps for your database setup: -- [Database hosted on an AWS EC2 instance](#database-hosted-on-an-aws-ec2-instance) -- [Database hosted on AWS RDS or AWS Aurora](#database-hosted-on-aws-rds-or-aws-aurora) +Select the steps for your database setup. -### Database hosted on an AWS EC2 instance +{{< multitabs id="rdi-cloud-connectivity" + tab1="EC2 instance" + tab2="AWS RDS or Aurora" >}} The following diagram shows the network setup for a database hosted on an AWS EC2 instance. @@ -66,7 +66,7 @@ To do this: 1. [Create a network load balancer](#create-network-load-balancer-ec2) that will route incoming HTTP requests to your database. 1. [Create an endpoint service](#create-endpoint-service-ec2) through AWS PrivateLink. -#### Create network load balancer {#create-network-load-balancer-ec2} +### Create network load balancer {#create-network-load-balancer-ec2} In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Compute** > **EC2**. [Create a network load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html#configure-load-balancer) with the following settings: @@ -93,7 +93,7 @@ In the [AWS Management Console](https://console.aws.amazon.com/), use the **Serv - **Source**: Select **Anywhere - IPv4**. Select **Save rules** to save your changes. -#### Create endpoint service {#create-endpoint-service-ec2} +### Create endpoint service {#create-endpoint-service-ec2} In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Networking & Content Delivery** > **VPC**. There, select **PrivateLink and Lattice** > **Endpoint services**. [Create an endpoint service](https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html) with the following settings: @@ -113,7 +113,7 @@ After you create the endpoint service, you need to add Redis Cloud as an Allowed For more details on AWS PrivateLink, see [Share your services through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html). -### Database hosted on AWS RDS or AWS Aurora +--tab-sep-- The following diagram shows the network setup for a database hosted on AWS RDS or AWS Aurora. @@ -125,7 +125,7 @@ To do this: 1. [Create a network load balancer](#create-network-load-balancer-rds) that will route incoming HTTP requests to the RDS proxy. 1. [Create an endpoint service](#create-endpoint-service-rds) through AWS PrivateLink. -#### Create RDS proxy {#create-rds-proxy} +### Create RDS proxy {#create-rds-proxy} In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Database** > **Aurora and RDS**. [Create an RDS proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy-creating.html) that can access your database. @@ -136,7 +136,7 @@ The Proxy's IAM role must have the following permissions to access the database You can set the proxy's IAM role during creation in the **Authentication** section. -#### Create network load balancer {#create-network-load-balancer-rds} +### Create network load balancer {#create-network-load-balancer-rds} In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Compute** > **EC2**. [Create a network load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html#configure-load-balancer) with the following settings: @@ -168,7 +168,7 @@ In the [AWS Management Console](https://console.aws.amazon.com/), use the **Serv - **Source**: Select **Anywhere - IPv4**. Select **Save rules** to save your changes. -#### Create endpoint service {#create-endpoint-service-rds} +### Create endpoint service {#create-endpoint-service-rds} In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Networking & Content Delivery** > **VPC**. There, select **PrivateLink and Lattice** > **Endpoint services**. [Create an endpoint service](https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html) with the following settings: @@ -188,6 +188,8 @@ After you create the endpoint service, you need to add Redis Cloud as an Allowed For more details on AWS PrivateLink, see [Share your services through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html). +{{< /multitabs >}} + ## Share source database credentials You need to share your source database credentials and certificates in an Amazon secret with Redis Cloud so that the pipeline can connect to your database. From 4453c245da2ccd58dea020a0eb01e08c2fa5aa67 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Jun 2025 17:08:31 -0400 Subject: [PATCH 07/11] Images --- .../rc/rdi/rdi-start-pipeline-setup.png | Bin 2681 -> 4950 bytes .../images/rc/rdi/rdi-transformation-jobs.png | Bin 0 -> 12655 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/images/rc/rdi/rdi-transformation-jobs.png diff --git a/static/images/rc/rdi/rdi-start-pipeline-setup.png b/static/images/rc/rdi/rdi-start-pipeline-setup.png index 2152f92daadf3c81e1885da50bd167888abda6ff..c4ee5d6a7ddfacffe7197ffafddabe73eff2ba40 100644 GIT binary patch literal 4950 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 UtHWs7B>(^b07*qoM6N<$f}=dRfdBvi literal 2681 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 literal 0 HcmV?d00001 From 0a0fa2169631eb398ca673de65e3db9df9d47977 Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Wed, 25 Jun 2025 10:08:39 -0400 Subject: [PATCH 08/11] Apply suggestions from code review Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com> --- .../data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md | 3 +-- content/operate/rc/databases/rdi/view-edit.md | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md index 362f06086b..a5f7447a77 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md @@ -16,8 +16,7 @@ type: integration weight: 2 --- -Follow the steps in the sections below to prepare an [AWS Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) or [AWS RDS MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html) database. -database to work with RDI. +Follow the steps in the sections below to prepare an [AWS Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) or [AWS RDS MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html) database to work with RDI. {{< embed-md "rdi-aur-rds-pub-access.md" >}} diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index d094a07cdb..8ebeea0d01 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -103,7 +103,7 @@ If you selected **Apply to new data changes only**, the data pipeline will enter You can use [Prometheus and Grafana]({{< relref "/integrate/prometheus-with-redis-cloud/" >}}) to track and display metrics for the data pipeline. -To view the metrics endpoints for the source collector and pipeline processor, go to the **Data pipeline** tab and select **More actions**, and then **Show metrics**. You can add these endpoints as a Prometheus target to start tracking your RDI metrics. +To view the metrics endpoints for the source collector and pipeline processor, go to the **Data pipeline** tab and select **More actions**, and then **Show metrics**. You can add these endpoints as Prometheus targets to start tracking your RDI metrics. Prometheus endpoints are exposed on Redis Cloud's internal network. To access this network, enable [VPC peering]({{< relref "/operate/rc/security/vpc-peering" >}}) or [AWS Transit Gateway]({{< relref "/operate/rc/security/aws-transit-gateway" >}}). See [Prometheus and Grafana with Redis Cloud]({{< relref "/integrate/prometheus-with-redis-cloud/" >}}) for more information. From 09207e426f477bd0c901bea2e8d5f8234f3147b7 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Wed, 25 Jun 2025 10:11:34 -0400 Subject: [PATCH 09/11] Revert "Publicly accessible setting" This reverts commit 8474da5c5963d959fa86acff084da4d0dc79c0b6. --- content/embeds/rdi-aur-rds-pub-access.md | 5 ----- .../prepare-dbs/aws-aurora-rds/aws-aur-mysql.md | 2 -- .../prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md | 2 -- .../prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md | 2 -- 4 files changed, 11 deletions(-) delete mode 100644 content/embeds/rdi-aur-rds-pub-access.md diff --git a/content/embeds/rdi-aur-rds-pub-access.md b/content/embeds/rdi-aur-rds-pub-access.md deleted file mode 100644 index e0f6b08763..0000000000 --- a/content/embeds/rdi-aur-rds-pub-access.md +++ /dev/null @@ -1,5 +0,0 @@ -## Allow public access - -For [RDI on Redis Cloud]({{< relref "/operate/rc/databases/rdi" >}}), you must allow public access to your source database to allow the proxy to connect to it. - -To do this, [modify the database](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html) and set **Publicly accessible** to **Yes**. \ No newline at end of file diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md index a5f7447a77..6af7feb632 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-mysql.md @@ -18,8 +18,6 @@ weight: 2 Follow the steps in the sections below to prepare an [AWS Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) or [AWS RDS MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html) database to work with RDI. -{{< embed-md "rdi-aur-rds-pub-access.md" >}} - ## Create and apply parameter group RDI requires some changes to database parameters. On AWS RDS and AWS Aurora, you change these parameters via a parameter group. diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md index eab6acaed2..ec2dee5207 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-aur-pgsql.md @@ -23,8 +23,6 @@ Follow the steps in the sections below to prepare an [AWS Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html) or [AWS RDS PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html) database to work with RDI. -{{< embed-md "rdi-aur-rds-pub-access.md" >}} - ## Create and apply parameter group RDI requires some changes to database parameters. On AWS RDS and AWS Aurora, you change these parameters via a parameter group. diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md index 8b7495bccb..5d7dbca456 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/aws-aurora-rds/aws-rds-sqlserver.md @@ -22,8 +22,6 @@ Follow the steps in the sections below to prepare a [Microsoft SQL Server on AWS Change Data Capture (CDC) is not supported on SQL Server Express Edition. Only the Standard, Enterprise, and Developer editions support CDC and are supported by RDI. {{< /note >}} -{{< embed-md "rdi-aur-rds-pub-access.md" >}} - ## Create the Debezium user The Debezium connector needs a user account to connect to SQL Server. This From ba1b5bef8cf04d2e29d969f684184702443844eb Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Wed, 25 Jun 2025 10:44:41 -0400 Subject: [PATCH 10/11] Add multitabs for connectivity setup --- content/operate/rc/databases/rdi/setup.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index e6444315db..d112da7725 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -51,17 +51,21 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio To ensure that you can connect your Redis Cloud database to the source database, you need to set up an endpoint service through AWS PrivateLink. +The following diagram shows the network setup for a database hosted on an AWS EC2 instance. + +{{The network setup for a database hosted on an AWS EC2 instance.}} + +The following diagram shows the network setup for a database hosted on AWS RDS or AWS Aurora. + +{{The network setup for a database hosted on AWS RDS or AWS Aurora.}} + Select the steps for your database setup. {{< multitabs id="rdi-cloud-connectivity" tab1="EC2 instance" tab2="AWS RDS or Aurora" >}} -The following diagram shows the network setup for a database hosted on an AWS EC2 instance. - -{{The network setup for a database hosted on an AWS EC2 instance.}} - -To do this: +To set up PrivateLink for a database hosted on an EC2 instance: 1. [Create a network load balancer](#create-network-load-balancer-ec2) that will route incoming HTTP requests to your database. 1. [Create an endpoint service](#create-endpoint-service-ec2) through AWS PrivateLink. @@ -115,11 +119,7 @@ For more details on AWS PrivateLink, see [Share your services through AWS Privat --tab-sep-- -The following diagram shows the network setup for a database hosted on AWS RDS or AWS Aurora. - -{{The network setup for a database hosted on AWS RDS or AWS Aurora.}} - -To do this: +To set up PrivateLink for a database hosted on AWS RDS or AWS Aurora: 1. [Create an RDS Proxy](#create-rds-proxy) that will route requests to your database. 1. [Create a network load balancer](#create-network-load-balancer-rds) that will route incoming HTTP requests to the RDS proxy. From b45447fd3e323bbac71848cf973fbe81778a22ba Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Wed, 25 Jun 2025 11:05:15 -0400 Subject: [PATCH 11/11] Change diagram captions --- content/operate/rc/databases/rdi/setup.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index d112da7725..afd09417f5 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -51,13 +51,15 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio To ensure that you can connect your Redis Cloud database to the source database, you need to set up an endpoint service through AWS PrivateLink. -The following diagram shows the network setup for a database hosted on an AWS EC2 instance. +The following diagrams show the network setup for the different database setups: -{{The network setup for a database hosted on an AWS EC2 instance.}} +- Database hosted on an AWS EC2 instance: -The following diagram shows the network setup for a database hosted on AWS RDS or AWS Aurora. + {{The network setup for a database hosted on an AWS EC2 instance.}} -{{The network setup for a database hosted on AWS RDS or AWS Aurora.}} +- Database hosted on AWS RDS or AWS Aurora: + + {{The network setup for a database hosted on AWS RDS or AWS Aurora.}} Select the steps for your database setup.