

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

# RDS for MySQL
<a name="rds-mysql"></a>

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

**Topics**
+ [RDS for MySQL 先決條件](#rds-mysql-prereqs)
+ [步驟 1：設定管道角色](#rds-mysql-pipeline-role)
+ [步驟 2：建立管道](#rds-mysql-pipeline)
+ [資料一致性](#rds-mysql-pipeline-consistency)
+ [映射資料類型](#rds-mysql-pipeline-mapping)
+ [限制](#rds-mysql-pipeline-limitations)
+ [建議的 CloudWatch 警示](#aurora-mysql-pipeline-metrics)

## RDS for MySQL 先決條件
<a name="rds-mysql-prereqs"></a>

建立 OpenSearch Ingestion 管道之前，請執行下列步驟：

1. 在 Amazon RDS 中建立自訂資料庫參數群組，以設定二進位記錄並設定下列參數。

   ```
   binlog_format=ROW
   binlog_row_image=full
   binlog_row_metadata=FULL
   ```

   此外，請確定 `binlog_row_value_options` 參數未設定為 `PARTIAL_JSON`。

   如需詳細資訊，請參閱[設定 RDS for MySQL 二進位記錄](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.BinaryFormat.html)。

1. [選取或建立 RDS for MySQL 資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)，並將上一個步驟中建立的參數群組與資料庫執行個體建立關聯。

1. 確認資料庫上已啟用自動備份。如需詳細資訊，請參閱[啟用自動備份](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.Enabling.html)。

1. 設定具有足夠時間進行複寫的二進位日誌保留，例如 24 小時。如需詳細資訊，請參閱《*Amazon RDS 使用者指南*》中的[設定和顯示二進位日誌組態](https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/mysql-stored-proc-configuring.html)。

1. 使用 Amazon RDS 和 [的密碼管理，在您的 Amazon RDS AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html)執行個體上設定使用者名稱和密碼身分驗證。您也可以建立 [Secrets Manager 秘密來建立](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)使用者名稱/密碼組合。

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

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

------
#### [ JSON ]

****  

   ```
   {
       "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/*"
               ]
           }
       ]
   }
   ```

------

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

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "export.rds.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 選取或建立 OpenSearch Service 網域或 OpenSearch Serverless 集合。如需詳細資訊，請參閱[建立 OpenSearch Service 網域](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains)和[建立集合](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)。

1. 將[資源型政策](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)連接至您的網域，或將[資料存取政策](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)連接至您的集合。這些存取政策允許 OpenSearch Ingestion 將資料從 Amazon RDS 資料庫執行個體寫入您的網域或集合。

## 步驟 1：設定管道角色
<a name="rds-mysql-pipeline-role"></a>

設定 Amazon RDS 管道先決條件之後，[請將管道角色設定為](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)在管道組態中使用。同時將 Amazon RDS 來源的下列許可新增至角色：

------
#### [ JSON ]

****  

```
{
    "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": "allowNetworkInterfacesActions",
    "Effect": "Allow",
    "Action": [
    "ec2:AttachNetworkInterface",
    "ec2:CreateNetworkInterface",
    "ec2:CreateNetworkInterfacePermission",
    "ec2:DeleteNetworkInterface",
    "ec2:DeleteNetworkInterfacePermission",
    "ec2:DetachNetworkInterface",
    "ec2:DescribeNetworkInterfaces"
    ],
    "Resource": [
    "arn:aws:ec2:*:111122223333:network-interface/*",
    "arn:aws:ec2:*:111122223333:subnet/*",
    "arn:aws:ec2:*:111122223333:security-group/*"
    ]
    },
    {
    "Sid": "allowDescribeEC2",
    "Effect": "Allow",
    "Action": [
    "ec2:Describe*"
    ],
    "Resource": "*"
    },
    {
    "Sid": "allowTagCreation",
    "Effect": "Allow",
    "Action": [
    "ec2:CreateTags"
    ],
    "Resource": "arn:aws:ec2:*:111122223333:network-interface/*",
    "Condition": {
    "StringEquals": {
    "aws:RequestTag/OSISManaged": "true"
    }
    }
    },
    {
    "Sid": "AllowDescribeInstances",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBInstances"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:*"
    ]
    },
    {
    "Sid": "AllowSnapshots",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBSnapshots",
    "rds:CreateDBSnapshot",
    "rds:AddTagsToResource"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:DB-id",
    "arn:aws:rds:us-east-2:111122223333:snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowExport",
    "Effect": "Allow",
    "Action": [
    "rds:StartExportTask"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowDescribeExports",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeExportTasks"
    ],
    "Resource": "*",
    "Condition": {
    "StringEquals": {
    "aws:RequestedRegion": "us-east-2",
    "aws:ResourceAccount": "111122223333"
    }
    }
    },
    {
    "Sid": "AllowAccessToKmsForExport",
    "Effect": "Allow",
    "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:RetireGrant",
    "kms:CreateGrant",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*"
    ],
    "Resource": [
    "arn:aws:kms:us-east-2:111122223333:key/export-key-id"
    ]
    },
    {
    "Sid": "AllowPassingExportRole",
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": [
    "arn:aws:iam::111122223333:role/export-role"
    ]
    },
    {
    "Sid": "SecretsManagerReadAccess",
    "Effect": "Allow",
    "Action": [
    "secretsmanager:GetSecretValue"
    ],
    "Resource": [
    "arn:aws:secretsmanager:*:111122223333:secret:*"
    ]
    }
    ]
    }
```

------

## 步驟 2：建立管道
<a name="rds-mysql-pipeline"></a>

設定類似下列的 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 藍圖來建立此管道。如需詳細資訊，請參閱[使用藍圖](pipeline-blueprint.md)。

若要使用 Amazon Aurora 做為來源，您需要設定管道的 VPC 存取。您選擇的 VPC 應與 Amazon Aurora 來源使用的 VPC 相同。然後選擇一或多個子網路和一或多個 VPC 安全群組。請注意，管道需要網路存取 Aurora MySQL 資料庫，因此您也應該確認您的 Aurora 叢集已設定 VPC 安全群組，允許從管道的 VPC 安全群組到資料庫連接埠的傳入流量。如需詳細資訊，請參閱[使用安全群組控制存取](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Overview.RDSSecurityGroups.html)。

如果您使用 AWS 管理主控台 建立管道，也必須將管道連接至 VPC，才能使用 Amazon Aurora 做為來源。若要這樣做，請尋找**網路組態**區段，選擇**連接至 VPC**，然後從其中一個提供的預設選項中選擇 CIDR，或選取您自己的選項。您可以從私有地址空間使用任何 CIDR，如 [RFC 1918 最佳實務](https://datatracker.ietf.org/doc/html/rfc1918)所定義。

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

如需詳細資訊，請參閱[設定管道的 VPC 存取](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security.html#pipeline-vpc-configure)。

## 資料一致性
<a name="rds-mysql-pipeline-consistency"></a>

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

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

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

## 映射資料類型
<a name="rds-mysql-pipeline-mapping"></a>

OpenSearch Ingestion 管道會將 MySQL 資料類型映射至適合 OpenSearch Service 網域或集合使用的表示法。如果 OpenSearch 中未定義映射範本，則 OpenSearch 會根據第一個傳送的文件自動判斷具有[動態映射](https://docs.opensearch.org/latest/field-types/#dynamic-mapping)的欄位類型。您也可以透過映射範本，明確定義最適合您在 OpenSearch 中的欄位類型。

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


| MySQL 資料類型 | 預設 OpenSearch 欄位類型 | 建議的 OpenSearch 欄位類型 | 
| --- | --- | --- | 
| BIGINT | long | long | 
| BIGINT UNSIGNED | long | 未簽署的長 | 
| BIT | long | 位元組、短、整數或長，取決於位元數 | 
| DECIMAL | text | 雙 或 關鍵字 | 
| DOUBLE | float | double | 
| FLOAT | float | float | 
| INT | long | integer | 
| INT UNSIGNED | long | long | 
| MEDIUMINT | long | integer | 
| MEDIUMINT UNSIGNED | long | integer | 
| NUMERIC | text | 雙 或 關鍵字 | 
| SMALLINT | long | short | 
| SMALLINT UNSIGNED | long | integer | 
| TINYINT | long | byte | 
| TINYINT UNSIGNED | long | short | 
| BINARY | text | binary | 
| BLOB | text | binary | 
| CHAR | text | text | 
| ENUM | text | 關鍵字 | 
| LONGBLOB | text | binary | 
| LONGTEXT | text | text | 
| MEDIUMBLOB | text | binary | 
| MEDIUMTEXT | text | text | 
| SET | text | 關鍵字 | 
| TEXT | text | text | 
| TINYBLOB | text | binary | 
| TINYTEXT | text | text | 
| VARBINARY | text | binary | 
| VARCHAR | text | text | 
| DATE | 長 （以 epoch 毫秒為單位） | date | 
| DATETIME | 長 （以 epoch 毫秒為單位） | date | 
| TIME | 長 （以 epoch 毫秒為單位） | date | 
| TIMESTAMP | 長 （以 epoch 毫秒為單位） | date | 
| YEAR | 長 （以 epoch 毫秒為單位） | date | 
| GEOMETRY | text (WKT 格式） | geo\$1shape | 
| GEOMETRYCOLLECTION | text (WKT 格式） | geo\$1shape | 
| LINESTRING | text (WKT 格式） | geo\$1shape | 
| MULTILINESTRING | text (WKT 格式） | geo\$1shape | 
| MULTIPOINT | text (WKT 格式） | geo\$1shape | 
| MULTIPOLYGON | text (WKT 格式） | geo\$1shape | 
| POINT | text (WKT 格式） | geo\$1point 或 geo\$1shape | 
| POLYGON | text (WKT 格式） | geo\$1shape | 
| JSON | text | object | 

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

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

## 限制
<a name="rds-mysql-pipeline-limitations"></a>

當您為 RDS for MySQL 設定 OpenSearch 擷取管道時，請考慮下列限制：
+ 整合每個管道僅支援一個 MySQL 資料庫。
+ 整合目前不支援跨區域資料擷取；您的 Amazon RDS 執行個體和 OpenSearch 網域必須位於相同的 中 AWS 區域。
+ 整合目前不支援跨帳戶資料擷取；您的 Amazon RDS 執行個體和 OpenSearch Ingestion 管道必須位於相同的 中 AWS 帳戶。
+ 確保 Amazon RDS 執行個體已使用 Secrets Manager 啟用身分驗證，Secrets Manager 是唯一支援的身分驗證機制。
+ 現有的管道組態無法更新，無法從不同的資料庫和/或不同的資料表擷取資料。若要更新管道的資料庫和/或資料表名稱，您必須建立新的管道。
+ 通常不支援資料定義語言 (DDL) 陳述式。如果符合下列條件，將不會維持資料一致性：
  + 主索引鍵已變更 add/delete/rename)。
  + 資料表遭到捨棄/截斷。
  + 資料欄名稱或資料類型已變更。
+ 如果要同步的 MySQL 資料表未定義主索引鍵，則不保證資料一致性。您需要在 OpenSearch 接收器組態中正確定義自訂`document_id`選項，才能將更新/刪除同步至 OpenSearch。
+ 不支援包含串聯刪除動作的外部金鑰參考，這可能會導致 RDS for MySQL 和 OpenSearch 之間的資料不一致。
+ 不支援 Amazon RDS 多可用區域資料庫叢集。
+ 支援的版本：MySQL 8.0 版和更新版本。

## 建議的 CloudWatch 警示
<a name="aurora-mysql-pipeline-metrics"></a>

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


| 指標 | Description | 
| --- | --- | 
| 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 擷取管道中的處理錯誤數目。 | 
| 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 | 此指標表示無法從串流處理的記錄總數。 | 