

# Aurora Global Database での外部テーブルの使用
<a name="aurora-analytics-global-database"></a>

Aurora Global Database は、リージョンごとのセットアップによる分析クエリの実行をサポートしています。このセクションでは、リージョン間で分析クエリを設定する方法、自動的にレプリケートされるリソース、ディザスタリカバリシナリオの計画方法について説明します。

**Topics**
+ [Global Database での aurora\_analytics の使用](#aurora-analytics-gdb-using)
+ [Global Database のセットアップ](#aurora-analytics-gdb-setup)
+ [外部テーブルのリージョンのピン留め](#aurora-analytics-gdb-region-pinning)
+ [スイッチオーバーとフェイルオーバーの処理](#aurora-analytics-gdb-switchover-failover)
+ [Global Databaseのエラーメッセージ](#aurora-analytics-gdb-errors)

## Global Database での aurora\_analytics の使用
<a name="aurora-analytics-gdb-using"></a>

外部テーブルとは、Amazon S3、Amazon S3 Tables、または AWS Glue Data Catalog の Apache Iceberg または Parquet データを指す PostgreSQL のテーブル定義のことです。データは Aurora にコピーされません。プライマリ DB クラスターから各セカンダリ DB クラスターにレプリケートされるのは、次のもののみです。
+ `aurora_analytics` 拡張機能のインストール
+ 外部テーブル定義 (DDL)

以下はレプリケートされないため、セカンダリ DB クラスターが存在する各リージョンで個別にプロビジョニングする必要があります。
+ DB クラスターへの IAM ロールの関連付け。
+ Amazon S3、AWS Glue、または Amazon S3 Tables へのアクセスを許可する IAM ポリシー
+ これらのサービスに到達するために使用する VPC ネットワーク (エンドポイントまたは NAT)

## Global Database のセットアップ
<a name="aurora-analytics-gdb-setup"></a>

### ステップ 1: 各リージョンに IAM ポリシーとロールを作成する
<a name="aurora-analytics-gdb-setup-step1"></a>

IAM ロールの関連付けは、プライマリ DB クラスターとセカンダリ DB クラスター間でレプリケートされません。プライマリまたはセカンダリ DB クラスターが存在するすべてのリージョンで、機能名 `AuroraAnalytics` を指定した IAM ロールを作成してアタッチする必要があります。

1. データへの読み取りアクセスを許可する IAM ポリシーを作成します。必要なアクセス許可は、データ形式によって異なります。詳細については、「[IAM ポリシーのリファレンス](aurora-analytics-iam-policies-reference.md)」を参照してください。

1. `rds.amazonaws.com` を信頼する IAM ロールを作成して、ポリシーをアタッチします。

1. そのリージョンの DB クラスターにロールを関連付けます。

   ```
   aws rds add-role-to-db-cluster \
     --db-cluster-identifier <cluster-in-this-region> \
     --role-arn arn:aws:iam::<account-id>:role/AuroraAnalyticsRole \
     --feature-name AuroraAnalytics
   ```

1. ロールのステータスが **[アクティブ]** と表示されるまで待ちます。

**注記**  
ロールがアタッチされた直後 (またはインスタンスが起動または昇格された直後) に、外部テーブルに対するクエリが一時的にエラー `credential to access AWS service is unavailable` を返すことがあります。ロールのステータスが **[アクティブ]** になるまで待ってから、外部テーブルでクエリを実行します。

### ステップ 2: 各リージョンでネットワークを設定する
<a name="aurora-analytics-gdb-setup-step2"></a>

VPC 設定もレプリケートされません。各 DB クラスター (プライマリおよびすべてのセカンダリ) の VPC で、クエリを解決するために DB クラスターが外部テーブルデータにアクセスできるよう、必要なサービスへのネットワークパスを提供します。各セカンダリのクラスターネットワーク設定で、外部テーブルのリージョンに到達できることを確認します。


**各リージョンに必要な VPC エンドポイント**  

| サービス | エンドポイントタイプ | 必要な用途 | 
| --- | --- | --- | 
| Amazon S3 (com.amazonaws.<region>.s3) | ゲートウェイ | Amazon S3 および Amazon S3 Tables のすべてのデータアクセス | 
| AWS Glue (com.amazonaws.<region>.glue) | インターフェイス | AWS Glue Data Catalog アクセス (Iceberg テーブル) | 
| AWS STS (com.amazonaws.<region>.sts) | インターフェイス | IAM ロールの認証情報の取得 | 

AWS Glue および AWS STS のインターフェイスエンドポイントで、プライベート DNS を有効にし、VPC CIDR からのインバウンド TCP 443 を許可します。

### ステップ 3: 拡張機能をプライマリにインストールする
<a name="aurora-analytics-gdb-setup-step3"></a>

プライマリ DB クラスターのライター DB インスタンスに接続し、外部テーブルを作成する各データベースに拡張機能をインストールします。

```
CREATE EXTENSION aurora_analytics;
```

拡張機能は、各セカンダリ DB クラスターに自動的にレプリケートされます。

### ステップ 4: プライマリに外部テーブルを作成する
<a name="aurora-analytics-gdb-setup-step4"></a>

プライマリ DB クラスターのライター DB インスタンスで、データを指す外部テーブルを作成します。

```
-- Parquet via S3 URI
CREATE FOREIGN TABLE ft_orders ()
SERVER aurora_analytics_server
OPTIONS (location 's3://my-bucket/orders/',
         format 'parquet', region 'us-east-1');

-- Iceberg via Glue ARN
CREATE FOREIGN TABLE ft_transactions ()
SERVER aurora_analytics_server
OPTIONS (location 'arn:aws:glue:us-east-1:123456789012:table/mydb/transactions',
         format 'iceberg');
```

Aurora は DDL を各セカンダリ DB クラスターにレプリケートします。外部テーブルをクエリに使用できます。

### ステップ 5: セカンダリで検証する
<a name="aurora-analytics-gdb-setup-step5"></a>

セカンダリ DB クラスターに接続し、レプリケーションと読み取りアクセスを確認します。

```
SELECT extname, extversion FROM pg_extension WHERE extname = 'aurora_analytics';
SELECT count(*) FROM ft_orders;
```

## 外部テーブルのリージョンのピン留め
<a name="aurora-analytics-gdb-region-pinning"></a>

外部テーブルを作成すると、そのデータの `location` と `Region` がテーブル定義に保存され、グローバルデータベース内のすべての DB クラスターにレプリケートされます。すべての DB クラスターは同じ場所から読み取りを行います。

これは、以下を意味します。
+ 各セカンダリ DB クラスターは、テーブル定義で指定されたリージョンから外部テーブルデータを読み取ります。
+ そのリージョンがセカンダリのリージョンと異なる場合、読み取りはクロスリージョンになり、データ転送コストとレイテンシーが増加します。
+ 各セカンダリの IAM ロールとネットワークにより、外部テーブルのリージョンへのアクセスが許可されます。

**注記**  
Amazon S3 マルチリージョンアクセスポイント (MRAP) は、外部テーブルの場所としてサポートされていません。Aurora PostgreSQL では、`location` オプションで `s3://` URI、AWS Glue テーブル ARN、Amazon S3 Tables ARN のみを受け入れます。MRAP ARN と MRAP ホスト名は、`location` オプションでは無効です。

### DR への備えに関する一般的なガイダンス
<a name="aurora-analytics-gdb-dr-readiness"></a>

セカンダリ DB クラスターのステップ 1～2 のリージョンごとの設定を完了し、DB クラスターが外部テーブルデータにアクセスする方法を決定します。
+ **クロスリージョン読み取りを許可する:** このアプローチは、元のリージョンが正常な状態にある、計画的なスイッチオーバーシナリオにのみ適しています。
+ **リージョンローカルコピーを事前に準備する:** Amazon S3 クロスリージョンレプリケーションを使用して、元のリージョンが使用できない場合でも、分析クエリをローカルで読み取ることができます。リージョンローカルコピーを指すように外部テーブルの場所を更新する `ALTER FOREIGN TABLE ... OPTIONS (SET ...)` ステートメントを準備します。

**注記**  
スイッチオーバーまたはフェイルオーバーが発生した場合、ディスク上の読み取りキャッシュは保持または転送されません。イベント後の最初のクエリは Amazon S3 からデータを読み取るため、キャッシュがウォームアップされるまでレイテンシーが高くなります。

## スイッチオーバーとフェイルオーバーの処理
<a name="aurora-analytics-gdb-switchover-failover"></a>

Aurora Global Database のスイッチオーバーまたはフェイルオーバー中、外部テーブルクエリには、標準データベースクライアント接続とは別に、追加の依存関係が生じます。各外部テーブルによって指定されたリージョンの Amazon S3、AWS Glue、および AWS STS に到達できる必要があります。

### Global Database スイッチオーバー
<a name="aurora-analytics-gdb-switchover"></a>

スイッチオーバー時に、プライマリ DB クラスターとセカンダリ DB クラスターはどちらも正常です。新しいプライマリ DB クラスターが利用可能になった後も、クエリは各外部テーブルで指定されたリージョンから読み取りを続けます。そのリージョンが新しいライターのリージョンと異なる場合、クロスリージョンの読み取りが発生し、データ転送コストとレイテンシーが増加します。クロスリージョン読み取りレイテンシーを回避するには、準備済みの `ALTER FOREIGN TABLE ... OPTIONS (SET ...)` ステートメントを実行して、外部テーブルをリージョンローカルコピーに再ポイントします。

#### スイッチオーバー後のオペレーションの再開
<a name="aurora-analytics-gdb-resuming"></a>

1. クライアントが新しいプライマリ DB クラスターのライターエンドポイントに再接続できるようにします。

1. IAM ロールのステータスが **[アクティブ]** になるまで待ちます。再試行ロジックを使用したテストクエリを (例: `SELECT count(*) FROM ft_orders`) 外部テーブルに対して実行し、分析クエリが動作していることを確認します。

1. リージョンローカルコピーを使用する場合は、新しいプライマリ DB クラスターで準備済みの `ALTER` ステートメントを実行して、外部テーブルの場所を更新します。

   ```
   ALTER FOREIGN TABLE ft_orders OPTIONS (SET location 's3://dr-region-bucket/orders/', SET region 'us-west-2');
   ALTER FOREIGN TABLE ft_transactions OPTIONS (SET location 'arn:aws:glue:us-west-2:123456789012:table/mydb/transactions');
   ```

**注記**  
`ALTER FOREIGN TABLE ... OPTIONS (SET ...)` はカタログメタデータのみを変更する操作です。データ移動なしですぐに完了します。対象の単一の外部テーブルに対して、短時間の `ACCESS EXCLUSIVE` ロックを取得します。そのため、同じテーブルに対する処理中のクエリによってブロックされます。

### Global Database フェイルオーバー
<a name="aurora-analytics-gdb-failover"></a>

元のリージョンに障害が発生したり、アクセスできない状態にある可能性があります。外部テーブルが障害のあるリージョンを参照している場合、そのリージョンが回復するか、外部テーブルを正常なリージョンのデータに再ポイントするまで、クエリに高いレイテンシーが発生するか、タイムアウトエラーで失敗することになります。リージョンローカルコピーを事前に準備しておいた場合は、準備済みの `ALTER FOREIGN TABLE ... OPTIONS (SET region ...)` ステートメントを実行して、外部テーブルがそのリージョンローカルコピーを指すように設定します。

### 元のプライマリリージョンへの復帰
<a name="aurora-analytics-gdb-returning"></a>

元のプライマリリージョンが利用可能になると、Aurora はそれをセカンダリ DB クラスターとしてグローバルデータベースに自動的に再追加します。スイッチオーバーまたはフェイルオーバー中に行われた `ALTER FOREIGN TABLE` による変更は、グローバルレプリケーションを通じてレプリケートされます。元のプライマリリージョンを復元するには、スイッチオーバーを実行します。スイッチオーバーが完了したら、外部テーブルの場所を、復元されたプライマリリージョンのデータを指すように戻すかどうかを決定します。

## Global Databaseのエラーメッセージ
<a name="aurora-analytics-gdb-errors"></a>

スイッチオーバーまたはフェイルオーバー後、新しいプライマリリージョンのクエリは、セカンダリ DB クラスターを実行しているリージョンで発生するものと同じ、IAM ロールの関連付け、IAM アクセス許可、ネットワークに関するエラーによって失敗する可能性があります。これらのエラーとその解決方法については、「[モニタリングとトラブルシューティング](aurora-analytics-monitoring-troubleshooting.md)」の Global Database のスイッチオーバーとフェイルオーバーについてのページで説明されています。IAM ロールの関連付け、IAM ポリシー、VPC ネットワークはレプリケートされないため、各セカンダリリージョンで前提条件を満たす必要があります。
+ 外部テーブルの `location` および `region` は、単一の定義としてレプリケートされ、リージョンごとに上書きすることはできません。どちらのクラスターも、同じテーブルに対して異なるリージョンを保持することはできません。
+ Amazon S3 マルチリージョンアクセスポイントと Amazon S3 アクセスポイント ARN は、外部テーブルの場所としてサポートされていません。
+ VPC ゲートウェイエンドポイントはリージョン固有のものであり、別のリージョンの Amazon S3 に到達できません。クロスリージョンネットワークパスには、NAT/インターネット出力またはトランジットゲートウェイが必要です。
+ スイッチオーバー後、外部テーブルの場所を新しいプライマリ DB クラスターのリージョンに更新すると、以前のプライマリ DB クラスターでは、代わりにクロスリージョン読み取りが発生します。
+ 外部テーブル DDL と拡張機能は、セカンダリがアタッチされ、同期された後にのみレプリケートされます。セカンダリが接続された後、プライマリで `aurora_analytics` 拡張機能をインストールし、外部テーブルを作成します。そうすることで、それらが伝播されます。