Amazon Redshift COPY 始终返回 S3ServiceException:访问被拒绝,状态 403

问题描述 投票:0回答:4

我真的很困惑如何使用 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]
-----------------------------------------------------------;

有谁可以给我一些线索或建议吗?

非常感谢!

amazon-s3 amazon-redshift
4个回答
3
投票

从 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


0
投票

我的场景(跨账户):
账户 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>';

注意:

session_token
仅当您从以下机构获得学分时才需要 STS 通过承担角色。如果您提供硬编码凭据或手动生成的凭据,则不需要
session_token


-1
投票
  1. 检查桶的加密。

根据文档:https://docs.aws.amazon.com/en_us/redshift/latest/dg/c_loading-encrypted-files.html COPY 命令自动识别并加载使用 SSE-S3 和 SSE-KMS 加密的文件。

  1. 检查公里:您的密钥|角色的规则

  2. 如果文件来自 EMR,请检查 S3 的安全配置。


-2
投票

您的 Redshift 集群角色无权访问 S3 存储桶。确保您用于 redshift 的角色有权访问存储桶,并且存储桶没有阻止访问的策略

© www.soinside.com 2019 - 2024. All rights reserved.