Amazon S3 データを Aurora PostgreSQL DB クラスターにインポートする - Amazon Aurora

Amazon S3 データを Aurora PostgreSQL DB クラスターにインポートする

データは、Amazon S3 から、Aurora PostgreSQL DB クラスター に属するテーブルにインポートすることができます。そのために、Aurora PostgreSQL によって提供される aws_s3 PostgreSQL 拡張機能を使用します。

注記

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

Amazon S3 を使用したデータの保存の詳細については、Amazon Simple Storage Service ユーザーガイドの「Create a bucket」を参照してください。Amazon S3 バケットにファイルをアップロードする手順については、Amazon Simple Storage Service ユーザーガイドの「Add an object to a bucket」を参照してください。

Amazon S3 データのインポートの概要

Amazon S3 バケットに保存されたデータを PostgreSQL データベーステーブルにインポートするには、次の手順を実行します。

S3 データを Aurora PostgreSQL にインポートするには

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

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

    aws_s3 拡張機能には、Amazon S3 データのインポートに使用する aws_s3.table_import_from_s3 関数が含まれます。aws_commons 拡張機能は、追加のヘルパー機能を提供します。

  2. 使用するデータベーステーブルと Amazon S3 ファイルを特定します。

    aws_s3.table_import_from_s3 関数には、データをインポートする PostgreSQL データベーステーブルの名前が必要です。この関数は、インポートする Amazon S3 ファイルも指定する必要があります。この情報を提供するには、次の手順を実行します。

    1. データを入力する PostgreSQL データベーステーブルを特定します。例えば、以下はこのトピックの例で使用されるサンプル t1 データベーステーブルです。

      psql=> CREATE TABLE t1 (col1 varchar(80), col2 varchar(80), col3 varchar(80));
    2. 次の情報を取得して、インポートする Amazon S3 ファイルを特定します。

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

      • ファイルパス – ファイルパスは、Amazon S3 バケット内のファイルの場所を指します。

      • AWS リージョン – AWS リージョンは、Amazon S3 バケットの場所を指します。例えば、S3 バケットが US East (N. Virginia) リージョンにある場合、us-east-1 を使用します。AWS リージョン名と関連する値のリストについては、「リージョンとアベイラビリティーゾーン」を参照してください。

      この情報を取得する方法については、Amazon Simple Storage Service ユーザーガイドの「View an object」を参照してください。この情報は、AWS CLI コマンド aws s3 cp を使用して確認できます。情報が正しい場合、このコマンドは Amazon S3 ファイルのコピーをダウンロードします。

      aws s3 cp s3://sample_s3_bucket/sample_file_path ./
    3. aws_commons.create_s3_uri 関数を使用して、Amazon S3 ファイル情報を保持するための aws_commons._s3_uri_1 構造を作成します。この aws_commons._s3_uri_1 構造は、aws_s3.table_import_from_s3 関数への呼び出しパラメータとして使用します。

      psql の例については、次を参照してください。

      psql=> SELECT aws_commons.create_s3_uri( 'sample_s3_bucket', 'sample.csv', 'us-east-1' ) AS s3_uri \gset
  3. Amazon S3 ファイルへのアクセス許可を提供します。

    Amazon S3 ファイルからデータをインポートするには、Aurora PostgreSQL DB クラスターに、ファイルが含まれている Amazon S3 バケットへのアクセス許可を与える必要があります。これを行うには、AWS Identity and Access Management (IAM) ロールまたはセキュリティ認証情報を使用します。詳細については、「Amazon S3 バケットへのアクセスを設定する」を参照してください。

  4. aws_s3.table_import_from_s3 関数を呼び出して Amazon S3 データをインポートします。

    前の準備タスクが完了したら、aws_s3.table_import_from_s3 関数を使用して、Amazon S3 データをインポートします。詳細については、「aws_s3.table_import_from_s3 関数を使用して Amazon S3 データをインポートする」を参照してください。

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

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

IAM ロールを使用した Amazon S3 バケットへのアクセス

Amazon S3 ファイルからデータをロードするには、ファイルが含まれる Amazon S3 バケットへのアクセス許可を Aurora PostgreSQL DB クラスターに与えます。こうすれば、追加の認証情報を管理したり、aws_s3.table_import_from_s3 関数呼び出しで提供したりする必要はありません。

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

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

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

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

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

    • s3:GetObject

    • s3:ListBucket

    ポリシーに次のリソースを含めて、Amazon S3 バケットとバケット内のオブジェクトを識別します。これは、Amazon S3 にアクセスするための Amazon リソースネーム (ARN) 形式を示しています。

    • arn:aws:s3:::your-s3-bucket

    • arn:aws:s3:::your-s3-bucket/*

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

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

    注記

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

    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:::your-s3-bucket", "arn:aws:s3:::your-s3-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:::your-s3-bucket", "arn:aws:s3:::your-s3-bucket/*" ] } ] }'
  2. IAM ロールを作成します。

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

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

    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" } ] }'

    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" } ] }'
  3. 作成した IAM ポリシーを、作成した IAM ロールにアタッチします。

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

    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
  4. DB クラスターに IAM ロールを追加します。

    これを行うには、以下で説明するように、AWS Management Console または AWS CLI を使用します。

    注記

    IAM ロールを Aurora Serverless DB クラスターに関連付けることはできません。詳細については、「Amazon Aurora Serverless v1 の使用」を参照してください。

    また、使用するデータベースには、Amazon S3 データを Aurora PostgreSQL DB クラスターにインポートするに記載されている制限がないことを確認してください 。

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

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

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

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

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

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

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

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

    Linux、macOS、Unix の場合:

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

    Windows の場合:

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

Amazon RDS API を使用して PostgreSQL DB クラスターの IAM ロールを追加するには、AddRoleToDBCluster と、 オペレーションを呼び出します。

セキュリティ認証情報を使用して Amazon S3 バケットにアクセスする

必要に応じて、IAM ロールでアクセスを提供する代わりに、セキュリティ認証情報を使用して Amazon S3 バケットへのアクセスを提供できます これを行うには、credentials 関数呼び出しで aws_s3.table_import_from_s3 パラメータを使用します。

credentials パラメータは、型の構造体 aws_commons._aws_credentials_1 で、AWS 認証情報を含みます。aws_commons.create_aws_credentials 関数を使用して、aws_commons._aws_credentials_1 構造でアクセスキーおよびシークレットキーを設定します。以下に例を示します。

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

aws_commons._aws_credentials_1 構造を作成したら、以下に示すように、aws_s3.table_import_from_s3 関数を credentials パラメータと共に使用してデータをインポートします。

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

または、aws_commons.create_aws_credentials 関数の呼び出しのインラインを aws_s3.table_import_from_s3 関数の呼び出し内に含めることもできます。

psql=> 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 へのアクセスのトラブルシューティング

Amazon S3 ファイルデータをインポートしようとしたときに接続の問題が発生した場合は、次の推奨事項を参照してください。

aws_s3.table_import_from_s3 関数を使用して Amazon S3 データをインポートする

aws_s3.table_import_from_s3 関数を呼び出して Amazon S3 データをインポートします。

注記

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

psql を使用した従来の PostgreSQL の例を以下に示します。

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

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

  • t1 – データのコピー先となる PostgreSQL DB クラスター内のテーブルの名前。

  • '' – データベーステーブル内の列のオプションのリスト。S3 データをコピーする列とテーブル列を指定するには、このパラメータを使用します。列を指定しない場合は、すべての列がテーブルにコピーされます。列のリストの使用例については、カスタム区切り文字を使用する Amazon S3 ファイルをインポートする を参照してください。

  • (format csv) – PostgreSQL COPY 引数。このコピープロセスでは、PostgreSQL COPY コマンドの引数と形式を使用します。前述の例では、COPY コマンドは、カンマ区切り値 (CSV) ファイル形式を使用してデータをコピーします。

  • s3_uri – Amazon S3 ファイルを識別する情報を含む構造。aws_commons.create_s3_uri 関数を使用して s3_uri 構造を作成する例については、「Amazon S3 データのインポートの概要」を参照してください。

戻り値はテキストです。この関数の完全なリファレンスについては、aws_s3.table_import_from_s3 を参照してください。

以下の例は、Amazon S3 データのインポート時にさまざまな種類のファイルを指定する方法を示します。

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

以下の例では、カスタム区切り文字を使用するファイルのインポート方法を示します。また、column_list 関数の 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. インポートされたデータのテーブルをデータベースに作成します。

    psql=> CREATE TABLE test (a text, b text, c text, d text, e text);
  2. データを Amazon S3 からインポートするには、次の形式の aws_s3.table_import_from_s3 関数を使用します。

    または、aws_commons.create_s3_uri 関数の呼び出しのインラインを aws_s3.table_import_from_s3 関数の呼び出し内に含めて、ファイルを指定することもできます。

    psql=> SELECT aws_s3.table_import_from_s3( 'test', 'a,b,d,e', 'DELIMITER ''|''', aws_commons.create_s3_uri('sampleBucket', 'pipeDelimitedSampleFile', 'us-east-2') );

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

psql=> 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) ファイルをインポートする

以下の例では、gzip で圧縮されているファイルを Amazon S3 からインポートする方法を示します。

ファイルに次の Amazon S3 メタデータが含まれていることを確認します。

  • キー: Content-Encoding

  • 値: gzip

これらの値を Amazon S3 メタデータに追加する方法の詳細については、Amazon Simple Storage Service ユーザーガイドの「How do I add metadata to an S3 object?」を参照してください。

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

psql=> CREATE TABLE test_gzip(id int, a text, b text, c text, d text); psql=> SELECT aws_s3.table_import_from_s3( 'test_gzip', '', '(format csv)', 'myS3Bucket', 'test-data.gz', 'us-east-2' );

エンコードされた Amazon S3 ファイルをインポートする

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

psql=> SELECT aws_s3.table_import_from_s3( 'test_table', '', 'encoding ''WIN1252''', aws_commons.create_s3_uri('sampleBucket', 'SampleFile', 'us-east-2') );

関数リファレンス

aws_s3.table_import_from_s3

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

Syntax

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

また、次のパラメータを使用することもできます。

  • 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 )

Parameters

table_name

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

column_list

データをコピーする PostgreSQL データベーステーブル列のオプションリストを含む必須のテキスト文字列。文字列が空の場合、テーブルの列がすべて使用されます。例については、「カスタム区切り文字を使用する Amazon S3 ファイルをインポートする」を参照してください。

options

PostgreSQL COPY コマンドの引数を含む必須のテキスト文字列。これらの引数は PostgreSQL のテーブルにデータをコピーする方法を指定します。詳細については、「PostgreSQL COPY ドキュメント」を参照してください。

s3_info

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

  • bucket – ファイルを含む Amazon S3 バケット名。

  • file_path – Amazon S3ファイルのパスを含むファイル名。

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

認証情報

インポートオペレーションに使用する次の認証情報を含む aws_commons._aws_credentials_1 複合型。

  • アクセスキー

  • シークレットキー

  • セッショントークン

aws_commons._aws_credentials_1 複合構造を作成する方法については、「aws_commons.create_aws_credentials」を参照してください。

代替構文

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

  • Amazon S3 ファイルを識別するために s3_info パラメータを使用する代わりに、bucketfile_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_keysession_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 )

代替パラメータ

bucket

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

file_path

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

リージョン

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

access_key

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

secret_key

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

session_token

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

aws_commons.create_s3_uri

Amazon S3 ファイル情報を保持するように、aws_commons._s3_uri_1 構造を作成します。aws_commons.create_s3_uri 関数の結果は、s3_info 関数の aws_s3.table_import_from_s3 パラメータで使用します。

Syntax

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

Parameters

bucket

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

file_path

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

リージョン

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

aws_commons.create_aws_credentials

aws_commons._aws_credentials_1 構造でアクセスキーとシークレットキーを設定します。aws_commons.create_aws_credentials 関数の結果は、credentials 関数の aws_s3.table_import_from_s3 パラメータで使用します。

Syntax

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

Parameters

access_key

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

secret_key

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

session_token

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