从 s3 到 Redshift 的数据复制:清单与我需要下载的文件位于不同的存储桶中
Posted
技术标签:
【中文标题】从 s3 到 Redshift 的数据复制:清单与我需要下载的文件位于不同的存储桶中【英文标题】:Data Copy from s3 to Redshift: Manifest is in different bucket than files I need to download 【发布时间】:2017-11-16 14:56:03 【问题描述】:我正在尝试将数据从 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 的写入权限,我应该如何处理这个问题?
【问题讨论】:
【参考方案1】:您已指出 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 对象的 GET 访问权限 (as documented here)。 这样您就可以在 COPY 命令中继续使用 bucket_1_key 键。这种方法称为基于密钥的访问控制,使用明文访问密钥 ID 和秘密访问密钥。 AWS 建议改用基于角色的访问控制(选项 3)。
选项 3
在 COPY 命令中使用 IAM 角色而不是密钥(选项 2)。这称为基于角色的访问控制。这也是强烈推荐在 COPY 命令中使用的身份验证选项。 此 IAM 角色必须具有对存储桶 1 和 2 的 LIST 访问权限以及对这些存储桶中的对象的 GET 访问权限。
有关基于密钥和基于角色的访问控制的更多信息是here。
【讨论】:
以上是关于从 s3 到 Redshift 的数据复制:清单与我需要下载的文件位于不同的存储桶中的主要内容,如果未能解决你的问题,请参考以下文章
从 Parquet S3 复制到 Redshift 和十进制与 int 类型