AWS Kinesis Firehose 不在 Redshift 中插入数据
AWS Kinesis Firehose not inserting data in Redshift
我尝试让 Kinesis Firehose 在 Redshift 中推送数据 table。
firehose 流正在工作并将数据放入 S3。
但是在 Redshift 中没有任何东西到达目的地 table。
- 指标 DeliveryToRedshift Success 为 0(DeliveryToRedshift 记录为空)
- 加载日志(redshift web 控制台)和 STL_LOAD_ERRORS table 是空的。
- 我检查过 Firehose 能够连接到 Redshift(我在 STL_CONNECTION_LOG 中看到了连接)
我该如何解决这个问题?
转到在 Kinesis Firehose 设置期间自动创建的 IAM 角色 (firehose_delivery_role
),并确保附加以下角色:
AmazonS3FullAccess
AmazonRedshiftFullAccess
AmazonKinesisFullAccess
AmazonKinesisFirehoseFullAccess
存在一个错误,它会在 IAM 中忽略 S3 凭据,导致 Kinesis 设置无法工作。
还要验证您确实看到了 S3 中累积的数据文件。
在 Kinesis Firehos 设置期间,使用 Redshift masteruser
凭据。任何其他用户将无法工作。
最后,我通过删除并重新创建 Firehose 流使其工作:-/
可能是通过 Web 控制台的重复编辑使事情变得不合理table。
但这里有故障排除指南:
- 这个过程是一个很好的起点:http://docs.aws.amazon.com/firehose/latest/dev/troubleshooting.html
- 检查数据是否到达 S3
- firehose 交付必须有一个 IAM 角色,firehose 服务和这个角色之间有信任关系
- 此 IAM 角色必须具有 S3 访问策略
- 在此处查看政策 json:http://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-s3
- 此时,Firehose 监控中的 "DeliveryToS3 Success" 指标应该是非零的
- Redshift 集群必须可公开访问(请参阅集群 Web 控制台)
- 集群的安全组必须允许来自 Firehose IP 地址的入站流量:Firehose 目前为每个可用的 AWS 区域使用一个 CIDR 块:
- 美国东部(弗吉尼亚北部)52.70.63.192/27
- 美国西部(俄勒冈)52.89.255.224/27
- 欧盟(爱尔兰)52.19.239.192/27
- 仔细检查你给 Firehose
的红移 user/password
此时,您应该能够在 Redshift 日志中看到连接尝试:
select * from stl_connection_log where remotehost like '52%' order by recordtime desc;
检查 Firehose 使用的 Redshift 用户是否对目标有足够的权限 table :
select tablename,
HAS_TABLE_PRIVILEGE(tablename, 'select') as select,
HAS_TABLE_PRIVILEGE(tablename, 'insert') as insert,
HAS_TABLE_PRIVILEGE(tablename, 'update') as update,
HAS_TABLE_PRIVILEGE(tablename, 'delete') as delete,
HAS_TABLE_PRIVILEGE(tablename, 'references') as references
from pg_tables where schemaname='public' order by tablename;
然后可以查看COPY命令是不是运行 :
select * from stl_query order by endtime desc limit 10;
然后检查加载错误,或者服务器错误:
select * from stl_load_errors order by starttime desc;
select * from stl_error where userid!=0 order by recordtime desc;
如果您的数据或 COPY 选项存在格式问题,或者您的数据与目标列不匹配,您至少应该看到 COPY 尝试和一些加载错误。
如果您仍然卡住了,那些日志中没有任何内容 tables,请尝试删除并重新创建整个 firehose 流,因为可能存在一些与 web 控制台相关的错误. (这一步对我有用)
想要 post 我的案子给在这里迷路的人。
我们通过此处 post 的说明强制对我们的 S3 存储桶进行服务器端加密调用:http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html
在 Firehose 使用的存储桶上使用此策略的问题是 Firehose 会创建未加密的清单文件 以及加密的数据文件。如果此策略到位,清单文件将不会在 S3 上创建,因此不会触发 Redshift 加载。所以我们的行为显示数据到达存储桶,但没有清单文件,因此没有数据加载。
我尝试让 Kinesis Firehose 在 Redshift 中推送数据 table。
firehose 流正在工作并将数据放入 S3。
但是在 Redshift 中没有任何东西到达目的地 table。
- 指标 DeliveryToRedshift Success 为 0(DeliveryToRedshift 记录为空)
- 加载日志(redshift web 控制台)和 STL_LOAD_ERRORS table 是空的。
- 我检查过 Firehose 能够连接到 Redshift(我在 STL_CONNECTION_LOG 中看到了连接)
我该如何解决这个问题?
转到在 Kinesis Firehose 设置期间自动创建的 IAM 角色 (firehose_delivery_role
),并确保附加以下角色:
AmazonS3FullAccess
AmazonRedshiftFullAccess
AmazonKinesisFullAccess
AmazonKinesisFirehoseFullAccess
存在一个错误,它会在 IAM 中忽略 S3 凭据,导致 Kinesis 设置无法工作。
还要验证您确实看到了 S3 中累积的数据文件。
在 Kinesis Firehos 设置期间,使用 Redshift masteruser
凭据。任何其他用户将无法工作。
最后,我通过删除并重新创建 Firehose 流使其工作:-/ 可能是通过 Web 控制台的重复编辑使事情变得不合理table。
但这里有故障排除指南:
- 这个过程是一个很好的起点:http://docs.aws.amazon.com/firehose/latest/dev/troubleshooting.html
- 检查数据是否到达 S3
- firehose 交付必须有一个 IAM 角色,firehose 服务和这个角色之间有信任关系
- 此 IAM 角色必须具有 S3 访问策略
- 在此处查看政策 json:http://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-s3
- 此时,Firehose 监控中的 "DeliveryToS3 Success" 指标应该是非零的
- Redshift 集群必须可公开访问(请参阅集群 Web 控制台)
- 集群的安全组必须允许来自 Firehose IP 地址的入站流量:Firehose 目前为每个可用的 AWS 区域使用一个 CIDR 块:
- 美国东部(弗吉尼亚北部)52.70.63.192/27
- 美国西部(俄勒冈)52.89.255.224/27
- 欧盟(爱尔兰)52.19.239.192/27
- 仔细检查你给 Firehose 的红移 user/password
此时,您应该能够在 Redshift 日志中看到连接尝试:
select * from stl_connection_log where remotehost like '52%' order by recordtime desc;
检查 Firehose 使用的 Redshift 用户是否对目标有足够的权限 table :
select tablename, HAS_TABLE_PRIVILEGE(tablename, 'select') as select, HAS_TABLE_PRIVILEGE(tablename, 'insert') as insert, HAS_TABLE_PRIVILEGE(tablename, 'update') as update, HAS_TABLE_PRIVILEGE(tablename, 'delete') as delete, HAS_TABLE_PRIVILEGE(tablename, 'references') as references from pg_tables where schemaname='public' order by tablename;
然后可以查看COPY命令是不是运行 :
select * from stl_query order by endtime desc limit 10;
然后检查加载错误,或者服务器错误:
select * from stl_load_errors order by starttime desc; select * from stl_error where userid!=0 order by recordtime desc;
如果您的数据或 COPY 选项存在格式问题,或者您的数据与目标列不匹配,您至少应该看到 COPY 尝试和一些加载错误。
如果您仍然卡住了,那些日志中没有任何内容 tables,请尝试删除并重新创建整个 firehose 流,因为可能存在一些与 web 控制台相关的错误. (这一步对我有用)
想要 post 我的案子给在这里迷路的人。
我们通过此处 post 的说明强制对我们的 S3 存储桶进行服务器端加密调用:http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html
在 Firehose 使用的存储桶上使用此策略的问题是 Firehose 会创建未加密的清单文件 以及加密的数据文件。如果此策略到位,清单文件将不会在 S3 上创建,因此不会触发 Redshift 加载。所以我们的行为显示数据到达存储桶,但没有清单文件,因此没有数据加载。