Aurora PostgreSQL DB クラスターから Amazon S3 へのデータのエクスポート - Amazon Aurora

Aurora PostgreSQL DB クラスターから Amazon S3 へのデータのエクスポート

Aurora PostgreSQL DB クラスター からデータをクエリし、Amazon S3 バケットに保存されているファイルに直接エクスポートできます。そのために、Aurora PostgreSQL によって提供される aws_s3 PostgreSQL 拡張機能を使用します。S3 へのアップロードでは、デフォルトでサーバー側の暗号化が使用されます。

注記

Aurora PostgreSQL から Amazon S3 にデータをエクスポートするには、データベースで次の PostgreSQL エンジンのいずれかのバージョンが実行されている必要があります。

  • 10.14 以降

  • 11.9 以降

  • 12.4 以降.

Amazon S3 を使用したデータの保存の詳細については、Amazon Simple Storage Service 入門ガイドの「バケットの作成」を参照してください。

注記

AWS Management Console、AWS CLI、または Amazon RDS API を使用して、DB および DB クラスターのスナップショットデータを Amazon S3 に保存できます。詳細については、Amazon S3 への DB スナップショットデータのエクスポート を参照してください。

Amazon S3 へのデータのエクスポートの概要

Aurora PostgreSQL データベースに格納されたデータを Amazon S3 バケットにエクスポートするには、以下の手順に従います。

Aurora PostgreSQL データを S3 にエクスポートするには

  1. ご使用の Aurora PostgreSQL のバージョンで Amazon S3 エクスポートがサポートされていることを確認します。現在、エクスポートは PostgreSQL 10.14、11.9、12.4 以降でサポートされています。

  2. 必要な PostgreSQL 拡張機能をインストールします。たとえば、aws_s3 および aws_commons などがあります。これを行うには psql を起動し、以下のコマンドを使用します。

    CREATE EXTENSION IF NOT EXISTS aws_s3 CASCADE;

    aws_s3 拡張機能には、Amazon S3 へのデータのエクスポートに使用する aws_s3.query_export_to_s3 関数が含まれます。aws_commons 拡張機能は、追加のヘルパー関数を提供するために含まれています。

  3. データのエクスポートに使用する Amazon S3 ファイルパスを指定します。このプロセスの詳細については、「エクスポート先の Amazon S3 ファイルパスを指定する」を参照してください。

  4. Amazon S3 バケットへのアクセス許可を提供します。

    Amazon S3 ファイルにデータをエクスポートするには、Aurora PostgreSQL DB クラスターに、エクスポートの際に保存に使用される Amazon S3 バケットへのアクセス許可を付与する必要があります。これには、次の手順が含まれます。

    1. エクスポート先の Amazon S3 バケットへのアクセスを提供する IAM ポリシーを作成します。

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

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

    4. この IAM ロールを DB クラスターに追加します。

    このプロセスの詳細については、「Amazon S3 バケットへのアクセスを設定する」を参照してください。

  5. データを取得するためのデータベースクエリを識別します。aws_s3.query_export_to_s3 関数を呼び出して、クエリデータをエクスポートします。

    前述の準備タスクを完了したら、aws_s3.query_export_to_s3 関数を使用してクエリ結果を Amazon S3 にエクスポートします。このプロセスの詳細については、「aws_s3.query_export_to_s3 関数を使用したクエリデータのエクスポート」を参照してください。

PostgreSQL バージョンがエクスポートをサポートしていることを確認します。

現在、Amazon S3 エクスポートは PostgreSQL 10.14、11.9、および 12.4 以降でサポートされています。describe-db-engine-versionsコマンドを使用して、サポートを確認することもできます。次に、バージョン 10.14 のサポートを確認する例を示します。

aws rds describe-db-engine-versions --region us-east-1 \ --engine postgres --engine-version 10.14 | grep s3Export

出力に "s3Export" の文字列が含まれている場合 、エンジンは Amazon S3 エクスポートをサポートします。それ以外の場合、エンジンはエクスポートをサポートしません。

エクスポート先の Amazon S3 ファイルパスを指定する

次の情報を指定して、Amazon S3 データのエクスポート先となる場所を指定します。

  • バケット名 – バケットは、Amazon S3 オブジェクトまたはファイルのコンテナです。

    Amazon S3 を使用したデータの保存の詳細については、Amazon Simple Storage Service 入門ガイドの「バケットを作成する」と「オブジェクトを表示する」を参照してください。

  • ファイルパス – ファイルパスは、Amazon S3 バケット内のエクスポートが格納される場所を識別します。ファイルパスは、次のもので構成されます。

    • 仮想フォルダパスを識別するオプションのパスプレフィックス。

    • 保存する 1 つ以上のファイルを識別するファイルプレフィックス。より大きなエクスポートは複数のファイルに格納され、それぞれの最大サイズは約 6 GB です。追加のファイル名には、同じファイルプレフィックスが付いていますが、末尾に _partXX が付加されます。XX は、2、3 などを表します。

    たとえば、exports フォルダとファイルプレフィックスを持つ query-1-export ファイルパスは /exports/query-1-export です。

  • AWS リージョン (オプション) – Amazon S3 バケットがある AWS リージョン。AWS リージョンの値を指定しない場合、Aurora は、エクスポートする DB クラスターと同じ AWS リージョンの Amazon S3 にファイルを保存します。

    注記

    現在、AWS リージョンは、エクスポートする DB クラスターのリージョンと同じである必要があります。

    AWS リージョン名と関連する値のリストについては、「 リージョンとアベイラビリティーゾーン 」を参照してください。

エクスポートの保存先に関する Amazon S3 ファイル情報を保持するには、 aws_commons.create_s3_uri 関数を使用して、次のように aws_commons._s3_uri_1 複合構造を作成します。

psql=> SELECT aws_commons.create_s3_uri( 'sample-bucket', 'sample-filepath', 'us-west-2' ) AS s3_uri_1 \gset

その後、この s3_uri_1 値を aws_s3.query_export_to_s3 関数の呼び出しでパラメータとして指定します。例については、「aws_s3.query_export_to_s3 関数を使用したクエリデータのエクスポート」を参照してください。

Amazon S3 バケットへのアクセスを設定する

データを Amazon S3 にエクスポートするには、PostgreSQL DB クラスターに、ファイルが入る Amazon S3 バケットに対するアクセス許可を付与します。

これには、以下の手順を使用します。

IAM ロールを介して PostgreSQLDB のクラスターに Amazon S3 へのアクセスを許可するには

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

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

    このポリシーの作成の一環として、次の手順を実行します。

    1. ポリシーに、PostgreSQL DB クラスターから Amazon S3 バケットへのファイル転送を許可するための以下の必須アクションを含めます。

      • s3:PutObject

      • s3:AbortMultipartUpload

    2. Amazon S3 バケットとバケット内のオブジェクトを識別する Amazon リソースネーム (ARN) を含めます。Amazon S3 アクセス用の ARN 形式は arn:aws:s3:::your-s3-bucket/* です。

    Aurora PostgreSQL の IAM ポリシーの作成の詳細については、IAM データベースアクセス用の IAM ポリシーの作成と使用 を参照してください。IAM ユーザーガイドの「チュートリアル: はじめてのカスタマー管理ポリシーの作成とアタッチ」も参照してください。

    以下の AWS CLI コマンドでは、これらのオプションを指定して、rds-s3-export-policy という名前の IAM ポリシーを作成します。このポリシーでは、your-s3-bucket という名前のバケットへのアクセス権が付与されます。

    警告

    特定のバケットにアクセスするようにエンドポイントポリシーが設定されているプライベート VPC 内にデータベースをセットアップすることをお勧めします。詳細については、Amazon VPC ユーザーガイドの「Amazon S3 のエンドポイントポリシーの使用」を参照してください。

    すべてのリソースへのアクセスを持つポリシーを作成しないことを強くお勧めします。このアクセスは、データセキュリティにとって脅威になる可能性があります。"Resource":"*" を使用してすべてのリソースへのアクセスを S3:PutObject に許可するポリシーを作成すると、エクスポート権限を持つユーザーはアカウント内のすべてのバケットにデータをエクスポートできます。さらに、ユーザーは AWS リージョン内のパブリックに書き込み可能なバケットにデータをエクスポートできます

    ポリシーを作成したら、そのポリシーの Amazon リソースネーム (ARN) を書き留めます。ポリシーを IAM ロールにアタッチする場合、後続のステップで ARN が必要です。

    aws iam create-policy --policy-name rds-s3-export-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3export", "Action": [ "S3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket/*" ] } ] }'
  2. IAM ロールを作成します。

    これを行うと、Aurora PostgreSQL がユーザーに代わってこの IAM ロールを引き受け、Amazon S3 バケットにアクセスできます。詳細については、IAM ユーザーガイドの「IAM ユーザーにアクセス許可を委任するロールの作成」を参照してください。

    次の例は、AWS CLI コマンドを使用して、rds-s3-export-role という名前のロールを作成する方法を示しています。

    aws iam create-role --role-name rds-s3-export-role --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
  3. 作成した IAM ポリシーを、作成した IAM ロールにアタッチします。

    次の AWS CLI コマンドは、先ほど作成したポリシーを rds-s3-export-role. という名前のロールにアタッチします。your-policy-arn を前の手順でメモしたポリシー ARN に置き換えます。

    aws iam attach-role-policy --policy-arn your-policy-arn --role-name rds-s3-export-role
  4. DB クラスターに IAM ロールを追加します。これを行うには、以下で説明するように、AWS Management Console または AWS CLI を使用します。

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

  1. AWS Management Consoleにサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. 詳細を表示するには、PostgreSQL DB クラスターの名前を選択します。

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

  4. [Feature] で、[s3Export] を選択します。

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

CLI を使用して PostgreSQL DB クラスターの IAM ロールを追加するには

  • 次のコマンドを使用して、my-db-cluster という名前の PostgreSQL DB クラスターにロールを追加します。your-role-arn を、以前のステップで書き留めたロール ARN に置き換えます。--feature-name オプションの値に s3Export を使用します。

    Linux、macOS、Unix の場合:

    aws rds add-role-to-db-cluster \ --db-cluster-identifier my-db-cluster \ --feature-name s3Export \ --role-arn your-role-arn \ --region your-region

    Windows の場合:

    aws rds add-role-to-db-cluster ^ --db-cluster-identifier my-db-cluster ^ --feature-name s3Export ^ --role-arn your-role-arn ^ --region your-region

aws_s3.query_export_to_s3 関数を使用したクエリデータのエクスポート

aws_s3.query_export_to_s3 関数を呼び出して、PostgreSQL データを Amazon S3 にエクスポートします。

前提条件

aws_s3.query_export_to_s3 関数を使用する前に、以下の前提条件を満たしていることを確認してください。

次の例では、sample_table というデータベーステーブルを使用しています。次の例では、データを sample-bucket というバケットにエクスポートします。サンプルのテーブルとデータは、psql で次の SQL ステートメントを使用して作成されます。

psql=> CREATE TABLE sample_table (bid bigint PRIMARY KEY, name varchar(80)); psql=> INSERT INTO sample_table (bid,name) VALUES (1, 'Monday'), (2,'Tuesday'), (3, 'Wednesday');

aws_s3.query_export_to_s3 の呼び出し

次に、 aws_s3.query_export_to_s3 関数を呼び出す基本的な方法を示します。

これらの例では、変数 s3_uri_1 を使用して、Amazon S3 ファイルを識別する情報を含む構造を指定しています。aws_commons.create_s3_uri 関数を使用して構造を作成します。

psql=> SELECT aws_commons.create_s3_uri( 'sample-bucket', 'sample-filepath', 'us-west-2' ) AS s3_uri_1 \gset

以下の 2 つの aws_s3.query_export_to_s3 関数呼び出しのパラメータは異なりますが、これらの例の結果は同じです。sample_table テーブルのすべての行が sample-bucket というバケットにエクスポートされます。

psql=> SELECT * FROM aws_s3.query_export_to_s3('SELECT * FROM sample_table', :'s3_uri_1'); psql=> SELECT * FROM aws_s3.query_export_to_s3('SELECT * FROM sample_table', :'s3_uri_1', options :='format text');

パラメータの説明は次のとおりです。

  • 'SELECT * FROM sample_table' – 最初のパラメータは、SQL クエリを含む必須のテキスト文字列です。PostgreSQL エンジンはこのクエリを実行します。クエリの結果は、他のパラメータで指定された S3 バケットにコピーされます。

  • :'s3_uri_1' – このパラメータは、Amazon S3 ファイルを識別する構造です。この例では、変数を使用して、前に作成した構造を指定します。代わりに、以下のように aws_s3.query_export_to_s3 関数呼び出し内にインラインで aws_commons.create_s3_uri 関数呼び出しを含めることで、同じ構造を作成できます。

    SELECT * from aws_s3.query_export_to_s3('select * from sample_table', aws_commons.create_s3_uri('sample-bucket', 'sample-filepath', 'us-west-2') );
  • options :='format text'options パラメータは、PostgreSQL COPY 引数を含むオプションのテキスト文字列です。このコピープロセスでは、PostgreSQL COPY コマンドの引数と形式を使用します。

指定したファイルが Amazon S3 バケットに存在しない場合は、作成されます。このファイルが存在している場合は、上書きされます。Amazon S3 でエクスポートされたデータにアクセスするための構文は次のとおりです。

s3-region://bucket-name[/path-prefix]/file-prefix

より大きなエクスポートは複数のファイルに格納され、それぞれの最大サイズは約 6 GB です。追加のファイル名には、同じファイルプレフィックスが付いていますが、末尾に _partXX が付加されます。XX は、2、3 などを表します。たとえば、次のようにデータファイルを格納するパスを指定するとします。

s3-us-west-2://my-bucket/my-prefix

エクスポートで 3 つのデータファイルを作成する必要がある場合、Amazon S3 バケットには次のデータファイルが含まれます。

s3-us-west-2://my-bucket/my-prefix s3-us-west-2://my-bucket/my-prefix_part2 s3-us-west-2://my-bucket/my-prefix_part3

この関数の完全なリファレンスと、それを呼び出すその他の方法については、「aws_s3.query_export_to_s3」を参照してください。Amazon S3 でファイルにアクセスする方法の詳細については、Amazon Simple Storage Service 入門ガイドの「オブジェクトを表示する」を参照してください。

カスタム区切り文字を使用する CSV ファイルへのエクスポート

次の例は、aws_s3.query_export_to_s3 関数を呼び出して、カスタム区切り文字を使用するファイルにデータをエクスポートする方法を示しています。この例では、PostgreSQL COPY コマンドの引数を使用して、カンマ区切り値 (CSV) f形式とコロン (:) 区切り文字を指定します。

SELECT * from aws_s3.query_export_to_s3('select * from basic_test', :'s3_uri_1', options :='format csv, delimiter $$:$$');

エンコードを使用したバイナリファイルへのエクスポート

次の例は、aws_s3.query_export_to_s3 関数を呼び出して、Windows-1253 エンコーディングのバイナリファイルにデータをエクスポートする方法を示しています。

SELECT * from aws_s3.query_export_to_s3('select * from basic_test', :'s3_uri_1', options :='format binary, encoding WIN1253');

Amazon S3 へのアクセスのトラブルシューティング

Amazon S3 へのデータのエクスポート試行時に接続の問題が発生した場合は、まず DB インスタンスに関連付けられた VPC セキュリティグループのアウトバウンドアクセスルールがネットワーク接続を許可していることを確認します。具体的には、SSL 接続のためにポート 443 へのアクセスを許可する必要があります。詳細については、セキュリティグループを作成して VPC 内の DB クラスターへのアクセスを提供する を参照してください。

推奨事項については、以下も参照してください。

関数リファレンス

aws_s3.query_export_to_s3

PostgreSQL クエリ結果を Amazon S3 バケットにエクスポートします。aws_s3 拡張機能には、aws_s3.query_export_to_s3 関数が含まれます。

2 つの必須パラメータは、query および s3_info です。これらは、エクスポートするクエリを定義し、エクスポート先の Amazon S3 バケットを特定します。options と呼ばれるオプションのパラメータは、さまざまなエクスポートパラメータを定義するために用意されています。aws_s3.query_export_to_s3 関数の使用例については、「aws_s3.query_export_to_s3 関数を使用したクエリデータのエクスポート」を参照してください。

構文

aws_s3.query_export_to_s3( query text, s3_info aws_commons._s3_uri_1, options text )

入力パラメータ

query

PostgreSQL エンジンが実行する SQL クエリを含む必須のテキスト文字列。このクエリ結果は、 s3_info パラメータで指定された S3 バケットにコピーされます。

s3_info

S3 オブジェクトに関する以下の情報を含む aws_commons._s3_uri_1 複合型。

  • bucket – ファイルを格納する Amazon S3 バケットの名前。

  • file_path – Amazon S3ファイル名とパス

  • region – バケットが存在する AWS リージョン。AWS リージョン名と関連する値のリストについては、「 リージョンとアベイラビリティーゾーン 」を参照してください。

    現在、この値は、エクスポートする DB クラスターの AWS リージョンと同じ AWS リージョンである必要があります。デフォルトは、エクスポートする DB クラスターの AWS リージョンです。

aws_commons._s3_uri_1 複合構造を作成するには、aws_commons.create_s3_uri 関数を参照してください。

options

PostgreSQL COPY コマンドの引数を含むオプションのテキスト文字列。これらの引数は、エクスポート時のデータのコピー方法を指定します。詳細については、「PostgreSQL COPY ドキュメント」を参照してください。

代替入力パラメータ

テストしやすいように、s3_info パラメータではなく、拡張されたパラメータセットを使用することができます。以下は、aws_s3.query_export_to_s3 関数の構文のバリエーションです。

Amazon S3 ファイルを識別するために s3_info パラメータを使用する代わりに、bucketfile_path、および region パラメータの組み合わせを使用します。

aws_s3.query_export_to_s3( query text, bucket text, file_path text, region text, options text )
query

PostgreSQL エンジンが実行する SQL クエリを含む必須のテキスト文字列。このクエリ結果は、 s3_info パラメータで指定された S3 バケットにコピーされます。

bucket

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

file_path

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

リージョン

バケットが存在する AWS リージョンを含むオプションのテキスト文字列。AWS リージョン名と関連する値のリストについては、「 リージョンとアベイラビリティーゾーン 」を参照してください。

現在、この値は、エクスポートする DB クラスターの AWS リージョンと同じ AWS リージョンである必要があります。デフォルトは、エクスポートする DB クラスターの AWS リージョンです。

options

PostgreSQL COPY コマンドの引数を含むオプションのテキスト文字列。これらの引数は、エクスポート時のデータのコピー方法を指定します。詳細については、「PostgreSQL COPY ドキュメント」を参照してください。

出力パラメータ

aws_s3.query_export_to_s3( OUT rows_uploaded bigint, OUT files_uploaded bigint, OUT bytes_uploaded bigint )
rows_uploaded

指定されたクエリで Amazon S3 に正常にアップロードされたテーブルローの数。

files_uploaded

Amazon S3 にアップロードされたファイルの数。ファイルは、約 6 GB のサイズで作成されます。作成される各追加ファイルは、名前に _partXX が付加されています。XX は、必要に応じて 2、3 などを表します。

bytes_uploaded

Amazon S3 にアップロードされた合計バイト数。

psql=> SELECT * from aws_s3.query_export_to_s3('select * from sample_table', 'sample-bucket', 'sample-filepath'); psql=> SELECT * from aws_s3.query_export_to_s3('select * from sample_table', 'sample-bucket', 'sample-filepath','us-west-2'); psql=> SELECT * from aws_s3.query_export_to_s3('select * from sample_table', 'sample-bucket', 'sample-filepath','us-west-2','format text');

aws_commons.create_s3_uri

Amazon S3 ファイル情報を保持するように、aws_commons._s3_uri_1 構造を作成します。aws_commons.create_s3_uri 関数の結果は、aws_s3.query_export_to_s3 関数の s3_info パラメータで使用します。aws_commons.create_s3_uri 関数の使用例については、「エクスポート先の Amazon S3 ファイルパスを指定する」を参照してください。

構文

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

入力パラメータ

bucket

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

file_path

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

リージョン

ファイルがある AWS リージョンを含む必須のテキスト文字列。AWS リージョン名と関連する値のリストについては、「 リージョンとアベイラビリティーゾーン 」を参照してください。