无法将Parquet格式数据从S3复制到Redshift的问题求助
Redshift COPY Parquet文件时出现Spectrum 403 AccessDenied错误
问题场景
尝试将Parquet格式数据从S3复制到Redshift,Unload步骤执行正常,但Copy步骤触发权限错误。相关执行代码如下:
Unload 执行代码
-- Part 1: Unload SET search_path TO my_schema_from; DROP TABLE IF EXISTS my_table; CREATE TABLE my_table ( column1 VARCHAR ); INSERT INTO my_table (column1) VALUES ('abc'); UNLOAD ('SELECT * FROM my_table') TO 's3://my_bucket/my_table_' CREDENTIALS 'aws_iam_role=arn:aws:iam::my_role' FORMAT AS PARQUET ALLOWOVERWRITE MANIFEST;
Copy 执行代码
-- Part 2: Copy SET search_path TO my_schema_to; DROP TABLE IF EXISTS my_table; CREATE TABLE my_table ( column1 VARCHAR ); COPY my_table FROM 's3://my_bucket/my_table_manifest' CREDENTIALS 'aws_iam_role=arn:aws:iam::my_role' FORMAT AS PARQUET MANIFEST;
错误信息
----------------------------------------------- error: Spectrum Scan Error code: 15007 context: Forbidden: HTTP response error code: 403 Message: AccessDenied Access Denied
已知前置信息
- IAM角色已关联
AmazonS3FullAccess权限 - 使用CSV格式时,S3与Redshift间的Unload/Copy流程可正常执行
- 已尝试为IAM角色添加Glue相关权限,问题未解决
- 需保留S3上的Parquet格式文件供其他流程使用
解决方案
1. 检查S3存储桶策略
即使IAM角色拥有S3全权限,存储桶的桶策略可能限制了Redshift的访问权限。确保桶策略明确允许关联的IAM角色访问存储桶及对象:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/my_role" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my_bucket", "arn:aws:s3:::my_bucket/*" ] } ] }
2. 确认IAM角色的信任关系
确保IAM角色的信任策略允许Redshift服务承担该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
3. 修正COPY命令中的Manifest文件路径
Unload生成的Manifest文件默认命名规则为[前缀]_000.manifest(比如my_table_000.manifest),而非my_table_manifest。登录S3控制台确认Manifest文件的准确路径后,修正COPY命令:
COPY my_table FROM 's3://my_bucket/my_table_000.manifest' CREDENTIALS 'aws_iam_role=arn:aws:iam::my_role' FORMAT AS PARQUET MANIFEST;
4. 检查S3存储桶的对象锁定/版本控制
如果S3桶启用了对象锁定或版本控制,可能会干扰Redshift读取Parquet文件的权限,可临时关闭该功能测试是否解决问题。
5. 验证Parquet文件的所有者权限
若Unload生成的Parquet文件由其他AWS账户或角色创建,需确保当前IAM角色拥有读取这些对象的权限。可通过S3控制台查看文件所有者,确认权限配置正确。
内容的提问来源于stack exchange,提问作者Sam Gilbert
相关产品推荐
相关产品推荐

