Amazon S3 データを RDS for PostgreSQL DB インスタンスにインポートする
データは、Amazon S3 から、 RDS for PostgreSQL DB インスタンスに属するテーブルにインポートすることができます。そのために、 Amazon RDS によって提供される aws_s3
PostgreSQL エクステンションを使用します。Amazon S3 から RDS for PostgreSQL にインポートするには、データベースで PostgreSQL バージョン 10.7 以降を実行している必要があります。- プロビジョニングされた DB インスタンスにのみインポートできます。つまり、これらの手順は Aurora Serverless v1 ではサポートされていません。
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 データを Amazon RDS にインポートするには
-
必要な 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
エクステンションは、追加のヘルパー機能を提供します。 -
使用するデータベーステーブルと Amazon S3 ファイルを特定します。
aws_s3.table_import_from_s3 関数には、データをインポートする PostgreSQL データベーステーブルの名前が必要です。この関数は、インポートする Amazon S3 ファイルも指定する必要があります。この情報を提供するには、次のステップを実行します。
-
データを入力する PostgreSQL データベーステーブルを特定します。例えば、以下はこのトピックの例で使用されるサンプル
t1
データベーステーブルです。psql=> CREATE TABLE t1 (col1 varchar(80), col2 varchar(80), col3 varchar(80));
-
次の情報を取得して、インポートする Amazon S3 ファイルを特定します。
-
バケット名 - バケットは、Amazon S3 オブジェクトまたはファイルのコンテナです。
-
ファイルパス - ファイルパスは、Amazon S3 バケット内のファイルの場所を指します。
-
AWS リージョン - AWS リージョンは、Amazon S3 バケットの場所を指します。例えば、S3 バケットが US East (N. Virginia) リージョンにある場合、
us-east-1
を使用します。AWS リージョン名と関連する値のリストについては、「リージョン、アベイラビリティーゾーン、および Local Zones」を参照してください。
この情報を取得する方法については、Amazon Simple Storage Service ユーザーガイドの「View an object」を参照してください。この情報は、AWS CLI コマンド
aws s3 cp
を使用して確認できます。情報が正しい場合、このコマンドは Amazon S3 ファイルのコピーをダウンロードします。aws s3 cp s3://
sample_s3_bucket
/sample_file_path
./ -
-
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
-
-
Amazon S3 ファイルへのアクセス許可を提供します。
Amazon S3 ファイルからデータをインポートするには、RDS for PostgreSQL DB インスタンスに、ファイルが含まれている Amazon S3 バケットへのアクセス許可を与える必要があります。これを行うには、AWS Identity and Access Management (IAM) ロールまたはセキュリティ認証情報を使用します。詳細については、「Amazon S3 バケットへのアクセスを設定する」を参照してください。
-
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 ファイルからデータをインポートするには、RDS for PostgreSQL DB インスタンスに、ファイルが含まれている Amazon S3 バケットへのアクセス許可を与える必要があります。次のトピックで説明する 2 つの方法のいずれかで、Amazon S3 バケットへのアクセスを提供します。
トピック
IAM ロールを使用した Amazon S3 バケットへのアクセス
Amazon S3 ファイルからデータをロードするには、ファイルが含まれる Amazon S3 バケットへのアクセス許可を RDS for PostgreSQL DB インスタンスに与えます。こうすれば、追加の認証情報を管理したり、aws_s3.table_import_from_s3 関数呼び出しで提供したりする必要はありません。
これを行うには、Amazon S3 バケットへのアクセスを提供する IAM ポリシーを作成します。IAM ロールを作成して、ポリシーをロールにアタッチします。次に、IAM ロールを DB インスタンスに割り当てます。
IAM ロールを Aurora Serverless v1 DB クラスターに関連付けることができないため、次の手順は適用されません。
IAM ロール経由で、Amazon S3 へのアクセス権を RDS for PostgreSQL DB インスタンスに付与するには
-
IAM ポリシーを作成します。
ポリシーは、RDS for PostgreSQL DB インスタンスに Amazon S3 へのアクセスを許可するバケットとオブジェクトのアクセス許可を付与します。
ポリシーに、Amazon S3 バケットから Amazon RDS へのファイル転送を許可ための次の必須アクションを含めます。
-
s3:GetObject
-
s3:ListBucket
ポリシーに次のリソースを含めて、Amazon S3 バケットとバケット内のオブジェクトを識別します。これは、Amazon S3 にアクセスするための Amazon リソースネーム (ARN) 形式を示しています。
-
arn:aws:s3:::
your-s3-bucket
-
arn:aws:s3:::
your-s3-bucket
/*
Amazon RDS for 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
/*" ] } ] }' -
-
IAM ロールを作成します。
これを行うと、Amazon RDS がユーザーに代わってこの IAM ロールを引き受け、Amazon S3 バケットにアクセスできます。詳細については、IAM ユーザーガイドの「IAM ユーザーにアクセス許可を委任するロールの作成」を参照してください。
リソースポリシー内では
aws:SourceArn
およびaws:SourceAccount
のグローバル条件コンテキストキーを使用して、サービスに付与するリソースへのアクセス許可を制限することをお勧めします。これは、混乱した使節の問題に対する最も効果的な保護方法です。グローバル条件コンテキストキーの両方を使用し、
aws:SourceArn
の値にアカウントIDが含まれている場合、同じポリシーステートメントで使用する場合は、aws:SourceArn
の値とaws:SourceAccount
の値のアカウントでは同じアカウントIDを使用する必要があります。単一リソースに対するクロスサービスアクセスが必要な場合は
aws:SourceArn
を使用します。-
そのアカウント内の任意のリソースをクロスサービス使用に関連付けることを許可する場合、
aws:SourceAccount
を使用します。
ポリシーでは、必ずリソースの完全な ARN を持つ
aws:SourceArn
グローバル条件コンテキストキーを使用してください。以下の例は、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", "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
" } } } ] }' -
作成した IAM ポリシーを、作成した IAM ロールにアタッチします。
次の AWS CLI コマンドは、先ほどのステップで作成したポリシーを
rds-s3-import-role
という名前のロールに添付し、
を前のステップでメモしたポリシー ARN に置き換えます。your-policy-arn
例
Linux、macOS、Unix の場合:
aws iam attach-role-policy \ --policy-arn
your-policy-arn
\ --role-name rds-s3-import-roleWindows の場合:
aws iam attach-role-policy ^ --policy-arn
your-policy-arn
^ --role-name rds-s3-import-role -
DB インスタンスに IAM ロールを追加します。
これを行うには、以下で説明するように、AWS Management Console または AWS CLI を使用します。
コンソールを使用して PostgreSQL DB インスタンスの IAM ロールを追加するには
AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/
) を開きます。 -
詳細を表示するには、PostgreSQL DB インスタンスの名前を選択します。
-
[接続とセキュリティ] タブの [IAM ロールの管理] セクションで、このインスタンスに [IAM ロールを追加] で追加するロールを選択します。
-
[Feature] で、[s3Import] を選択します。
-
[Add role] を選択します。
CLI を使用して PostgreSQL DB インスタンスの IAM ロールを追加するには
-
次のコマンドを使用して、
my-db-instance
という名前の PostgreSQL DB インスタンスにロールを追加します。
を、以前のステップで書き留めたロール ARN に置き換えます。your-role-arn
s3Import
オプションの値に--feature-name
を使用します。例
Linux、macOS、Unix の場合:
aws rds add-role-to-db-instance \ --db-instance-identifier
my-db-instance
\ --feature-name s3Import \ --role-arnyour-role-arn
\ --regionyour-region
Windows の場合:
aws rds add-role-to-db-instance ^ --db-instance-identifier
my-db-instance
^ --feature-name s3Import ^ --role-arnyour-role-arn
^ --regionyour-region
Amazon RDS API を使用して PostgreSQL DB インスタンスに IAM ロールを追加するには、 AddRoleToDBInstance オペレーションを呼び出します。
セキュリティ認証情報を使用して 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 ファイルデータをインポートしようとしたときに接続の問題が発生した場合は、次の推奨事項を参照してください。
-
Amazon Simple Storage Service ユーザーガイド の「Troubleshooting Amazon S3」
-
IAM ユーザーガイド の Amazon S3 のトラブルシューティングと IAM
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
に示します。
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」を参照してください。
この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 ...
カスタム区切り文字を使用するファイルをインポートするには
-
インポートされたデータのテーブルをデータベースに作成します。
psql=> CREATE TABLE test (a text, b text, c text, d text, e text);
-
データを 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
AWS Management Console を使用してファイルをアップロードする場合、通常このメタデータは、システムにより適用されます。AWS Management Console、AWS CLI、または API による Amazon S3 へのファイルのアップロードについては、「Amazon Simple Storage Service ユーザーガイド」の「オブジェクトのアップロード」を参照してください。
Amazon S3 のメタデータに関する情報、およびシステム提供メタデータの詳細については、「Amazon Simple Storage Service ユーザーガイド」の「Amazon S3 コンソールでのオブジェクトメタデータの編集」を参照してください。
以下に示されているように、gzip ファイルを RDS for 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 データを Amazon RDS テーブルにインポートします。aws_s3
エクステンションには、aws_s3.table_import_from_s3
関数が含まれます。戻り値はテキストです。
構文
必須のパラメータは、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 )
パラメータ
- 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 リージョン名と関連する値のリストについては、「リージョン、アベイラビリティーゾーン、および Local Zones」を参照してください。
-
- 認証情報
-
インポートオペレーションに使用する次の認証情報を含む
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
パラメータを使用する代わりに、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 )
代替パラメータ
- bucket
-
ファイルを含む Amazon S3 バケットの名前を含むテキスト文字列。
- file_path
-
ファイルのパスを含むAmazon S3ファイル名を含むテキスト文字列。
- region (リージョン
-
ファイルがある AWS リージョンを含むテキスト文字列。AWS リージョン名と関連する値のリストについては、「リージョン、アベイラビリティーゾーン、および Local Zones」を参照してください。
- 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 パラメータで使用します。
構文
aws_commons.create_s3_uri( bucket text, file_path text, region text )
パラメータ
- bucket
-
ファイルの Amazon S3 バケット名を含む必須のテキスト文字列。
- file_path
-
ファイルのパスを含む Amazon S3 ファイル名を含む必須テキスト文字列。
- region (リージョン
-
ファイルがある AWS リージョンを含む必須のテキスト文字列。AWS リージョン名と関連する値のリストについては、「リージョン、アベイラビリティーゾーン、および Local Zones」を参照してください。
aws_commons.create_aws_credentials
aws_commons._aws_credentials_1
構造でアクセスキーとシークレットキーを設定します。aws_commons.create_aws_credentials
関数の結果は、credentials
関数の aws_s3.table_import_from_s3 パラメータで使用します。
構文
aws_commons.create_aws_credentials( access_key text, secret_key text, session_token text )
パラメータ
- access_key
-
Amazon S3 ファイルのインポートに使用するアクセスキーを含む必須のテキスト文字列。デフォルトは NULL です。
- secret_key
-
Amazon S3 ファイルのインポートに使用するシークレットキーを含む必須のテキスト文字列。デフォルトは NULL です。
- session_token
-
Amazon S3 ファイルのインポートに使用するセッショントークンを含む必須のテキスト文字列。デフォルトは NULL です。オプションの
session_token
を指定した場合は、一時的な認証情報を使用することができます。