

# Amazon RDS の PostgreSQL にデータをインポートする
<a name="PostgreSQL.Procedural.Importing"></a>

Amazon RDS に移動させる既存の PostgreSQL デプロイがあるとします。タスクの複雑さは、データベースのサイズと転送するデータベースオブジェクトの種類に依存しています。例えば、データベースにギガバイトのオーダーのデータセット、さらにストアドプロシージャとトリガーが含まれているとします。このようなデータベースは、単純なデータベース (数メガバイトのテストデータを含むだけで、トリガーやストアドプロシージャを含まないもの) よりも複雑になります。

次の条件で、ネイティブ PostgreSQL データベース移行ツールを使用することをお勧めします。
+ ターゲットデータベースエンジンと同じデータベースエンジンを持つデータベースから移行する、同機種移行である。
+ データベース全体を移行する。
+ ネイティブツールでは、最小のダウンタイムでシステムを移行することができます。

他の多くの場合、データベースの移行には、AWS Database Migration Service (AWS DMS) を使用することが最良のアプローチとなります。AWSDMS により、ダウンタイムなしでデータベースを移行できます。また、多くのデータベースエンジンでは、ターゲットデータベースへの切り替え準備ができるまで、進行中のレプリケーションを続行することができます。AWS DMS を使用することで、同じデータベースエンジン、または異なるデータベースエンジンへの移行が可能です。ソースデータベースとは別のデータベースエンジンへ移行する場合は、AWS Schema Conversion Tool (AWS SCT) を使用できます。AWS SCT を使用して、AWS DMS で移行されないスキーマオブジェクトを移行します。AWS DMS の詳細については、「[AWS Database Migration Service とは](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)」を参照してください。

DB パラメータグループを変更し、次の*インポート専用*の設定を含めます。DB インスタンスサイズの最も効率的な設定を見つけるために、パラメータ設定をテストする必要があります。さらに、インポートが完了したら、これらのパラメータを本番稼働用の値に戻す必要があります。

DB インスタンスの設定を次のように変更します。
+ DB インスタンスのバックアップを無効にします (backup\$1retention を 0 に設定します)。
+ マルチ AZ を無効にする。

次の設定を含むように DB パラメータグループを変更します。これらの設定は、データのインポート時にのみ使用してください。DB インスタンスサイズの最も効率的な設定を見つけるために、パラメータ設定をテストする必要があります。さらに、インポートが完了したら、これらのパラメータを本番稼働用の値に戻す必要があります。


| Parameter | インポート時の推奨値 | 説明 | 
| --- | --- | --- | 
|  `maintenance_work_mem`  |  524288、1048576、2097152、または 4194304 (KB 単位)。これらの設定は、512 MB、1 GB、2 GB、および 4 GB と同等です。  |  この設定の値は、ホストのサイズによって異なります。このパラメータは、CREATE INDEX ステートメントで使用され、各パラレルコマンドがこの量のメモリを使用できます。この設定値が大きすぎてメモリ不足が生じることのないように、最適な値を計算します。  | 
|  `max_wal_size`  |  256 (バージョン 9.6 の場合)、4096 (バージョン 10 以降の場合)  |  自動チェックポイント中に WAL を拡張するための最大サイズ。このパラメータを増やすと、クラッシュ回復に必要な時間が長く可能性があります。PostgreSQL 9.6 以降では、このパラメータは `checkpoint_segments` を置き換えられます。 PostgreSQL バージョン 9.6 の場合、この値は 16 MB 単位です。それ以降のバージョンでは、値は 1 MB 単位です。例えば、バージョン 9.6 では、128 は、それぞれ 16 MB のサイズである 128 個のチャンクを意味します。バージョン 12.4 では、2048 は、それぞれ 1 MB のサイズである 2048 個のチャンクを意味します。  | 
|  `checkpoint_timeout`  |  1800  |  この値に設定すると、WAL ローテーションの頻度を低くすることができます。  | 
|  `synchronous_commit`  |  オフ  |  この設定を無効にすると、書き込みが速くなります。このパラメータをオフにすると、サーバークラッシュ時にデータが損失するリスクを下げることができます (FSYNC はオフにしないでください)。  | 
|  `wal_buffers`  |   8192  |  この値は、8 KB 単位です。これも WAL の生成速度に貢献します。  | 
|  `autovacuum`  |  0  |  リソースが使用されないように、データのロード時に PostgreSQL の自動バキュームパラメータを無効にします。  | 

これらの設定で、`pg_dump -Fc` (圧縮) または `pg_restore -j` (パラレル) コマンドを使用します。

**注記**  
PostgreSQL コマンド `pg_dumpall` の実行には SUPER\$1USER 権限が必要ですが、この権限は DB インスタンスの作成時に付与されません。そのため、このコマンドをデータのインポートに使用することはできません。

**Topics**
+ [Amazon EC2 インスタンスから PostgreSQL データベースをインポートする](PostgreSQL.Procedural.Importing.EC2.md)
+ [\$1copy コマンドを使用して PostgreSQL DB インスタンスのテーブルにデータをインポートする](PostgreSQL.Procedural.Importing.Copy.md)
+ [Amazon S3 から RDS for PostgreSQL DB インスタンスにデータをインポートする](USER_PostgreSQL.S3Import.md)
+ [DB インスタンス 間での PostgreSQL データベースの移行](PostgreSQL.TransportableDB.md)

# Amazon EC2 インスタンスから PostgreSQL データベースをインポートする
<a name="PostgreSQL.Procedural.Importing.EC2"></a>

Amazon EC2 インスタンス上の PostgreSQL サーバーにデータがあり、そのデータを PostgreSQL DB インスタンスに移動する場合は、次のプロセスに従ってデータを移行できます。

1. pg\$1dump を使用して、ロードするデータを格納したファイルを作成する

1. ターゲット DB インスタンスを作成する

1. *psql* を使用して、DB インスタンスにデータベースを作成し、データをロードする

1. DB インスタンスの DB スナップショットを作成する

次のセクションでは、上記の各ステップについて詳しく説明します。

## ステップ 1: ロードするデータが含まれている pg\$1dump を使用してファイルを作成する
<a name="PostgreSQL.Procedural.Importing.EC2.Step1"></a>

`pg_dump` ユーティリティでは、COPY コマンドを使用して、PostgreSQL データベースのスキーマとデータダンプを作成します。`pg_dump` によって生成されるダンプスクリプトは、同じ名前のデータベースにデータをロードし、テーブル、インデックス、外部キーを再作成します。`pg_restore` コマンドと `-d` パラメータを使用して、データを別の名前でデータベースに復元できます。

データダンプの作成前に、ダンプするテーブルに対してクエリを実行して行数を取得し、ターゲット DB インスタンスでその行数を確認できるようにする必要があります。

 以下のコマンドでは、mydb2 というデータベース用に mydb2dump.sql というダンプファイルを作成しています。

```
prompt>pg_dump dbname=mydb2 -f mydb2dump.sql 
```

## ステップ 2: ターゲット DB インスタンスを作成する
<a name="PostgreSQL.Procedural.Importing.EC2.Step2"></a>

Amazon RDS コンソール、AWS CLI、または API のいずれかを使用して、ターゲット PostgreSQL DB インスタンスを作成します。バックアップの保持設定を 0 にし、マルチ AZ を無効にして、インスタンスを作成します。これにより、データのインポートが高速化されます。データをダンプする前に、インスタンスにデータベースを作成する必要があります。データベースは、ダンプしたデータが含まれていたデータベースと同じ名前で作成できます。または、別の名前でデータベースを作成できます。この場合は、`pg_restore` コマンドと `-d` パラメータを使用して、新しい名前のデータベース内にデータを復元します。

例えば、データベースのダンプ、復元、名前変更に以下のコマンドを使用できます。

```
pg_dump -Fc -v -h [endpoint of instance] -U [master username] [database] > [database].dump
createdb [new database name]
pg_restore -v -h [endpoint of instance] -U [master username] -d [new database name] [database].dump
```

## ステップ 3: psql を使用して DB インスタンスにデータベースを作成し、データをロードする
<a name="PostgreSQL.Procedural.Importing.EC2.Step3"></a>

pg\$1dump コマンドの実行に使用した同じ接続を使用して、ターゲット DB インスタンスに接続し、データベースを再作成できます。*psql* により、マスターユーザー名とマスターパスワードを使用して DB インスタンスにデータベースを作成できます。

以下の例では、*psql* と、mydb2dump.sql という名前のダンプファイルを使用して、mypginstance という PostgreSQL DB インスタンスに mydb2 というデータベースを作成しています。

Linux、macOS、Unix の場合:

```
psql \
   -f mydb2dump.sql \
   --host mypginstance.555555555555.aws-region.rds.amazonaws.com \
   --port 8199 \
   --username myawsuser \
   --password password \
   --dbname mydb2
```

Windows の場合:

```
psql ^
   -f mydb2dump.sql ^
   --host mypginstance.555555555555.aws-region.rds.amazonaws.com ^
   --port 8199 ^
   --username myawsuser ^
   --password password ^
   --dbname mydb2
```

**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

## ステップ 4: DB インスタンスの DB スナップショットを作成する
<a name="PostgreSQL.Procedural.Importing.EC2.Step4"></a>

データが DB インスタンスにロードされたことを確認したら、ターゲット PostgreSQL DB インスタンスの DB スナップショットを作成することをお勧めします。DB スナップショットは DB インスタンスの完全なバックアップであり、DB インスタンスを既知の状態に復元するために使用できます。ロード直後に DB スナップショットを作成しておくと、何らかの事故のときにそのスナップショットを使用すれば、データを再ロードせずに済みます。また、そのスナップショットを使用して、新しい DB インスタンスをシードすることもできます。DB スナップショットの作成については、「[Amazon RDS のシングル AZ DB インスタンスの DB スナップショットの作成](USER_CreateSnapshot.md)」を参照してください。

# \$1copy コマンドを使用して PostgreSQL DB インスタンスのテーブルにデータをインポートする
<a name="PostgreSQL.Procedural.Importing.Copy"></a>

PostgreSQL の `\copy` コマンドは、`psql` の対話型クライアントツールでメタコマンドを利用できます。`\copy` を使うと、RDS for PostgreSQL DB インスタンスで、テーブルにデータをインポートできます。`\copy` コマンドを使うには、まず対象のDB インスタンスにテーブル構造を作成して、`\copy` がデータをコピーする先を用意する必要があります。

`\copy` を使用すると、クライアントのワークステーションにエクスポートして保存しておいた、カンマ区切り値 (CSV) 形式のファイルなどから、データを読み込むことができます。

CSV データを対象の RDS for PostgreSQL DB インスタンスにインポートするには、まず `psql` を使用して、対象の DB インスタンスに接続します。

```
psql --host=db-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=target-db
```

その後、次のパラメータを指定して `\copy` コマンドを実行し、対象のデータとその形式を識別します。
+ `target_table` — CSV ファイルからコピーされるデータを受け取るテーブルの名前。
+ `column_list` — テーブルの列の仕様。
+ `'filename'` — ローカルワークステーションにある CSV ファイルの絶対パス。

```
 \copy target_table from '/path/to/local/filename.csv' WITH DELIMITER ',' CSV;
```

CSV ファイルに列見出しがある場合は、このバージョンのコマンドとパラメータを使用できます。

```
\copy target_table (column-1, column-2, column-3, ...)
    from '/path/to/local/filename.csv' WITH DELIMITER ',' CSV HEADER;
```

 `\copy` コマンドが失敗した場合は、PostgreSQL はエラーメッセージを出力します。

以下の例で示すように、`\copy` メタコマンドを指定した `psql` コマンドで、データベースプレビュー環境に新しい DB インスタンスを作成します。この例では、ソーステーブル名として *source-table*、.csv ファイルとして *source-table.csv*、ターゲットデータベースとして *target-db* を使用しています。

Linux、macOS、Unix の場合:

```
$psql target-db \
    -U <admin user> \
    -p <port> \
    -h <DB instance name> \
    -c "\copy source-table from 'source-table.csv' with DELIMITER ','"
```

Windows の場合:

```
$psql target-db ^
    -U <admin user> ^
    -p <port> ^
    -h <DB instance name> ^
    -c "\copy source-table from 'source-table.csv' with DELIMITER ','"
```

`\copy` コマンドの詳細については、PostgreSQL のドキュメント の 「[psql](http://www.postgresql.org/docs/current/static/app-psql.html)」ページにある、「*メタコマンド*」セクションを参照してください。

# Amazon S3 から RDS for PostgreSQL DB インスタンスにデータをインポートする
<a name="USER_PostgreSQL.S3Import"></a>

Amazon Simple Storage Service を使用して保存されたデータを、 RDS for PostgreSQL DB インスタンス上のテーブルにインポートできます。これを行うには、 RDS for PostgreSQL `aws_s3`拡張機能を最初にインストールします。この拡張機能には、Amazon S3 バケットからのデータのインポートに使用する関数が含まれます。*バケット*とは、Amazon S3 のオブジェクトおよびファイルのコンテナです。データは、カンマ区切り値 (CSV) ファイル、テキストファイル、または圧縮 (gzip) ファイルでインポートできます。次に、拡張機能のインストール方法と、Amazon S3 からテーブルにデータをインポートする方法について説明します。

Amazon S3 から RDS for PostgreSQL にインポートするには、データベースで PostgreSQL バージョン 10.7 以降を実行している必要があります。 

Amazon S3 にデータが保存されていない場合は、まずバケットを作成し、データを保存する必要があります。詳細については、*Amazon Simple Storage Service コンソールユーザーガイド*の以下のトピックを参照してください。
+ [バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#creating-bucket)
+ [バケットにオブジェクトを追加する](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#uploading-an-object-bucket) 

Amazon S3 からのクロスアカウントインポートがサポートされています。詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[クロスアカウントアクセス許可の付与](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)」を参照してください。

S3 からデータをインポートする際は、カスタマーマネージドキーを暗号化に使用できます。詳細については、*Amazon Simple Storage Service ユーザーガイド*の「[AWS KMS に保存される KMS キー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)」を参照してください。

**Topics**
+ [aws\$1s3 拡張機能のインストール](USER_PostgreSQL.S3Import.InstallExtension.md)
+ [Amazon S3 データからのデータのインポートの概要](USER_PostgreSQL.S3Import.Overview.md)
+ [Amazon S3 バケットへのアクセスを設定する](USER_PostgreSQL.S3Import.AccessPermission.md)
+ [Amazon S3 から RDS for PostgreSQL DB インスタンスにデータをインポートする](USER_PostgreSQL.S3Import.FileFormats.md)
+ [関数リファレンス](USER_PostgreSQL.S3Import.Reference.md)

# aws\$1s3 拡張機能のインストール
<a name="USER_PostgreSQL.S3Import.InstallExtension"></a>

 RDS for PostgreSQL DB インスタンスで Amazon S3 を使用する前に、`aws_s3` 拡張機能をインストールする必要があります。この拡張機能には、Amazon S3 からデータをインポートするための関数が含まれます。また、 RDS for PostgreSQL DB インスタンスから Amazon S3 バケットへデータをエクスポートするための関数も含まれています。詳しくは、「[RDS for PostgreSQL DB インスタンスから Amazon S3 へのデータのエクスポート](postgresql-s3-export.md)」を参照してください。`aws_s3` 拡張機能は `aws_commons` 拡張機能の一部のヘルパー関数に依存しており、必要に応じて自動的にインストールされます。

**`aws_s3` 拡張機能をインストールするには**

1. `rds_superuser` 権限があるユーザーとして、psql (または pgAdmin) を使用して RDS for PostgreSQL DB インスタンスに接続します。設定プロセス中にデフォルトの名前を保持している場合は、`postgres` として接続します。

   ```
   psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. 拡張機能をインストールするには、次のコマンドを実行します。

   ```
   postgres=> CREATE EXTENSION aws_s3 CASCADE;
   NOTICE: installing required extension "aws_commons"
   CREATE EXTENSION
   ```

1. 拡張機能がインストールされていることを確認するには、psql `\dx` メタコマンドを使用します。

   ```
   postgres=> \dx
          List of installed extensions
       Name     | Version |   Schema   |                 Description
   -------------+---------+------------+---------------------------------------------
    aws_commons | 1.2     | public     | Common data types across AWS services
    aws_s3      | 1.1     | public     | AWS S3 extension for importing data from S3
    plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
   (3 rows)
   ```

Amazon S3 からデータをインポートし、データを Amazon S3 にエクスポートするための関数が使用できるようになりました。

# Amazon S3 データからのデータのインポートの概要
<a name="USER_PostgreSQL.S3Import.Overview"></a>

**S3 データを Amazon RDS にインポートするには**

まず、関数で指定する必要がある詳細情報を収集します。この情報には、 RDS for PostgreSQL DB インスタンスのテーブルの名前、バケット名、ファイルパス、ファイルタイプ、Amazon S3 データが保存される AWS リージョンが含まれます。詳細については、*Amazon Simple Storage Service ユーザーガイド*の「[オブジェクトの表示](https://docs.aws.amazon.com/AmazonS3/latest/userguide/OpeningAnObject.html)」を参照してください。
**注記**  
Amazon S3 からのマルチパートデータインポートは現在サポートされていません。

1. `aws_s3.table_import_from_s3` 関数によってデータがインポートされるテーブルの名前を取得します。例えば、次のコマンドにより、後の手順で使用されるテーブル `t1` が作成されます。

   ```
   postgres=> CREATE TABLE t1 
       (col1 varchar(80), 
       col2 varchar(80), 
       col3 varchar(80));
   ```

1. Amazon S3 バケットの詳細とインポートするデータを取得します。これを実行するには、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開き、**[Bucket]** (バケット) を選択します。リストで、データを含むバケットを探します。バケットを選択し、オブジェクト概要ページを開き、[Properties] (プロパティ) を選択します。

   バケット名、パス、AWS リージョン、およびファイルタイプを書き留めておきます。IAM ロールによる Amazon S3 へのアクセスを設定するには、後で Amazon リソースネーム (ARN) が必要になります。詳細については、「[Amazon S3 バケットへのアクセスを設定する](USER_PostgreSQL.S3Import.AccessPermission.md)」を参照してください。次のイメージは例を示しています。  
![\[Amazon S3 バケット内のファイルオブジェクトの画像。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/aws_s3_import-export_s3_bucket-info.png)

1. AWS CLI コマンド `aws s3 cp` を使用して、Amazon S3 バケットのデータへのパスを確認できます。情報が正しい場合、このコマンドは Amazon S3 ファイルのコピーをダウンロードします。

   ```
   aws s3 cp s3://amzn-s3-demo-bucket/sample_file_path ./ 
   ```

1.  RDS for PostgreSQL DB インスタンスに対するアクセス許可を設定して、Amazon S3 バケット上のファイルへのアクセスを許可します。これを行うには、AWS Identity and Access Management (IAM) ロールまたはセキュリティ認証情報を使用します。詳しくは、「[Amazon S3 バケットへのアクセスを設定する](USER_PostgreSQL.S3Import.AccessPermission.md)」を参照してください。

1. 収集したパスと他の Amazon S3 オブジェクトの詳細 (ステップ 2 を参照) を `create_s3_uri` 関数で指定し、Amazon S3 URI オブジェクトを構成します。この関数の詳細については、「[aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri)」を参照してください。psql セッション中にこのオブジェクトを構成する例は次のとおりです。

   ```
   postgres=> SELECT aws_commons.create_s3_uri(
      'docs-lab-store-for-rpg',
      'versions_and_jdks_listing.csv',
      'us-west-1'
   ) AS s3_uri \gset
   ```

   次のステップでは、このオブジェクト (`aws_commons._s3_uri_1`) を `aws_s3.table_import_from_s3` 関数に渡して、データをテーブルにインポートします。

1. `aws_s3.table_import_from_s3` 関数を呼び出して、Amazon S3 からテーブルにデータをインポートします。参考情報については、「[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)」を参照してください。例については「[Amazon S3 から RDS for PostgreSQL DB インスタンスにデータをインポートする](USER_PostgreSQL.S3Import.FileFormats.md)」を参照してください。

# Amazon S3 バケットへのアクセスを設定する
<a name="USER_PostgreSQL.S3Import.AccessPermission"></a>

Amazon S3 ファイルからデータをインポートするには、RDS for PostgreSQL DB インスタンスに、ファイルが含まれている Amazon S3 バケットへのアクセス許可を与える必要があります。次のトピックで説明する 2 つの方法のいずれかで、Amazon S3 バケットへのアクセスを提供します。

**Topics**
+ [IAM ロールを使用した Amazon S3 バケットへのアクセス](#USER_PostgreSQL.S3Import.ARNRole)
+ [セキュリティ認証情報を使用して Amazon S3 バケットにアクセスする](#USER_PostgreSQL.S3Import.Credentials)
+ [Amazon S3 へのアクセスのトラブルシューティング](#USER_PostgreSQL.S3Import.troubleshooting)

## IAM ロールを使用した Amazon S3 バケットへのアクセス
<a name="USER_PostgreSQL.S3Import.ARNRole"></a>

Amazon S3 ファイルからデータをロードするには、ファイルが含まれる Amazon S3 バケットへのアクセス許可を RDS for PostgreSQL DB インスタンスに与えます。こうすれば、追加の認証情報を管理したり、[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 関数呼び出しで提供したりする必要はありません。

これを行うには、Amazon S3 バケットへのアクセスを提供する IAM ポリシーを作成します。IAM ロールを作成して、ポリシーをロールにアタッチします。次に、IAM ロールを DB インスタンスに割り当てます。

**IAM ロールを使用して、Amazon S3 へのアクセス権を RDS for PostgreSQL DB インスタンスに付与するには**

1. IAM ポリシーを作成します。

   ポリシーは、RDS for PostgreSQL DB インスタンスに Amazon S3 へのアクセスを許可するバケットとオブジェクトのアクセス許可を付与します。

   ポリシーに、Amazon S3 バケットから Amazon RDS へのファイル転送を許可ための次の必須アクションを含めます。
   + `s3:GetObject` 
   + `s3:ListBucket` 

   ポリシーに次のリソースを含めて、Amazon S3 バケットとバケット内のオブジェクトを識別します。これは、Amazon S3 にアクセスするための Amazon リソースネーム (ARN) 形式を示しています。
   + arn:aws:s3:::*amzn-s3-demo-bucket*
   + arn:aws:s3:::*amzn-s3-demo-bucket*/\$1

    RDS for PostgreSQL の IAM ポリシーの作成の詳細については、「[IAM データベースアクセス用の IAM ポリシーの作成と使用](UsingWithRDS.IAMDBAuth.IAMPolicy.md)」を参照してください。*IAM ユーザーガイド*の「[チュートリアル: はじめてのカスタマー管理ポリシーの作成とアタッチ](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)」も参照してください。

   以下の AWS CLI コマンドでは、これらのオプションを指定して、`rds-s3-import-policy` という名前の IAM ポリシーを作成します。*amzn-s3-demo-bucket* という名前のバケットへのアクセスを許可します。
**注記**  
このコマンドによって返されるポリシー のAmazon リソースネーム (ARN) をメモしておきます。ポリシーを IAM ロールにアタッチする場合、後続のステップで ARN が必要です。  
**Example**  

   Linux、macOS、Unix の場合:

   ```
   aws iam create-policy \
      --policy-name rds-s3-import-policy \
      --policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "s3import",
            "Action": [
              "s3:GetObject",
              "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-bucket", 
              "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ] 
          }
        ] 
      }'
   ```

   Windows の場合:

   ```
   aws iam create-policy ^
      --policy-name rds-s3-import-policy ^
      --policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "s3import",
            "Action": [
              "s3:GetObject",
              "s3:ListBucket"
            ], 
            "Effect": "Allow",
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-bucket", 
              "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ] 
          }
        ] 
      }'
   ```

1. IAM ロールを作成します。

   これを行うと、Amazon RDS がユーザーに代わってこの IAM ロールを引き受け、Amazon S3 バケットにアクセスできます。詳細については、*IAM ユーザーガイド*の「[IAM ユーザーにアクセス許可を委任するロールの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)」を参照してください。

   リソースポリシー内では `[aws:SourceArn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)` および `[aws:SourceAccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)` のグローバル条件コンテキストキーを使用して、サービスに付与するリソースへのアクセス許可を制限することをお勧めします。これは、[混乱した使節の問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)に対する最も効果的な保護方法です。

   グローバル条件コンテキストキーの両方を使用し、`aws:SourceArn` の値にアカウント ID が含まれている場合、同じポリシーステートメントで使用する場合は、`aws:SourceArn` の値と `aws:SourceAccount` の値のアカウントでは同じアカウント ID を使用する必要があります。
   + 単一リソースに対するクロスサービスアクセスが必要な場合は `aws:SourceArn` を使用します。
   + そのアカウント内の任意のリソースをクロスサービス使用に関連付けることを許可する場合、`aws:SourceAccount`を使用します。

   ポリシーでは、必ずリソースの完全な ARN を持つ `aws:SourceArn` グローバル条件コンテキストキーを使用してください。以下の例は、AWS CLI コマンドを使用して、`rds-s3-import-role` という名前のロールを作成する方法を示しています。  
**Example**  

   Linux、macOS、Unix の場合:

   ```
   aws iam create-role \
      --role-name rds-s3-import-role \
      --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                   "aws:SourceAccount": "111122223333",
                   "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname"
                   }
                }
          }
        ] 
      }'
   ```

   Windows の場合:

   ```
   aws iam create-role ^
      --role-name rds-s3-import-role ^
      --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                   "aws:SourceAccount": "111122223333",
                   "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname"
                   }
                }
          }
        ] 
      }'
   ```

1. 作成した IAM ポリシーを、作成した IAM ロールにアタッチします。

   次の AWS CLI コマンドは、先ほどのステップで作成したポリシーを `rds-s3-import-role` という名前のロールに添付し、`your-policy-arn` を前のステップでメモしたポリシー ARN に置き換えます。  
**Example**  

   Linux、macOS、Unix の場合:

   ```
   aws iam attach-role-policy \
      --policy-arn your-policy-arn \
      --role-name rds-s3-import-role
   ```

   Windows の場合:

   ```
   aws iam attach-role-policy ^
      --policy-arn your-policy-arn ^
      --role-name rds-s3-import-role
   ```

1. DB インスタンスに IAM ロールを追加します。

   これを行うには、以下で説明するように、AWS マネジメントコンソール または AWS CLI を使用します。

### コンソール
<a name="collapsible-section-1"></a>

**コンソールを使用して PostgreSQL DB インスタンスの IAM ロールを追加するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. 詳細を表示するには、PostgreSQL DB インスタンスの名前を選択します。

1. [**接続とセキュリティ**] タブの [**IAM ロールの管理**] セクションで、**このインスタンスに [IAM ロールを追加**] で追加するロールを選択します。

1. [**Feature**] で、[**s3Import**] を選択します。

1. [**Add role**] を選択します。

### AWS CLI
<a name="collapsible-section-2"></a>

**CLI を使用して PostgreSQL DB インスタンスの IAM ロールを追加するには**
+ 次のコマンドを使用して、`my-db-instance` という名前の PostgreSQL DB インスタンスにロールを追加します。*`your-role-arn`* を、以前のステップで書き留めたロール ARN に置き換えます。`s3Import` オプションの値に `--feature-name` を使用します。  
**Example**  

  Linux、macOS、Unix の場合:

  ```
  aws rds add-role-to-db-instance \
     --db-instance-identifier my-db-instance \
     --feature-name s3Import \
     --role-arn your-role-arn   \
     --region your-region
  ```

  Windows の場合:

  ```
  aws rds add-role-to-db-instance ^
     --db-instance-identifier my-db-instance ^
     --feature-name s3Import ^
     --role-arn your-role-arn ^
     --region your-region
  ```

### RDS API
<a name="collapsible-section-3"></a>

Amazon RDS API を使用して PostgreSQL DB インスタンスに IAM ロールを追加するには、 [AddRoleToDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AddRoleToDBInstance.html) オペレーションを呼び出します。

## セキュリティ認証情報を使用して Amazon S3 バケットにアクセスする
<a name="USER_PostgreSQL.S3Import.Credentials"></a>

必要に応じて、IAM ロールでアクセスを提供する代わりに、セキュリティ認証情報を使用して Amazon S3 バケットへのアクセスを提供できます このためには、[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 関数呼び出しで `credentials` パラメータを指定します。

`credentials` パラメータは、型の構造体 `aws_commons._aws_credentials_1` で、AWS 認証情報を含みます。[aws\$1commons.create\$1aws\$1credentials](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_aws_credentials) 関数を使用して、`aws_commons._aws_credentials_1` 構造でアクセスキーおよびシークレットキーを設定します。以下に例を示します。

```
postgres=> SELECT aws_commons.create_aws_credentials(
   'sample_access_key', 'sample_secret_key', '')
AS creds \gset
```

`aws_commons._aws_credentials_1 ` 構造を作成したら、以下に示すように、[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 関数を `credentials` パラメータと共に使用してデータをインポートします。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't', '', '(format csv)',
   :'s3_uri', 
   :'creds'
);
```

または、[aws\$1commons.create\$1aws\$1credentials](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_aws_credentials) 関数の呼び出しのインラインを `aws_s3.table_import_from_s3` 関数の呼び出し内に含めることもできます。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't', '', '(format csv)',
   :'s3_uri', 
   aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);
```

## Amazon S3 へのアクセスのトラブルシューティング
<a name="USER_PostgreSQL.S3Import.troubleshooting"></a>

Amazon S3 からデータをインポートしようとしたときに接続の問題が発生した場合は、次の推奨事項を参照してください。
+ [Amazon RDS のアイデンティティおよびアクセスのトラブルシューティング](security_iam_troubleshoot.md)
+ *Amazon Simple Storage Service ユーザーガイド* の「[Troubleshooting Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshooting.html)」
+ *IAM ユーザーガイド* の [Amazon S3 のトラブルシューティングと IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-s3.html)

# Amazon S3 から RDS for PostgreSQL DB インスタンスにデータをインポートする
<a name="USER_PostgreSQL.S3Import.FileFormats"></a>

aws\$1s3 拡張機能の `table_import_from_s3` 関数を使用して Amazon S3 バケットからデータをインポートします。参考情報については、「[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)」を参照してください。

**注記**  
以下の例では、IAM ロールメソッドを使用して、Amazon S3 バケットへのアクセスを許可します。したがって、`aws_s3.table_import_from_s3` 関数呼び出しには認証情報パラメータは含まれません。

次の例は、代表的な例を示しています。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't1',
   '', 
   '(format csv)',
   :'s3_uri'
);
```

パラメータは次のとおりです。
+ `t1` - データのコピー先となる PostgreSQL DB インスタンス内のテーブルの名前。
+ `''` - データベーステーブル内の列のオプションのリスト。S3 データをコピーする列とテーブル列を指定するには、このパラメータを使用します。列を指定しない場合は、すべての列がテーブルにコピーされます。列のリストの使用例については、[カスタム区切り文字を使用する Amazon S3 ファイルをインポートする](#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter) を参照してください。
+ `(format csv)` - PostgreSQL COPY 引数。このコピープロセスでは、[PostgreSQL COPY](https://www.postgresql.org/docs/current/sql-copy.html) コマンドの引数と形式を使用してデータをインポートします。フォーマットとしては、この例のようなカンマ区切り値 (CSV)、テキスト、およびバイナリを指定できます。デフォルトではテキストに設定されています。
+  `s3_uri` - Amazon S3 ファイルを識別する情報を含む構造。[aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri) 関数を使用して `s3_uri` 構造を作成する例については、「[Amazon S3 データからのデータのインポートの概要](USER_PostgreSQL.S3Import.Overview.md)」を参照してください。

この関数の詳細については、「[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)」を参照してください。

この`aws_s3.table_import_from_s3`関数はテキストを返します。Amazon S3 バケットからインポートする他の種類のファイルを指定するには、次の例のいずれかを参照してください。

**注記**  
0 バイトファイルをインポートすると、エラーが発生します。

**Topics**
+ [カスタム区切り文字を使用する Amazon S3 ファイルをインポートする](#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)
+ [Amazon S3 圧縮 (gzip) ファイルをインポートする](#USER_PostgreSQL.S3Import.FileFormats.gzip)
+ [エンコードされた Amazon S3 ファイルをインポートする](#USER_PostgreSQL.S3Import.FileFormats.Encoded)

## カスタム区切り文字を使用する Amazon S3 ファイルをインポートする
<a name="USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter"></a>

以下の例では、カスタム区切り文字を使用するファイルのインポート方法を示します。また、`column_list` 関数の [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) パラメータを使用して、データベースのデータを置く場所を制御する方法を示します。

この例では、次の情報が Amazon S3 ファイル内のパイプ区切りの列に編成されているとします。

```
1|foo1|bar1|elephant1
2|foo2|bar2|elephant2
3|foo3|bar3|elephant3
4|foo4|bar4|elephant4
...
```

**カスタム区切り文字を使用するファイルをインポートするには**

1. インポートされたデータのテーブルをデータベースに作成します。

   ```
   postgres=> CREATE TABLE test (a text, b text, c text, d text, e text);
   ```

1. データを Amazon S3 からインポートするには、次の形式の [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 関数を使用します。

   または、[aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri) 関数の呼び出しのインラインを `aws_s3.table_import_from_s3` 関数の呼び出し内に含めて、ファイルを指定することもできます。

   ```
   postgres=> SELECT aws_s3.table_import_from_s3(
      'test',
      'a,b,d,e',
      'DELIMITER ''|''', 
      aws_commons.create_s3_uri('amzn-s3-demo-bucket', 'pipeDelimitedSampleFile', 'us-east-2')
   );
   ```

データが、次の列のテーブル内に入りました。

```
postgres=> SELECT * FROM test;
a | b | c | d | e 
---+------+---+---+------+-----------
1 | foo1 | | bar1 | elephant1
2 | foo2 | | bar2 | elephant2
3 | foo3 | | bar3 | elephant3
4 | foo4 | | bar4 | elephant4
```

## Amazon S3 圧縮 (gzip) ファイルをインポートする
<a name="USER_PostgreSQL.S3Import.FileFormats.gzip"></a>

以下の例では、gzip で圧縮されているファイルを Amazon S3 からインポートする方法を示します。インポートするファイルには、次の Amazon S3 メタデータが必要です。
+ キー: `Content-Encoding`
+ 値: `gzip`

AWS マネジメントコンソール を使用してファイルをアップロードする場合、通常このメタデータは、システムにより適用されます。AWS マネジメントコンソール、AWS CLI、または API による Amazon S3 へのファイルのアップロードについては、「*Amazon Simple Storage Service ユーザーガイド*」の「[オブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)」を参照してください。

Amazon S3 のメタデータに関する情報、およびシステム提供メタデータの詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[Amazon S3 コンソールでのオブジェクトメタデータの編集](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-object-metadata.html)」を参照してください。

以下に示されているように、gzip ファイルを RDS for PostgreSQL DB インスタンスにインポートします。

```
postgres=> CREATE TABLE test_gzip(id int, a text, b text, c text, d text);
postgres=> SELECT aws_s3.table_import_from_s3(
 'test_gzip', '', '(format csv)',
 'amzn-s3-demo-bucket', 'test-data.gz', 'us-east-2'
);
```

## エンコードされた Amazon S3 ファイルをインポートする
<a name="USER_PostgreSQL.S3Import.FileFormats.Encoded"></a>

以下の例では、Windows-1252 でエンコードされているファイルを Amazon S3 からインポートする方法を示します。

```
postgres=> SELECT aws_s3.table_import_from_s3(
 'test_table', '', 'encoding ''WIN1252''',
 aws_commons.create_s3_uri('amzn-s3-demo-bucket', 'SampleFile', 'us-east-2')
);
```

# 関数リファレンス
<a name="USER_PostgreSQL.S3Import.Reference"></a>

**Topics**
+ [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3)
+ [aws\$1commons.create\$1s3\$1uri](#USER_PostgreSQL.S3Import.create_s3_uri)
+ [aws\$1commons.create\$1aws\$1credentials](#USER_PostgreSQL.S3Import.create_aws_credentials)

## aws\$1s3.table\$1import\$1from\$1s3
<a name="aws_s3.table_import_from_s3"></a>

Amazon S3 データを Amazon RDS テーブルにインポートします。`aws_s3` 拡張機能には、`aws_s3.table_import_from_s3` 関数が含まれます。戻り値はテキストです。

### 構文
<a name="aws_s3.table_import_from_s3-syntax"></a>

必須のパラメータは、`table_name`、`column_list`、`options` です。これらのパラメータを使用して、データベースを特定し、データをテーブルにコピーする方法を指定します。

また、次のパラメータを使用することもできます。
+ `s3_info` パラメータは、インポートする Amazon S3 ファイルを指定します。このパラメータを使用する場合、PostgreSQL DB インスタンスの IAM ロールを使用して、Amazon S3 へのアクセス権を付与します。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     s3_info aws_commons._s3_uri_1
  )
  ```
+ `credentials` パラメータは、Amazon S3 にアクセスするための認証情報を指定します。このパラメータを使用する場合、IAM ロールは使用しません。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     s3_info aws_commons._s3_uri_1,
     credentials aws_commons._aws_credentials_1
  )
  ```

### パラメータ
<a name="aws_s3.table_import_from_s3-parameters"></a>

 *table\$1name*   
データのインポート先となる PostgreSQL データベーステーブルの名前を含む必須のテキスト文字列。

 *column\$1list*   
データをコピーする PostgreSQL データベーステーブル列のオプションリストを含む必須のテキスト文字列。文字列が空の場合、テーブルの列がすべて使用されます。例については、「[カスタム区切り文字を使用する Amazon S3 ファイルをインポートする](USER_PostgreSQL.S3Import.FileFormats.md#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)」を参照してください。

 *オプション*   
PostgreSQL `COPY` コマンドの引数を含む必須のテキスト文字列。これらの引数は PostgreSQL のテーブルにデータをコピーする方法を指定します。詳細については、「[PostgreSQL COPY ドキュメント](https://www.postgresql.org/docs/current/sql-copy.html)」を参照してください。

 *s3\$1info*   
S3 オブジェクトに関する以下の情報を含む `aws_commons._s3_uri_1` 複合型。  
+ `bucket` - ファイルを含む Amazon S3 バケット名。
+ `file_path` - Amazon S3ファイルのパスを含むファイル名。
+ `region` - ファイルがある AWS リージョン。AWS リージョン名と関連する値のリストについては、「[リージョン、アベイラビリティーゾーン、および Local Zones](Concepts.RegionsAndAvailabilityZones.md)」を参照してください。

 *credentials*   
インポートオペレーションに使用する次の認証情報を含む `aws_commons._aws_credentials_1` 複合型。  
+ アクセスキー
+ シークレットキー
+ セッショントークン
`aws_commons._aws_credentials_1` 複合構造を作成する方法については、「[aws\$1commons.create\$1aws\$1credentials](#USER_PostgreSQL.S3Import.create_aws_credentials)」を参照してください。

### 代替構文
<a name="aws_s3.table_import_from_s3-alternative-syntax"></a>

テストしやすいように、`s3_info` パラメータや `credentials` パラメータではなく、拡張されたパラメータセットを使用することができます。以下は、`aws_s3.table_import_from_s3` 関数の構文のバリエーションです。
+ Amazon S3 ファイルを識別するために `s3_info` パラメータを使用する代わりに、`bucket`、`file_path`、および `region` パラメータの組み合わせを使用します。この関数の形式を使用する場合は、PostgreSQL DB インスタンスの IAM ロールを使用して、Amazon S3 へのアクセス権を付与します。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     bucket text, 
     file_path text, 
     region text 
  )
  ```
+ Amazon S3 アクセスを指定するために `credentials` パラメータを使用する代わりに、`access_key`、`session_key`、および `session_token` パラメータの組み合わせを使用します。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     bucket text, 
     file_path text, 
     region text, 
     access_key text, 
     secret_key text, 
     session_token text 
  )
  ```

### 代替パラメータ
<a name="aws_s3.table_import_from_s3-alternative-parameters"></a>

*バケット*  
ファイルを含む Amazon S3 バケットの名前を含むテキスト文字列。

*file\$1path*  
ファイルのパスを含むAmazon S3ファイル名を含むテキスト文字列。

*リージョン*  
ファイルの AWS リージョンの場所を識別するテキスト文字列。AWS リージョン 名と関連する値のリストについては、「[リージョン、アベイラビリティーゾーン、および Local Zones](Concepts.RegionsAndAvailabilityZones.md)」を参照してください。

*access\$1key*  
インポートオペレーションに使用するアクセスキーを含むテキスト文字列。デフォルトは NULL です。

*secret\$1key*  
インポートオペレーションに使用するシークレットキーを含むテキスト文字列。デフォルトは NULL です。

*session\$1token*  
(オプション) インポートオペレーションに使用するセッションキーを含むテキスト文字列。デフォルトは NULL です。

## aws\$1commons.create\$1s3\$1uri
<a name="USER_PostgreSQL.S3Import.create_s3_uri"></a>

Amazon S3 ファイル情報を保持するように、`aws_commons._s3_uri_1` 構造を作成します。`aws_commons.create_s3_uri` 関数の結果は、`s3_info` 関数の [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3) パラメータで使用します。

### 構文
<a name="USER_PostgreSQL.S3Import.create_s3_uri-syntax"></a>

```
aws_commons.create_s3_uri(
   bucket text,
   file_path text,
   region text
)
```

### パラメータ
<a name="USER_PostgreSQL.S3Import.create_s3_uri-parameters"></a>

*バケット*  
ファイルの Amazon S3 バケット名を含む必須のテキスト文字列。

*file\$1path*  
ファイルのパスを含む Amazon S3 ファイル名を含む必須テキスト文字列。

*リージョン*  
ファイルがある AWS リージョン を含む必須のテキスト文字列。AWS リージョン 名と関連する値のリストについては、「[リージョン、アベイラビリティーゾーン、および Local Zones](Concepts.RegionsAndAvailabilityZones.md)」を参照してください。

## aws\$1commons.create\$1aws\$1credentials
<a name="USER_PostgreSQL.S3Import.create_aws_credentials"></a>

`aws_commons._aws_credentials_1` 構造でアクセスキーとシークレットキーを設定します。`aws_commons.create_aws_credentials` 関数の結果は、`credentials` 関数の [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3) パラメータで使用します。

### 構文
<a name="USER_PostgreSQL.S3Import.create_aws_credentials-syntax"></a>

```
aws_commons.create_aws_credentials(
   access_key text,
   secret_key text,
   session_token text
)
```

### パラメータ
<a name="USER_PostgreSQL.S3Import.create_aws_credentials-parameters"></a>

*access\$1key*  
Amazon S3 ファイルのインポートに使用するアクセスキーを含む必須のテキスト文字列。デフォルトは NULL です。

*secret\$1key*  
Amazon S3 ファイルのインポートに使用するシークレットキーを含む必須のテキスト文字列。デフォルトは NULL です。

*session\$1token*  
Amazon S3 ファイルのインポートに使用するセッショントークンを含む必須のテキスト文字列。デフォルトは NULL です。オプションの `session_token` を指定した場合は、一時的な認証情報を使用することができます。

# DB インスタンス 間での PostgreSQL データベースの移行
<a name="PostgreSQL.TransportableDB"></a>

Amazon RDS の PostgreSQL トランスポータブルデータベースを使用することで、2 つの DB インスタンス間で PostgreSQL データベースを移行できます。この手法により、異なる DB インスタンス間での大規模なデータベースの移行が大幅に高速化されます。このアプローチを使用するには、対象の DB インスタンスの両方で、PostgreSQL の同じ主要バージョンを実行している必要があります。

この機能を使用するには、移行元の DB インスタンスと移行先の DB インスタンスで、ともに `pg_transport` 拡張機能をインストールします。`pg_transport` 拡張は、最小限のプロセスでデータベースファイルを移動するための、物理的な移行メカニズムを提供します。このメカニズムにより、ダンプとロードによる従来のプロセスと比較してデータの移行が大幅に高速化され、ダウンタイムが最小限に抑えられます。

**注記**  
PostgreSQL トランスポータブルデータベースは、RDS for PostgreSQL 11.5 以降、および RDS for PostgreSQL のバージョン 10.10 以降で利用可能です。

ある RDS for PostgreSQL DB インスタンスから別のインスタンスへの、PostgreSQL DB インスタンスの移行を行うには、最初に、「[ 移行に向けた DB インスタンスの設定](PostgreSQL.TransportableDB.Setup.md)」での説明に従いながら、ソースインスタンスとデスティネーションインスタンスの設定を行います。その後、「[ PostgreSQL データベースの移行](PostgreSQL.TransportableDB.Transporting.md)」で説明されている関数を使用してデータベースを移行します。

**Topics**
+ [データベースの移行中に何が起こるか](#PostgreSQL.TransportableDB.DuringTransport)
+ [PostgreSQL トランスポータブルデータベースの使用に関する制約事項](#PostgreSQL.TransportableDB.Limits)
+ [PostgreSQL データベース移行の設定](PostgreSQL.TransportableDB.Setup.md)
+ [移行元から移行先への PostgreSQL データベースの転送](PostgreSQL.TransportableDB.Transporting.md)
+ [トランスポータブルデータベースの関数リファレンス](PostgreSQL.TransportableDB.transport.import_from_server.md)
+ [トランスポータブルデータベースのパラメータリファレンス](PostgreSQL.TransportableDB.Parameters.md)

## データベースの移行中に何が起こるか
<a name="PostgreSQL.TransportableDB.DuringTransport"></a>

PostgreSQL のトランスポータブルデータベース機能は、移行先 DB インスタンスが移行元 DB インスタンスからデータベースをインポートするプルモデルを使用します。`transport.import_from_server` 関数を使うと、移行先 DB インスタンスで移行中のデータベースが作成されます。移行中、移行中のデータベースは、移行先 DB インスタンスではアクセスすることはできません。

移行スタートの際は、移行元データベースのすべての現在のセッションが終了します。移行元 DB インスタンスの移行元データベース以外のすべてのデータベースには移行による影響はありません。

移行元データベースは、特別な読み取り専用モードとなります。このモードの最中は、移行元データベースにアクセス可能で、読み取り専用のクエリを実行できます。ですが、書き込み可能なクエリやその他の種類のコマンドはブロックされます。移行された特定の移行元データベースのみがこれら制限による影響を受けます。

移行中、移行元 DB インスタンスは、ポイントインタイムの復元はできません。これは、移行がトランザクションではなく、変更を記録するための PostgreSQL ログ先行書き込みを使用しないからです。移行先 DB インスタンスの自動バックアップが有効になっていれば、移行後に、バックアップが自動で実行されます。ポイントインタイムの復元は、バックアップが終了した*後*に実行が可能になります。

移行に失敗した場合、`pg_transport` のエクステンションが、移行先/元 DB インスタンスで行ったすべての変更をやり直します。これには、移行先で一部のみ移行されたデータベースの削除も含まれます。失敗の内容によっては、移行元データベースで引き続き、書き込み可能クエリが拒否されます。これが発生した場合、以下のコマンドを使い、書き込み可能クエリを許可します。

```
ALTER DATABASE db-name SET default_transaction_read_only = false;
```

## PostgreSQL トランスポータブルデータベースの使用に関する制約事項
<a name="PostgreSQL.TransportableDB.Limits"></a>

トランスポータブルデータベースには以下の制限があります。
+ **リードレプリカ** - リードレプリカまたはリードレプリカの親インスタンスでは、トランスポータブルデータベースを使用できません。
+ **サポートされていない列タイプ** - このメソッドを使用して移行するすべてのデータベーステーブル内の `reg` データ型を使用することはできません。これらタイプは、システムカタログオブジェクト ID (OID) に依存し、移行中に変わることがあります。
+ **テーブルスペース**　-すべてのソースデータベースオブジェクトは既定の `pg_default` テーブルスペースに既存しなければいけません。
+ **互換性** - 移行先および移行元両方の DB インスタンスは、PostgreSQL の同じ主要バージョンを実行しなければなりません。
+ **拡張機能** – 移行元 DB インスタンスには、`pg_transport` のみがインストールされています。
+ **ロールおよび ACL** - 移行元データベースのアクセス権限および所有権情報は、移行先データベースには移行されません。すべてのデータベースオブジェクトは、移行するローカルの移行先ユーザーが作成および所有します。
+ **同時移行数** – ワーカープロセスが適切に設定されていれば、単一の DB インスタンスで同時に最大 32 個の (インポートとエクスポートの両方を含む) 移行をサポートできます。
+ **RDS for PostgreSQL DB インスタンスのみ** – PostgreSQL のトランスポータブルデータベースは、RDS for PostgreSQL DB インスタンスでのみサポートされます。オンプレミスのデータベースや Amazon EC2 で実行されているデータベースでは使用できません。

# PostgreSQL データベース移行の設定
<a name="PostgreSQL.TransportableDB.Setup"></a>

この作業を開始する前に、対象の RDS for PostgreSQL DB インスタンスが、以下の要件を満たしていることを確認してください。
+ 移行先および移行元両方の RDS for PostgreSQL DB インスタンスは、PostgreSQL の同じバージョンを実行している必要があります。
+ 移行先の DB は、移行する元である DB と同じ名前のデータベースを持つことはできません。
+ 移行を実行するために使用するアカウントでは、移行元と移行先の両方の DB で、`rds_superuser` の権限が付与される必要があります。
+ 移行元 DB インスタンスのセキュリティグループは、移行先 DB インスタンスからのインバウンドアクセスを許可する必要があります。この許可は、移行元と移行先の DB インスタンスが VPC 内に存在する場合には、既に設定されている場合があります。セキュリティグループの詳細については、[セキュリティグループによるアクセス制御](Overview.RDSSecurityGroups.md) を参照してください。

データベースを移行元 DB インスタンスから移行先 DB インスタンスに移行する際には、各インスタンスに関連付けられた DB パラメータグループをいくつか変更する必要があります。つまり、移行元の DB インスタンスと移行先の DB インスタンスのそれぞれのために、カスタムの DB パラメータグループを作成する必要があります。

**注記**  
DB インスタンスで、カスタム DB パラメータグループの使用が設定済みである場合は、以下の手順のステップ 2 から開始できます。

**データベースを移行するためのカスタム DB グループパラメータを構成するには**

以下の手順では、`rds_superuser` の権限を持つアカウントを使用します。

1. 移行元と移行先の DB インスタンスがデフォルトの DB パラメータグループを使用している場合は、そのインスタンス用として適切なバージョンの、カスタム DB パラメータグループを作成する必要があります。これにより、複数のパラメータの値を変更できるようになります。詳細については、「[Amazon RDS のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

1. カスタム DB パラメータグループ内で、以下のパラメータの値を変更します。
   + `shared_preload_libraries` – ライブラリのリストに `pg_transport` を追加します。
   + `pg_transport.num_workers` – デフォルト値は 3 です。データベースの必要に応じて、この値を増減します。200 GB のデータベースでは、8 以下を推奨します。このパラメータのデフォルト値を増加させた場合は、`max_worker_processes` の値も増やす必要があることに注意してください。
   + `pg_transport.work_mem` – デフォルト値は、PostgreSQL のバージョンによって 128 MB または 256 MB のどちらかになります。デフォルト設定は、通常、特に変更する必要はありません。
   + `max_worker_processes` — このパラメータの値は、次の計算を使用して設定する必要があります。

     ```
     (3 * pg_transport.num_workers) + 9
     ```

     この値は、トランスポートに関連するさまざまなバックグラウンドワーカープロセスを処理するために、接続先で必要です。`max_worker_processes,` の詳細については、PostgreSQL ドキュメントの「[Resource Consumption](https://www.postgresql.org/docs/current/runtime-config-resource.html)」(資源の消費) を参照してください。

   `pg_transport` パラメータの詳細については、「[トランスポータブルデータベースのパラメータリファレンス](PostgreSQL.TransportableDB.Parameters.md)」を参照してください。

1. 移行元と移行先の RDS for PostgreSQL DB インスタンスをともに再起動して、パラメータの設定を有効にします。

1. 移行元の RDS for PostgreSQL DB インスタンスに接続します。

   ```
   psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. DB インスタンスのパブリックスキーマから無関係な拡張機能を削除します。実際の移行オペレーション中に使用が許可されるのは、`pg_transport` 拡張機能のみです。

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

   ```
   postgres=> CREATE EXTENSION pg_transport;
   CREATE EXTENSION
   ```

1. 移行先の RDS for PostgreSQL DB インスタンスに接続します。無関係な拡張機能をすべて削除した上で、`pg_transport` 拡張機能をインストールします。

   ```
   postgres=> CREATE EXTENSION pg_transport;
   CREATE EXTENSION
   ```

# 移行元から移行先への PostgreSQL データベースの転送
<a name="PostgreSQL.TransportableDB.Transporting"></a>

[PostgreSQL データベース移行の設定](PostgreSQL.TransportableDB.Setup.md) で記載したプロセスを完了すると、移行をスタートすることが可能です。移行をスタートするには、移行先 DB インスタンスで `transport.import_from_server` 関数を実行します。次の構文では、関数に使用するパラメータを確認できます。

```
SELECT transport.import_from_server( 
   'source-db-instance-endpoint', 
    source-db-instance-port, 
   'source-db-instance-user', 
   'source-user-password', 
   'source-database-name', 
   'destination-user-password', 
   false);
```

この例での `false` 値は、この処理がドライランではないことを関数に伝えます。移行の設定をテストするには、以下のように、関数の呼び出し時に `dry_run` オプションで `true` を指定します。

```
postgres=> SELECT transport.import_from_server(
    'docs-lab-source-db.666666666666aws-region.rds.amazonaws.com', 5432,
    'postgres', '********', 'labdb', '******', true);
INFO:  Starting dry-run of import of database "labdb".
INFO:  Created connections to remote database        (took 0.03 seconds).
INFO:  Checked remote cluster compatibility          (took 0.05 seconds).
INFO:  Dry-run complete                         (took 0.08 seconds total).
 import_from_server
--------------------

(1 row)
```

`pg_transport.timing` パラメータがデフォルト値の `true` に設定されているため、INFO 行が出力されます。次に示すように、`dry_run` に `false` を設定してコマンドを実行し、データベースを移行元から移行先にインポートします。

```
INFO:  Starting import of database "labdb".
INFO:  Created connections to remote database        (took 0.02 seconds).
INFO:  Marked remote database as read only           (took 0.13 seconds).
INFO:  Checked remote cluster compatibility          (took 0.03 seconds).
INFO:  Signaled creation of PITR blackout window     (took 2.01 seconds).
INFO:  Applied remote database schema pre-data       (took 0.50 seconds).
INFO:  Created connections to local cluster          (took 0.01 seconds).
INFO:  Locked down destination database              (took 0.00 seconds).
INFO:  Completed transfer of database files          (took 0.24 seconds).
INFO:  Completed clean up                            (took 1.02 seconds).
INFO:  Physical transport complete              (took 3.97 seconds total).
import_from_server
--------------------
(1 row)
```

この関数には、データベースユーザーパスワードを入力する必要があります。よって、移行完了後は、使用したユーザーロールのパスワードを変更することをお勧めします。または、SQL のバインド可変を使用するとユーザーロールを一時的に作成することができます。このようなテンポラリロールを移行に使ったら、破棄することが可能です。

移行が成功しなかった場合、次のようなエラーメッセージが表示されることがあります。

```
pg_transport.num_workers=8 25% of files transported failed to download file data
```

「failed to download file data (ファイルデータのダウンロードに失敗しました)」というエラーメッセージは、データベースのサイズに対してワーカープロセスの数が正しく設定されていないことを示します。`pg_transport.num_workers` に設定した値の増減が必要な場合があります。失敗が発生するたびに、処理の完了率がレポートされるため、変更の影響度合いを確認できます。例えば、あるケースで設定を 8 から 4 に変更した場合、次のような結果になります。

```
pg_transport.num_workers=4 75% of files transported failed to download file data
```

`max_worker_processes` パラメーターは、移行のプロセス中にも考慮されることにご留意ください。つまり、データベースを正常に移行するためには、`pg_transport.num_workers` と `max_worker_processes` の両方で変更が必要な場合があります。`pg_transport.num_workers` に 2 を設定することで、最終的にこの例は正しく機能します。

```
pg_transport.num_workers=2 100% of files transported
```

`transport.import_from_server` 関数とそのパラメータの詳細については、「[トランスポータブルデータベースの関数リファレンス](PostgreSQL.TransportableDB.transport.import_from_server.md)」を参照してください。

# トランスポータブルデータベースの関数リファレンス
<a name="PostgreSQL.TransportableDB.transport.import_from_server"></a>

`transport.import_from_server` 関数は、PostgreSQL データベースを移行元 DB インスタンスから移行先 DB インスタンスにインポートします。これは、物理的なデータベース接続移行メカニズムを使って実行されます。

この関数は、移行元と移行先の DB インスタンスが同じバージョンであり、移行のための互換性があることを、移行の開始前に確認します。また、移行先の DB インスタンスに、移行元のサイズに見合うの十分な領域があることも確認します。

**[Syntax]** (構文)

```
transport.import_from_server(
   host text,
   port int,
   username text,
   password text,
   database text,
   local_password text,
   dry_run bool
)
```

**戻り値**

なし。

パラメータ****

`transport.import_from_server` 関数パラメータの説明に関しては、以下のテーブルをご参照ください。


****  

| Parameter | 説明 | 
| --- | --- | 
| host |  移行元 DB インスタンスのエンドポイント。  | 
| port | 整数は、移行元 DB インスタンスを表しています。PostgreSQL DB インスタンスは、通常ポート 5432 を使います。 | 
| username |  移行元 DB インスタンスのユーザー。このユーザーは、`rds_superuser` ロールのメンバーでなければなりません。  | 
| password |  移行元 DB インスタンスのユーザーパスワード。  | 
| database |  移行する移行元 DB インスタンスのデータベース名。  | 
| local\$1password |  移行先 DB インスタンスの現在のユーザーのローカルパスワード。このユーザーは、`rds_superuser` ロールのメンバーでなければなりません。  | 
| dry\$1run | リハーサルを実施するかどうかを判断する任意のブール値。デフォルトは、`false` で、移行を実行することを意味します。実際に移行せずに、移行元と移行先 DB インスタンスの互換性を確認するには、dry\$1run を true に設定します。 | 

**例**

例については、「[移行元から移行先への PostgreSQL データベースの転送](PostgreSQL.TransportableDB.Transporting.md)」を参照してください。

# トランスポータブルデータベースのパラメータリファレンス
<a name="PostgreSQL.TransportableDB.Parameters"></a>

複数のパラメータにより、`pg_transport` 拡張機能の動作が制御されます。以下で、これらのパラメータの説明を参照してください。

**`pg_transport.num_workers`**  
移行プロセスに使用するワーカー数。デフォルトは 3 です。有効な値は、1-32 です。大規模なデータベースを移行する場合でも、通常必要なワーカー数は 8 未満です。移行中には、移行先 DB インスタンスの設定が、移行先および移行元の両方の DB インスタンスで使用されます。

**`pg_transport.timing` **  
移行中にタイミング情報を報告するかどうかを指定します。デフォルトは `true` で、タイミング情報が報告されることを意味します。進行状況を監視できるようにするため、このパラメータは `true` に設定しておくことをお勧めします。出力例については、「[移行元から移行先への PostgreSQL データベースの転送](PostgreSQL.TransportableDB.Transporting.md)」を参照してください。

**`pg_transport.work_mem`**  
メモリの最大容量を各ワーカーに配分する。PostgreSQL のバージョンに応じて、この設定のデフォルトは、131,072 キロバイト (KB) または 262,144 KB (256 MB) のどちらかになります。最小値は 64 メガバイト (65,536 KB) です。2 進法ベースの 2 ユニット (1 KB = 1,024 バイト) なので、有効値は、キロバイト (KB) で表記されます。  
移行は、このパラメータで指定されたメモリより少ないメモリを使う場合があります。移行するデータベースが大規模な場合でも、通常必要なメモリは、ワーカー当たり 256 MB (262,144 KB) 未満です。