我真的很困惑如何使用 COPY 命令将数据从 Amazon S3 存储桶传输到 Redshift。
到目前为止,我创建了一个 IAM 用户并分配了“AmazonS3ReadOnlyAccess”策略。但是当我像下面这样调用 COPY 命令时,总是返回访问被拒绝错误。
从 's3://s3.ap-northeast-2.amazonaws.com/mybucket/myobject' 凭证复制 my_table 'aws_access_key_id=<...>;aws_secret_access_key=<...>' REGION'ap-northeast-2' 分隔符 '|';
错误:
Amazon 无效操作:S3ServiceException:访问被拒绝,状态 403,错误 AccessDenied,Rid EB18FDE35E1E0CAB,ExtRid ,CanRetry 1
详情: -----------------------------------------------------------
错误:S3ServiceException:访问被拒绝,状态 403,错误访问被拒绝,Rid EB18FDE35E1E0CAB,ExtRid ,CanRetry 1 代码:8001 上下文:列出存储桶=s3.ap-northeast-2.amazonaws.com 前缀=mybucket/myobject 查询:1311463 位置:s3_utility.cpp:542 进程:padbmaster [pid=4527]
-----------------------------------------------------------;
有谁可以给我一些线索或建议吗?
非常感谢!
从 S3 路径中删除端点
s3.ap-northeast-2.amazonaws.com
:
COPY my_table
FROM 's3://mybucket/myobject'
CREDENTIALS ''
REGION 'ap-northeast-2'
DELIMITER '|'
;
(请参阅文档中的 examples。)虽然
Access Denied
错误肯定具有误导性,但返回的消息给出了一些有关出错原因的提示:
bucket=s3.ap-northeast-2.amazonaws.com
prefix=mybucket/myobject
不过,我们希望看到
bucket=mybucket
和 prefix=myobject
。
我的场景(跨账户):
账户 B Lambda 尝试访问账户 B 中的 Redshift 和 S3。
我的 Redshift 集群是公开可用的,我使用 Redshift 凭据(例如主机、端口、用户名等)创建了连接。
除此 COPY 命令外,所有其他查询均已执行。
后来我发现这个 COPY 命令正在尝试通过互联网从 S3 存储桶获取文件,并且我的 S3 存储桶无法通过互联网访问。
然后我使用 docs 更改了 COPY 命令:
删除了 IAM 角色并使用以下语法提供了凭证:
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
注意:
仅当您从以下机构获得学分时才需要 STS 通过承担角色。如果您提供硬编码凭据或手动生成的凭据,则不需要session_token
session_token
根据文档:https://docs.aws.amazon.com/en_us/redshift/latest/dg/c_loading-encrypted-files.html COPY 命令自动识别并加载使用 SSE-S3 和 SSE-KMS 加密的文件。
检查公里:您的密钥|角色的规则
如果文件来自 EMR,请检查 S3 的安全配置。
您的 Redshift 集群角色无权访问 S3 存储桶。确保您用于 redshift 的角色有权访问存储桶,并且存储桶没有阻止访问的策略