

# mysql\_fdw 拡張機能による MySQL データベースの操作
<a name="postgresql-mysql-fdw"></a>

Aurora PostgreSQL DB クラスターから MySQL 互換データベースにアクセスするには、`mysql_fdw` 拡張機能をインストールしそれを使用します。この外部データラッパーを使用すると、RDS for MySQL、Aurora MySQL、MariaDB、その他の MySQL 互換データベースを操作できます。Aurora PostgreSQL DB クラスターから MySQL データベースへの接続は、クライアントとサーバーの設定に応じて、ベストエフォートベースで暗号化されます。ただし、必要に応じて暗号化を強制できます。詳細については、「[拡張機能で転送中の暗号化を使用する](#postgresql-mysql-fdw.encryption-in-transit)」を参照してください。

`mysql_fdw` 拡張機能は、Amazon Aurora PostgreSQL バージョン 15.4、14.9、13.12、12.16、 以降のリリースでサポートされています。MySQL 互換データベースインスタンス上のテーブルに対する RDS for PostgreSQL DB での選択、挿入、更新、および削除をサポートします。

**Topics**
+ [mysql\_fdw 拡張機能を使用するように Aurora PostgreSQL DB をセットアップする](#postgresql-mysql-fdw.setting-up)
+ [例: Aurora PostgreSQL から Aurora MySQL データベースを操作する](#postgresql-mysql-fdw.using-mysql_fdw)
+ [拡張機能で転送中の暗号化を使用する](#postgresql-mysql-fdw.encryption-in-transit)

## mysql\_fdw 拡張機能を使用するように Aurora PostgreSQL DB をセットアップする
<a name="postgresql-mysql-fdw.setting-up"></a>

Aurora PostgreSQL DB クラスターでの `mysql_fdw` 拡張機能のセットアップには、DB クラスターでの拡張機能のロードと、MySQL DB インスタンスへの接続ポイントの作成が関係しています。このタスクでは、MySQL DB インスタンスに関する次の詳細が必要です。
+ ホスト名またはエンドポイント。Aurora MySQL DB クラスターの場合、コンソールを使用してエンドポイントを見つけることができます。[接続とセキュリティ] タブを選択し、[エンドポイントとポート] セクションを確認します。
+ ポート番号。MySQL のデフォルトポート番号は 3306 です。
+ データベースの名前 DB 識別子。

また、MySQL ポート 3306 のセキュリティグループまたはアクセスコントロールリスト (ACL) へのアクセスを提供する必要があります。Aurora PostgreSQL DB クラスターと Aurora MySQL DB クラスターの両方がポート 3306 にアクセスする必要があります。アクセスが正しく設定されていない場合、MySQL 互換テーブルに接続しようとすると、次のようなエラーメッセージが表示されます。

```
ERROR: failed to connect to MySQL: Can't connect to MySQL server on '{{hostname}}.{{aws-region}}.rds.amazonaws.com:3306' (110)
```

次の手順では、ユーザーが (`rds_superuser` アカウントとして) 外部サーバーを作成します。次に、外部サーバーへのアクセスを特定のユーザーに付与します。その後、これらのユーザーは、MySQL DB インスタンスを操作するための適切な MySQL ユーザーアカウントへの独自のマッピングを作成します。

**mysql\_fdw を使用して MySQL データベースサーバーにアクセスするには**

1. `rds_superuser` ロールがあるアカウントを使用して PostgreSQL DB インスタンスを接続します。Aurora PostgreSQL DB クラスター の作成時にデフォルトを受け入れた場合、ユーザー名は `postgres` であり、`psql` コマンドラインツールを使用して次のように接続できます。

   ```
   psql --host={{your-DB-instance}}.{{aws-region}}.rds.amazonaws.com --port=5432 --username=postgres –-password
   ```

1. 次のように `mysql_fdw` 拡張機能をインストールします。

   ```
   postgres=> CREATE EXTENSION mysql_fdw;
   CREATE EXTENSION
   ```

拡張機能が Aurora PostgreSQL DB クラスターにインストールされたら、MySQL データベースへの接続を提供する外部サーバーをセットアップします。

**外部サーバーを作成するには**

Aurora PostgreSQL DB クラスター でこれらのタスクを実行します。このステップは、`rds_superuser`特権 (`postgres` など) があるユーザーとして接続していることを前提としています。

1. Aurora PostgreSQL DB クラスターで外部サーバーを作成します。

   ```
   postgres=> CREATE SERVER {{mysql-db}} FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '{{db-name.111122223333}}.{{aws-region}}.rds.amazonaws.com', port '3306');
   CREATE SERVER
   ```

1. 適切なユーザーに外部サーバーへのアクセスを付与します。これらは、管理者以外のユーザー、つまり、`rds_superuser` ロールのないユーザーである必要があります。

   ```
   postgres=> GRANT USAGE ON FOREIGN SERVER {{mysql-db}} to {{user1}};
   GRANT
   ```

PostgreSQL ユーザーは、外部サーバーを介して MySQL データベースへの独自の接続を作成し、管理します。

## 例: Aurora PostgreSQL から Aurora MySQL データベースを操作する
<a name="postgresql-mysql-fdw.using-mysql_fdw"></a>

Aurora PostgreSQL DB インスタンスにシンプルなテーブルがあると仮定します。Aurora PostgreSQL ユーザーが、そのテーブルで (`SELECT`)、`INSERT`、`UPDATE`、`DELETE` の項目をクエリしたいと思っています。`mysql_fdw` 拡張機能は、前の手順で詳述されているように、RDS for PostgreSQL DB インスタンスで作成された、と仮定します。`rds_superuser` 権限のあるユーザーとして RDS for PostgreSQL DB インスタンスに接続した後、次の手順に進むことができます。

1. Aurora PostgreSQL DB インスタンスで外部サーバーを作成します。

   ```
   test=> CREATE SERVER {{mysqldb}} FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '{{your-DB}}.{{aws-region}}.rds.amazonaws.com', port '3306');
   CREATE SERVER
   ```

1. `rds_superuser` の許可を持たないユーザーに、(例えば `user1` として) 使用を許可します。

   ```
   test=> GRANT USAGE ON FOREIGN SERVER mysqldb TO user1;
   GRANT
   ```

1. {{user1}} として接続し、MySQL ユーザーへのマッピングを作成します。

   ```
   test=> CREATE USER MAPPING FOR {{user1}} SERVER mysqldb OPTIONS (username '{{myuser}}', password '{{mypassword}}');
   CREATE USER MAPPING
   ```

1. MySQL テーブルにリンクされた外部テーブルを作成します。

   ```
   test=> CREATE FOREIGN TABLE {{mytab}} (a int, b text) SERVER mysqldb OPTIONS (dbname 'test', table_name '');
   CREATE FOREIGN TABLE
   ```

1. 外部テーブルに対して単純なクエリを実行します。

   ```
   test=> SELECT * FROM mytab;
   a |   b
   ---+-------
   1 | apple
   (1 row)
   ```

1. MySQL テーブルでのデータの追加、変更、削除を行うことができます。例:

   ```
   test=> INSERT INTO mytab values (2, 'mango');
   INSERT 0 1
   ```

   `SELECT` クエリをもう一度実行して、結果を確認します。

   ```
   test=> SELECT * FROM mytab ORDER BY 1;
    a |   b
   ---+-------
   1 | apple
   2 | mango
   (2 rows)
   ```

## 拡張機能で転送中の暗号化を使用する
<a name="postgresql-mysql-fdw.encryption-in-transit"></a>

Aurora PostgreSQL から MySQL への接続は、デフォルトで転送中の暗号化 (TLS/SSL) を使用します。ただし、クライアントとサーバーの設定が異なる場合、接続は暗号化されていない状態に戻ります。RDS for MySQL ユーザアカウントの `REQUIRE SSL` オプションを指定して、すべての発信接続に対して暗号化を適用できます。この同じアプローチは MariaDB および Aurora MySQL ユーザーアカウントでも機能します。

`REQUIRE SSL` に構成された MySQL ユーザーアカウントの場合、安全な接続を確立できないと接続の試行は失敗します。

既存の MySQL データベースユーザーアカウントの暗号化を強制するには、`ALTER USER` コマンドを使用できます。次の表に示すとおり、構文は MySQL のバージョンによって異なります。詳細については、*MySQL リファレンスマニュアル*の [ALTER USER](https://dev.mysql.com/doc/refman/8.0/en/alter-user.html) を参照してください。


| MySQL 5.7、MySQL 8.0 | MySQL 5.6 | 
| --- | --- | 
| `ALTER USER '{{user}}'@'%' REQUIRE SSL;` | `GRANT USAGE ON *.* to '{{user}}'@'%' REQUIRE SSL;` | 

`mysql_fdw` 拡張機能の詳細については、[mysql\_fdw](https://github.com/EnterpriseDB/mysql_fdw) ドキュメントをご覧ください。