我希望能够将 Parquet 数据从 S3 复制到 Redshift。
我已经尝试过以下代码:
-- 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;
-- 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;
第 1 部分看起来按预期运行。然而,第 2 部分的错误是:
-----------------------------------------------
error: Spectrum Scan Error
code: 15007
context: Forbidden: HTTP response error code: 403 Message: AccessDenied Access Denied
错误表明存在访问问题。
我的 IAM 角色与
AmazonS3FullAccess
关联 - 我已经测试过它可以成功地在 S3 和 redshift 之间移动数据,因为如果我将两个部分中的格式从 FORMAT AS PARQUET
更改为 FORMAT AS CSV
,它会按预期工作。
由于错误表明涉及频谱,我尝试更新 IAM 角色以赋予其所需的访问权限,但没有成功 - 我尝试添加胶水但没有更改,它仍然错误...
(我知道在简化的示例中 CSV 可以工作,我需要将 S3 上的文件放在 parquet 中以供另一个进程使用)。
对于 Spectrum,Redshift 似乎需要额外的角色/IAM 权限。 本文件提到:
对于 Redshift Spectrum,除了 Amazon S3 访问之外,还添加 AWSGlueConsoleFullAccess 或 AmazonAthenaFullAccess。
Redshift Spectrum 使用 Glue 数据目录,并且需要访问它,这是由上述角色授予的。当然,您应该将您的角色的访问权限限制为数据目录中所需的部分和操作。