RDS for PostgreSQL - Amazon OpenSearch Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

RDS for PostgreSQL

完成下列步驟,以使用 Amazon RDS for RDS for PostgreSQL 設定 OpenSearch 擷取管道。

RDS for PostgreSQL 先決條件

建立 OpenSearch Ingestion 管道之前,請執行下列步驟:

  1. 在 Amazon RDS 中建立自訂資料庫參數群組,以設定邏輯複寫。

    rds.logical_replication=1

    如需詳細資訊,請參閱執行 Amazon RDS for PostgreSQL 的邏輯複寫

  2. 選取或建立 RDS for PostgreSQL 資料庫執行個體,並將步驟 1 中建立的參數群組與資料庫執行個體建立關聯。

  3. 使用密碼管理搭配 Aurora AWS Secrets Manager 和 在 Amazon RDS 執行個體上設定使用者名稱和密碼身分驗證。您也可以建立 Secrets Manager 秘密來建立使用者名稱/密碼組合。

  4. 如果您使用完整的初始快照功能,請建立 AWS KMS key 和 IAM 角色,以將資料從 Amazon RDS 匯出到 Amazon S3。

    IAM 角色應具有下列許可政策:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExportPolicy", "Effect": "Allow", "Action": [ "s3:PutObject*", "s3:ListBucket", "s3:GetObject*", "s3:DeleteObject*", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::s3-bucket-used-in-pipeline", "arn:aws:s3:::s3-bucket-used-in-pipeline/*" ] } ] }

    此角色也應該具有下列信任關係:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "export.rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  5. 選取或建立 OpenSearch Service 網域或 OpenSearch Serverless 集合。如需詳細資訊,請參閱建立 OpenSearch Service 網域建立集合

  6. 資源型政策連接至您的網域,或將資料存取政策連接至您的集合。這些存取政策允許 OpenSearch Ingestion 將資料從 Amazon RDS 資料庫執行個體寫入您的網域或集合。

步驟 1:設定管道角色

設定 Amazon RDS 管道先決條件之後,請將管道角色設定為在管道組態中使用。同時將 Amazon RDS 來源的下列許可新增至角色:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allowReadingFromS3Buckets", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::s3_bucket", "arn:aws:s3:::s3_bucket/*" ] }, { "Sid": "allowNetworkInterfacesGroup1", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:CreateNetworkInterfacePermission" ], "Resource": [ "arn:aws:ec2:*:account-id:network-interface/*", "arn:aws:ec2:*:account-id:subnet/*", "arn:aws:ec2:*:account-id:security-group/*" ] }, { "Sid": "allowNetworkInterfacesGroup2", "Effect": "Allow", "Action": [ "ec2:AttachNetworkInterface", "ec2:CreateNetworkInterface", "ec2:CreateNetworkInterfacePermission", "ec2:DeleteNetworkInterface", "ec2:DeleteNetworkInterfacePermission", "ec2:DetachNetworkInterface", "ec2:DescribeNetworkInterfaces" ], "Resource": [ "arn:aws:ec2:*:account-id:network-interface/*", "arn:aws:ec2:*:account-id:subnet/*", "arn:aws:ec2:*:account-id:security-group/*" ], "Condition": { "StringEquals": { "aws:RequestTag/OSISManaged": "true" } } }, { "Sid": "allowDescribeEC2", "Effect": "Allow", "Action": [ "ec2:Describe*" ], "Resource": "*" }, { "Sid": "allowTagCreation", "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:*:account-id:network-interface/*", "Condition": { "StringEquals": { "aws:RequestTag/OSISManaged": "true" } } }, { "Sid": "AllowDescribeInstances", "Effect": "Allow", "Action": [ "rds:DescribeDBInstances" ], "Resource": [ "arn:aws:rds:region:account-id:db:*" ] }, { "Sid": "AllowDescribeClusters", "Effect": "Allow", "Action": [ "rds:DescribeDBClusters" ], "Resource": [ "arn:aws:rds:region:account-id:cluster:DB-id" ] }, { "Sid": "AllowSnapshots", "Effect": "Allow", "Action": [ "rds:DescribeDBClusterSnapshots", "rds:CreateDBClusterSnapshot", "rds:AddTagsToResource" ], "Resource": [ "arn:aws:rds:region:account-id:cluster:DB-id", "arn:aws:rds:region:account-id:cluster-snapshot:DB-id*" ] }, { "Sid": "AllowExport", "Effect": "Allow", "Action": [ "rds:StartExportTask" ], "Resource": [ "arn:aws:rds:region:account-id:cluster:DB-id", "arn:aws:rds:region:account-id:cluster-snapshot:DB-id*" ] }, { "Sid": "AllowDescribeExports", "Effect": "Allow", "Action": [ "rds:DescribeExportTasks" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "region", "aws:ResourceAccount": "account-id" } } }, { "Sid": "AllowAccessToKmsForExport", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:DescribeKey", "kms:RetireGrant", "kms:CreateGrant", "kms:ReEncrypt*", "kms:GenerateDataKey*" ], "Resource": [ "arn:aws:kms:region:account-id:key/export-key-id" ], }, { "Sid": "AllowPassingExportRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::account-id:role/export-role" ] }, { "Sid": "SecretsManagerReadAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:*:account-id:secret:*" ] } ] }

步驟 2:建立管道

如下所示設定 OpenSearch Ingestion 管道,指定 RDS for PostgreSQL 執行個體做為來源。

version: "2" rds-postgres-pipeline: source: rds: db_identifier: "instance-id" engine: postgresql database: "database-name" tables: include: - "schema1.table1" - "schema2.table2" s3_bucket: "bucket-name" s3_region: "bucket-region" s3_prefix: "prefix-name" export: kms_key_id: "kms-key-id" iam_role_arn: "export-role-arn" stream: true aws: sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role" region: "us-east-1" authentication: username: ${{aws_secrets:secret:username}} password: ${{aws_secrets:secret:password}} sink: - opensearch: hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"] index: "${getMetadata(\"table_name\")}" index_type: custom document_id: "${getMetadata(\"primary_key\")}" action: "${getMetadata(\"opensearch_action\")}" document_version: "${getMetadata(\"document_version\")}" document_version_type: "external" aws: sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role" region: "us-east-1" extension: aws: secrets: secret: secret_id: "rds-secret-id" region: "us-east-1" sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role" refresh_interval: PT1H
注意

您可以使用預先設定的 Amazon RDS 藍圖來建立此管道。如需詳細資訊,請參閱使用藍圖

若要使用 Amazon Aurora 做為來源,您需要設定管道的 VPC 存取。您選擇的 VPC 應與 Amazon Aurora 來源使用的 VPC 相同。然後選擇一或多個子網路和一或多個 VPC 安全群組。請注意,管道需要網路存取 Aurora MySQL 資料庫,因此您也應該確認您的 Aurora 叢集已設定 VPC 安全群組,允許從管道的 VPC 安全群組到資料庫連接埠的傳入流量。如需詳細資訊,請參閱使用安全群組控制存取

如果您使用 AWS Management Console 建立管道,也必須將管道連接至 VPC,才能使用 Amazon Aurora 做為來源。若要執行此操作,請尋找網路組態區段,選擇連接至 VPC,然後從其中一個提供的預設選項中選擇 CIDR,或選取您自己的選項。您可以從私有地址空間使用任何 CIDR,如 RFC 1918 最佳實務所定義。

若要提供自訂 CIDR,請從下拉式功能表中選取其他。若要避免 OpenSearch Ingestion 和 Amazon RDS 之間的 IP 地址發生衝突,請確定 Amazon Aurora VPC CIDR 與 OpenSearch Ingestion 的 CIDR 不同。

如需詳細資訊,請參閱設定管道的 VPC 存取

資料一致性

管道會持續輪詢或接收來自 Amazon RDS 執行個體的變更,並更新 OpenSearch 索引中的對應文件,以確保資料一致性。

OpenSearch Ingestion end-to-end確認,以確保資料耐久性。當管道讀取快照或串流時,它會動態建立分割區以進行平行處理。在擷取 OpenSearch 網域或集合中的所有記錄之後,管道收到確認時,會將分割區標記為完成。如果您想要擷取到 OpenSearch Serverless 搜尋集合,您可以在管道中產生文件 ID。如果您想要擷取 OpenSearch Serverless 時間序列集合,請注意管道不會產生文件 ID,因此您必須在管道接收器組態document_id: "${getMetadata(\"primary_key\")}"中省略 。

OpenSearch 擷取管道也會將傳入的事件動作映射至對應的大量索引動作,以協助擷取文件。這可讓資料保持一致,以便 Amazon RDS 中的每個資料變更都與 OpenSearch 中的對應文件變更進行協調。

映射資料類型

OpenSearch Ingestion 管道會將 PostgreSQL 資料類型映射至適合 OpenSearch Service 網域或集合使用的表示法。如果 OpenSearch 中未定義映射範本,則 OpenSearch 會根據第一個傳送的文件自動判斷具有動態映射的欄位類型。您也可以透過映射範本,明確定義最適合您在 OpenSearch 中的欄位類型。

下表列出 RDS for PostgreSQL 資料類型和對應的 OpenSearch 欄位類型。如果未定義明確的映射,預設 OpenSearch 欄位類型欄會顯示 OpenSearch 中的對應欄位類型。在此情況下,OpenSearch 會自動判斷具有動態映射的欄位類型。建議的 OpenSearch 欄位類型欄是對應範本中明確指定的對應建議欄位類型。這些欄位類型與 RDS for PostgreSQL 中的資料類型更緊密一致,通常可以啟用 OpenSearch 中可用的更佳搜尋功能。

RDS for PostgreSQL 資料類型 預設 OpenSearch 欄位類型 建議的 OpenSearch 欄位類型
smallint long short
integer long integer
bigint long long
decimal text 雙 或 關鍵字
numeric【 (p, s) 】 text 雙 或 關鍵字
real float float
double precision float double
smallserial long short
serial long integer
大序列 long long
money object object
字元變體 (n) text text
varchar(n) text text
character(n) text text
char(n) text text
bpchar(n) text text
bpchar text text
text text text
enum text text
bytea text binary
時間戳記 【 (p) 】 【不含時區 】 長 (以 epoch 毫秒為單位) date
時間戳記 【 (p) 】 與時區 長 (以 epoch 毫秒為單位) date
date 長 (以 epoch 毫秒為單位) date
time 【 (p) 】 【無時區 】 長 (以 epoch 毫秒為單位) date
time 【 (p) 】 與時區 長 (以 epoch 毫秒為單位) date
間隔 【 欄位 】 【 (p) 】 text (ISO8601 格式) text
boolean boolean boolean
point text (WKT 格式) geo_shape
text (WKT 格式) geo_shape
lseg text (WKT 格式) geo_shape
方塊 text (WKT 格式) geo_shape
路徑 text (WKT 格式) geo_shape
多邊形 text (WKT 格式) geo_shape
圓圈 object object
cidr text text
inet text text
macaddr text text
macaddr8 text text
bit(n) long 位元組、短、整數或長 (取決於位元數)
位元變化 (n) long 位元組、短、整數或長 (取決於位元數)
json object object
jsonb object object
jsonpath text text

我們建議您在 OpenSearch Ingestion 管道中設定無效字母佇列 (DLQ)。如果您已設定佇列,OpenSearch Service 會將因動態映射失敗而無法擷取的所有失敗文件傳送至佇列。

如果自動映射失敗,您可以在管道組態template_content中使用 template_type和 來定義明確的映射規則。或者,您可以在啟動管道之前,直接在搜尋網域或集合中建立映射範本。

限制

當您為 RDS for PostgreSQL 設定 OpenSearch 擷取管道時,請考慮下列限制:

  • 整合每個管道僅支援一個 PostgreSQL 資料庫。

  • 整合目前不支援跨區域資料擷取;您的 Amazon RDS 執行個體和 OpenSearch 網域必須位於相同的 中 AWS 區域。

  • 整合目前不支援跨帳戶資料擷取;您的 Amazon RDS 執行個體和 OpenSearch Ingestion 管道必須位於相同的 中 AWS 帳戶。

  • 確保 Amazon RDS 執行個體已使用 啟用身分驗證 AWS Secrets Manager,這是唯一支援的身分驗證機制。

  • 現有的管道組態無法更新,無法從不同的資料庫和/或不同的資料表擷取資料。若要更新管道的資料庫和/或資料表名稱,您必須停止管道,並使用更新的組態重新啟動管道,或建立新的管道。

  • 通常不支援資料定義語言 (DDL) 陳述式。如果符合下列條件,將不會維持資料一致性:

    • 主索引鍵已變更 add/delete/rename)。

    • 資料表遭到捨棄/截斷。

    • 資料欄名稱或資料類型已變更。

  • 如果要同步的 PostgreSQL 資料表未定義主索引鍵,則不保證資料一致性。您需要正確定義 OpenSearch 和接收器組態中的自訂document_id選項,才能將更新/刪除同步至 OpenSearch。

  • 不支援 RDS 多可用區域資料庫叢集。

  • 支援的版本:PostgreSQL 16 和更新版本。

建議的 CloudWatch 警示

建議使用下列 CloudWatch 指標來監控擷取管道的效能。這些指標可協助您識別從匯出處理的資料量、從串流處理的事件數、處理匯出和串流事件的錯誤,以及寫入目的地的文件數。您可以設定 CloudWatch 警示,在其中一個指標在指定的時間內超過指定的值時執行動作。

指標 描述
pipeline-name.rds.credentialsChanged 此指標表示 AWS 秘密輪換的頻率。
pipeline-name.rds.executorRefreshErrors 此指標表示重新整理 AWS 秘密失敗。
pipeline-name.rds.exportRecordsTotal 此指標表示從 Amazon Aurora 匯出的記錄數目。
pipeline-name.rds.exportRecordsProcessed 此指標表示 OpenSearch Ingestion 管道處理的記錄數量。
pipeline-name.rds.exportRecordProcessingErrors 此指標表示從 Amazon Aurora 叢集讀取資料時OpenSearch Ingestion 管道中的處理錯誤數目。
pipeline-name.rds.exportRecordsSuccessTotal 此指標表示成功處理的匯出記錄總數。
pipeline-name.rds.exportRecordsFailedTotal 此指標表示無法處理的匯出記錄總數。
pipeline-name.rds.bytesReceived 此指標表示 OpenSearch Ingestion 管道收到的位元組總數。
pipeline-name.rds.bytesProcessed 此指標表示 OpenSearch Ingestion 管道處理的位元組總數。
pipeline-name.rds.streamRecordsSuccessTotal 此指標表示從串流成功處理的記錄數量。
pipeline-name.rds.streamRecordsFailedTotal 此指標表示無法從串流處理的記錄總數。