我正在尝试将s3中的大量文件中的数据复制到Redshift。我对包含这些文件的s3存储桶具有只读权限。为了有效地复制它们,我创建了一个清单文件,其中包含我需要复制的每个文件的链接。
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 :(得分:0)
您已指出bucket_1_key密钥(即IAM用户)的权限仅限于bucket_1中的“只读”。如果是这种情况,则会发生错误,因为该密钥没有从bucket_2读取权限。你已经提到了这个可能的原因,而且正是如此。
没有选项可以为COPY命令提供两组键。但是,您应该考虑以下选项:
选项1
根据this“您可以使用Amazon S3对象前缀或使用清单文件指定要加载的文件。” 如果要加载的文件集有公共前缀,则可以在COPY命令的bucket_1中使用该前缀。 见http://docs.aws.amazon.com/redshift/latest/dg/t_loading-tables-from-s3.html
您已经提到您对存储桶具有只读权限1.请确保这是http://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html#copy-usage_notes-iam-permissions
中定义的足够访问权限所有其他选项都需要更改您的密钥/ IAM用户权限或Redshift本身。
选项2
扩展bucket_1_key键的权限,以便能够从bucket_2读取。您必须确保您的bucket_1_key密钥具有对bucket_2的LIST访问权限以及对bucket_2对象(as documented here)的GET访问权限。 这样,您可以在COPY命令中继续使用bucket_1_key键。该方法称为基于密钥的访问控制,并使用纯文本访问密钥ID和秘密访问密钥。 AWS建议改为使用基于角色的访问控制(选项3)。
选项3
在COPY命令中使用IAM角色而不是键(选项2)。这称为基于角色的访问控制。强烈建议在COPY命令中使用此身份验证选项。 此IAM角色必须具有对存储桶1和2的LIST访问权限以及对这些存储桶中的对象的GET访问权限。
有关基于密钥和基于角色的访问控制的详细信息,请here。