2017-11-16 7 views
0

s3の多数のファイルからRedshiftにデータをコピーしようとしています。これらのファイルを含むs3バケットへの読み取り専用アクセス権があります。それらを効率的にコピーするために、コピーしなければならない各ファイルへのリンクを含むマニフェストファイルを作成しました。ここでs3からRedshiftへのデータコピー:マニフェストがダウンロードするファイルと異なるバケットにあります

Bucket 1: 
- file1.gz 
- file2.gz 
- ... 

Bucket 2: 
- manifest 

私はバケツ2でマニフェストを使用して、バケット1からのデータをコピーしようとしたコマンドです:

-- Load data from s3 
copy data_feed_eval from 's3://bucket-2/data_files._manifest' 
CREDENTIALS 'aws_access_key_id=bucket_1_key;aws_secret_access_key=bucket_1_secret' 
manifest 
csv gzip delimiter ',' dateformat 'YYYY-MM-DD' timeformat 'YYYY-MM-DD HH:MI:SS' 
maxerror 1000 TRUNCATECOLUMNS; 

このコマンドを実行するときしかし、私は次のエラーを取得する:

09:45:32 [COPY - 0 rows, 7.576 secs] [Code: 500310, SQL State: XX000] [Amazon](500310) Invalid operation: Problem reading manifest file - S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 901E02533CC5010D,ExtRid tEvf/TVfZzPfSNAFa8iTYjTBjvaHnMMPmuwss58SwopY/sZSkhUBe3yMGHTDyA0yDhDCD7ybX9gl45pV/eQ=,CanRetry 1 
Details: 
----------------------------------------------- 
    error: Problem reading manifest file - S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 901E02533CC5010D,ExtRid tEvf/TVfZzPfSNAFa8iTYjTBjvaHnMMPmuwss58SwopY/sZSkhUBe3yMGHTDyA0yDhDCD7ybX9gl45pV/eQ=,CanRetry 1 
    code:  8001 
    context: s3://bucket-2/data_files._manifest 
    query:  2611231 
    location: s3_utility.cpp:284 
    process: padbmaster [pid=10330] 
    -----------------------------------------------; 

ここで私はCOPYコマンドでbucket_1の認証情報を渡していると思います。複数のバケット(実際のファイルとbucket_1、マニフェストを持つbucket_2)の資格情報をCOPYコマンドに渡すことは可能ですか? bucket_1への書き込みアクセス権がないと仮定して、これにどのようにアプローチすればよいですか?

答えて

0

あなたは、bucket_1_keyキー(IAMユーザー)はbucket_1からの "読み取り専用"に制限されていることを示しました。この場合、そのキーにbucket_2から読み取られたパーミッションがないため、エラーが発生します。あなたはこれをすでに考えていますが、それはまさにその原因です。

COPYコマンドに2組のキーを指定するオプションはありません。 「あなたは、Amazon S3のオブジェクトの接頭辞を使用するか、マニフェストファイルを使用してロードするファイルを指定することができます。」thisによると

オプション1

:しかし、あなたは次のオプションを検討すべきです ロードするファイルのセットに共通の接頭辞がある場合は、その接頭辞をCOPYコマンドのbucket_1に使用できます。 http://docs.aws.amazon.com/redshift/latest/dg/t_loading-tables-from-s3.html

を参照してください。あなたが他のすべてのオプションは、あなたのIAM /キーユーザー権限や赤方偏移を変更する必要がhttp://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html#copy-usage_notes-iam-permissions

で定義され、これは十分なアクセスであることを確認してくださいあなたは読み取り専用バケット1へのアクセスを言及しています自体。

オプション2

もbucket_2から読み取ることができるようにbucket_1_keyキーの権限を拡張します。 bucket_1_keyキーにbucket_2に対するLISTアクセス権があり、bucket_2オブジェクト(as documented here)に対するGETアクセス権があることを確認する必要があります。 この方法で、COPYコマンドでbucket_1_keyキーを引き続き使用できます。この方法はキーベースのアクセス制御と呼ばれ、プレーンテキストのアクセスキーIDと秘密のアクセスキーを使用します。ロールベースのアクセス制御(オプション3)を代わりに使用することをお勧めします。

オプション3

利用代わりにキーのCOPYコマンドでIAMの役割(オプション2)。これは役割ベースのアクセス制御と呼ばれます。これは、COPYコマンドで使用するために強く推奨される認証オプションです。 このIAMロールは、バケット1および2でLISTアクセスを許可し、それらのバケット内のオブジェクトに対してGETアクセス権を持つ権限が必要です。

キーベースおよび役割ベースのアクセス制御の詳細はhereです。

関連する問題