RDS for MySQL - Amazon OpenSearch Service

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

RDS for MySQL

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

RDS for MySQL の前提条件

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

  1. Amazon RDS でカスタム DB パラメータグループを作成してバイナリログ記録を設定し、次のパラメータを設定します。

    binlog_format=ROW binlog_row_image=full binlog_row_metadata=FULL

    さらに、 binlog_row_value_optionsパラメータが に設定されていないことを確認しますPARTIAL_JSON

    詳細については、「RDS for MySQL バイナリログ記録の設定」を参照してください。

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

  3. データベースで自動バックアップが有効になっていることを確認します。詳細については、「自動バックアップの有効化」を参照してください。

  4. 24 時間など、レプリケーションが発生するのに十分な時間でバイナリログの保持を設定します。詳細については、「Amazon RDS ユーザーガイド」の「バイナリログ設定の設定と表示」を参照してください。

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

  6. 完全な初期スナップショット機能を使用する場合は、 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" } ] }
  7. OpenSearch Service ドメインまたは OpenSearch Serverless コレクションを選択または作成します。詳細については、「Creating OpenSearch Service domains」および「Creating collections」を参照してください。

  8. リソースベースのポリシーをドメインにアタッチするか、データアクセスポリシーをコレクションにアタッチします。これらのアクセスポリシーにより、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: パイプラインを作成する

次のような OpenSearch Ingestion パイプラインを設定します。サンプルパイプラインは、Amazon RDS インスタンスをソースとして指定します。

version: "2" rds-mysql-pipeline: source: rds: db_identifier: "instance-id" engine: mysql database: "database-name" tables: include: - "table1" - "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 RDS 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 パイプラインは、MySQL データ型を、消費する OpenSearch Service ドメインまたはコレクションに適した表現にマッピングします。OpenSearch でマッピングテンプレートが定義されていない場合、OpenSearch は最初に送信されたドキュメントに基づいて動的マッピングを持つフィールドタイプを自動的に決定します。マッピングテンプレートを使用して、OpenSearch で最適なフィールドタイプを明示的に定義することもできます。

次の表に、MySQL データ型と対応する OpenSearch フィールド型を示します。明示的なマッピングが定義されていない場合、デフォルトの OpenSearch フィールドタイプ列には OpenSearch の対応するフィールドタイプが表示されます。この場合、OpenSearch は動的マッピングを使用してフィールドタイプを自動的に決定します。推奨 OpenSearch フィールドタイプ列は、マッピングテンプレートで明示的に指定することが推奨される対応するフィールドタイプです。これらのフィールドタイプは MySQL のデータ型とより密接に連携しており、通常、OpenSearch で使用できる検索機能を改善できます。

MySQL のデータ型 デフォルトの OpenSearch フィールドタイプ 推奨される OpenSearch フィールドタイプ
BIGINT long long
BIGINT UNSIGNED long 符号なしロング
BIT long ビット数に応じてバイト、ショート、整数、ロング
DECIMAL text double またはキーワード
DOUBLE フロート double
FLOAT フロート フロート
INT long integer
INT UNSIGNED long long
MEDIUMINT long integer
MEDIUMINT UNSIGNED long integer
NUMERIC text double またはキーワード
SMALLINT long short
SMALLINT UNSIGNED long integer
TINYINT long バイト
TINYINT UNSIGNED long short
BINARY text バイナリ
BLOB text バイナリ
CHAR text text
ENUM text キーワード
LONGBLOB text バイナリ
LONGTEXT text text
MEDIUMBLOB text バイナリ
MEDIUMTEXT text text
SET text キーワード
TEXT text text
TINYBLOB text バイナリ
TINYTEXT text text
VARBINARY text バイナリ
VARCHAR text text
DATE long (エポックミリ秒単位) date
DATETIME long (エポックミリ秒単位) date
TIME long (エポックミリ秒単位) date
TIMESTAMP long (エポックミリ秒単位) date
YEAR long (エポックミリ秒単位) date
GEOMETRY text (WKT 形式) geo_shape
GEOMETRYCOLLECTION text (WKT 形式) geo_shape
LINESTRING text (WKT 形式) geo_shape
MULTILINESTRING text (WKT 形式) geo_shape
MULTIPOINT text (WKT 形式) geo_shape
MULTIPOLYGON text (WKT 形式) geo_shape
POINT text (WKT 形式) geo_point または geo_shape
POLYGON text (WKT 形式) geo_shape
JSON text オブジェクト

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

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

制限

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

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

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

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

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

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

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

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

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

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

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

  • カスケード削除アクションを使用した外部キー参照はサポートされていないため、RDS for MySQL と OpenSearch の間でデータの不整合が発生する可能性があります。

  • Amazon RDS マルチアベイラビリティーゾーン DB クラスターはサポートされていません。

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

推奨される 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 このメトリクスは、ストリームから処理に失敗したレコードの合計数を示します。