S3 到 Redshift:在拒绝访问的情况下复制

Posted

技术标签:

【中文标题】S3 到 Redshift:在拒绝访问的情况下复制【英文标题】:S3 to Redshift : Copy with Access Denied 【发布时间】:2016-11-10 10:00:54 【问题描述】:

我们以前每天使用 COPY 命令从没有特定策略的存储桶中将文件从 s3 复制到 Redshift。

COPY schema.table_staging     
FROM 's3://our-bucket/X/YYYY/MM/DD/'     
CREDENTIALS 'aws_access_key_id=xxxxxx;aws_secret_access_key=xxxxxx'     
CSV     
GZIP     
DELIMITER AS '|'     
TIMEFORMAT 'YYYY-MM-DD HH24:MI:SS';  

由于我们需要提高 S3 存储桶的安全性,我们添加了一项策略来授权来自我们的 VPC(我们用于 Redshift 集群的那个)或特定 IP 地址的连接。


"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
    
        "Sid": "DenyAllExcept",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::our-bucket/*",
            "arn:aws:s3:::our-bucket"
        ],
        "Condition": 
            "StringNotEqualsIfExists": 
                "aws:SourceVpc": "vpc-123456789"
            ,
            "NotIpAddressIfExists": 
                "aws:SourceIp": [
                    "12.35.56.78/32"
                ]
            
        
    
]

此策略适用于使用 AWS CLI 或 boto Python 库从 EC2、EMR 或我们的特定地址访问文件。

这是我们在 Redshift 上遇到的错误:

ERROR: S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid xxxxxx,CanRetry 1
Détail : 
-----------------------------------------------
error:  S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid xxxxxx,CanRetry 1
code:      8001
context:   Listing bucket=our-bucket prefix=X/YYYY/MM/DD/
query:     1587954
location:  s3_utility.cpp:552
process:   padbmaster [pid=21214]
-----------------------------------------------

如果您能在这方面帮助我们,非常感谢,

达米安

ps:这个问题和这个问题很相似:Copying data from S3 to Redshift - Access denied

【问题讨论】:

【参考方案1】:

您需要使用 Redshift 的“增强型 VPC 路由”功能。来自文档here:

    当您使用 Amazon Redshift 增强型 VPC 路由时,Amazon Redshift 会通过您的 Amazon VPC 强制您的集群和数据存储库之间的所有 COPY 和 UNLOAD 流量。

    如果未启用增强型 VPC 路由,Amazon Redshift 会通过 Internet 路由流量,包括到 AWS 网络中其他服务的流量。

    对于与您的集群位于同一区域的 Amazon S3 存储桶的流量,您可以创建一个 VPC 终端节点以将流量直接导向存储桶。

【讨论】:

以上是关于S3 到 Redshift:在拒绝访问的情况下复制的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 s3 复制到 redshift 时忽略所有无效记录

使用 Python 将数据插入 RedShift

通过任何人的 COPY 操作使 Redshift 可以访问 S3 文件的最佳实践

从 S3 接入点复制到 Redshift

从 s3 到 Redshift 的数据复制:清单与我需要下载的文件位于不同的存储桶中

使用 for 循环从 s3 复制 Redshift