RDS for PostgreSQL - Amazon OpenSearch Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

RDS for PostgreSQL

Amazon RDS for RDS for PostgreSQL で OpenSearch Ingestion パイプラインを設定するには、次の手順を実行します。

RDS for PostgreSQL の前提条件

OpenSearch Ingestion パイプラインを作成する前に、次の手順を実行します。

  1. Amazon RDS でカスタム DB パラメータグループを作成して、論理レプリケーションを設定します。

    rds.logical_replication=1

    詳細については、「Amazon RDS for PostgreSQL の論理レプリケーションの実行」を参照してください。

  2. RDS for PostgreSQL DB インスタンスを選択または作成し、ステップ 1 で作成したパラメータグループを DB インスタンスに関連付けます。

  3. Aurora および でのパスワード管理を使用して、Amazon RDS AWS Secrets Managerインスタンスでユーザー名とパスワード認証を設定します。Secrets Manager シークレットを作成することで、ユーザー名とパスワードの組み合わせを作成することもできます。

  4. 完全な初期スナップショット機能を使用する場合は、 AWS KMS key と Amazon RDS から Amazon S3 にデータをエクスポートするための IAM ロールを作成します。

    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 コレクションを選択または作成します。詳細については、「Creating OpenSearch Service domains」および「Creating collections」を参照してください。

  6. リソースベースのポリシーをドメインにアタッチするか、データアクセスポリシーをコレクションにアタッチします。これらのアクセスポリシーにより、OpenSearch Ingestion は Amazon RDS DB インスタンスからドメインまたはコレクションにデータを書き込むことができます。

ステップ 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: パイプラインを作成する

ソースとして RDS for PostgreSQL インスタンスを指定する OpenSearch Ingestion パイプラインを次のように設定します。

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 と同じである必要があります。次に、1 つ以上のサブネットと 1 つ以上の VPC セキュリティグループを選択します。パイプラインには Aurora MySQL データベースへのネットワークアクセスが必要なため、パイプラインの VPC セキュリティグループからデータベースポートへのインバウンドトラフィックを許可する VPC セキュリティグループが Aurora クラスターに設定されていることも確認する必要があります。詳細については、「セキュリティグループによるアクセスの制御」を参照してください。

を使用してパイプライン AWS Management Console を作成する場合は、ソースとして Amazon Aurora を使用するには、パイプラインを VPC にアタッチする必要があります。これを行うには、ネットワーク設定セクションを見つけ、VPC にアタッチを選択し、提供されているデフォルトオプションのいずれかから CIDR を選択するか、独自のものを選択します。RFC 1918 のベストカレントプラクティスで定義されているように、プライベートアドレス空間から任意の CIDR を使用できます。

カスタム CIDR を指定するには、ドロップダウンメニューから [その他] を選択します。OpenSearch Ingestion と Amazon RDS 間の IP アドレスの衝突を回避するには、Amazon Aurora VPC CIDR が OpenSearch Ingestion の CIDR と異なることを確認してください。

詳細については、「Configuring VPC access for a pipeline」を参照してください。

データ整合性

パイプラインは、Amazon RDS インスタンスから変更を継続的にポーリングまたは受信し、OpenSearch インデックス内の対応するドキュメントを更新することで、データ整合性を確保します。

OpenSearch Ingestion は、データの耐久性を確保するためにエンドツーエンドの確認応答をサポートしています。パイプラインがスナップショットまたはストリームを読み取る際に、並列処理用のパーティションが動的に作成されます。パイプラインは、OpenSearch ドメインまたはコレクション内のすべてのレコードを取り込んだ後に確認応答を受信すると、パーティションを完了としてマークします。OpenSearch Serverless 検索コレクションに取り込みたい場合は、パイプラインでドキュメント ID を生成できます。OpenSearch Serverless 時系列コレクションに取り込む場合は、パイプラインがドキュメント ID を生成しないため、パイプラインシンク設定document_id: "${getMetadata(\"primary_key\")}"で を省略する必要があることに注意してください。

また、OpenSearch Ingestion パイプラインは、着信イベントアクションを、対応する一括インデックス作成アクションにマッピングして、ドキュメントの取り込みをサポートします。これによりデータの整合性が保たれるため、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 double またはキーワード
数値[ (p, s) ] text double またはキーワード
real float フロート
double precision フロート double
smallserial long short
シリアル long integer
bigserial long long
money オブジェクト オブジェクト
character varying(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 バイナリ
timestamp [ (p) ] [タイムゾーンなし ] long (エポックミリ秒単位) date
timestamp [ (p) ] とタイムゾーン long (エポックミリ秒単位) date
date long (エポックミリ秒単位) date
time [ (p) ] [ without time zone ] long (エポックミリ秒単位) date
time [ (p) ] とタイムゾーン long (エポックミリ秒単位) date
interval [ フィールド ] [ (p) ] text (ISO8601 形式) text
boolean boolean boolean
point text (WKT 形式) geo_shape
LINE text (WKT 形式) geo_shape
lseg text (WKT 形式) geo_shape
ボックス text (WKT 形式) geo_shape
パス text (WKT 形式) geo_shape
Polygon (ポリゴン) text (WKT 形式) geo_shape
オブジェクト オブジェクト
cidr text text
inet text text
macaddr text text
macaddr8 text text
bit(n) long バイト、ショート、整数、ロング (ビット数によって異なります)
bit varying(n) long バイト、ショート、整数、ロング (ビット数によって異なります)
json オブジェクト オブジェクト
JSONB オブジェクト オブジェクト
jsonpath text text

OpenSearch Ingestion パイプラインでデッドレターキュー (DLQ) を設定することをお勧めします。キューが設定済みである場合、OpenSearch Service は、動的マッピングの失敗により取り込めなかったすべての失敗したドキュメントをキューに送信します。

自動マッピングが失敗した場合は、パイプライン設定で template_typetemplate_content を使用して明示的なマッピングルールを定義できます。あるいは、パイプラインを開始する前に、検索ドメインまたはコレクションにマッピングテンプレートを直接作成することもできます。

制限

RDS for PostgreSQL の OpenSearch Ingestion パイプラインを設定するときは、次の制限を考慮してください。

  • 統合は、パイプラインごとに 1 つの PostgreSQL データベースのみをサポートします。

  • 統合は現在、クロスリージョンデータインジェストをサポートしていません。Amazon RDS インスタンスと OpenSearch ドメインは同じ に存在する必要があります AWS リージョン。

  • 統合は現在、クロスアカウントデータインジェストをサポートしていません。Amazon RDS インスタンスと OpenSearch Ingestion パイプラインは同じ に存在する必要があります AWS アカウント。

  • Amazon RDS インスタンスで AWS Secrets Manager、サポートされている唯一の認証メカニズムである を使用して認証が有効になっていることを確認します。

  • 既存のパイプライン設定を更新して、別のデータベースや別のテーブルからデータを取り込むことはできません。パイプラインのデータベースやテーブル名を更新するには、パイプラインを停止して、更新された設定で再起動するか、新しいパイプラインを作成する必要があります。

  • データ定義言語 (DDL) ステートメントは通常サポートされていません。以下の場合、データ整合性は維持されません。

    • プライマリキーが変更されます (add/delete/rename)。

    • テーブルは削除/切り捨てられます。

    • 列名またはデータ型が変更されます。

  • 同期する PostgreSQL テーブルにプライマリキーが定義されていない場合、データ整合性は保証されません。更新/削除を OpenSearch に同期できるようにするには、OpenSearch とシンク設定でカスタム document_idオプションを適切に定義する必要があります OpenSearch 。

  • RDS マルチ AZ DB クラスターはサポートされていません。

  • サポートされているバージョン: PostgreSQL 16 以降。

推奨される CloudWatch アラーム

取り込みパイプラインのパフォーマンスをモニタリングするには、次の CloudWatch メトリクスをお勧めします。これらのメトリクスは、エクスポートから処理されたデータの量、ストリームから処理されたイベントの数、エクスポートとストリームイベントの処理エラー、および送信先に書き込まれたドキュメントの数を特定するのに役立ちます。これらのメトリクスの 1 つが、指定された時間にわたって指定された値を超えた場合にアクションを実行するように 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 このメトリクスは、ストリームから処理に失敗したレコードの合計数を示します。