跨账号Kinesis Firehose写入S3的Parquet对象出现Access Denied问题
问题根因与解决方案
最高概率根因:KMS密钥权限缺失
你遇到的跨账号写入对象ACL一致但访问被拒的问题,90%以上是KMS加密密钥权限不匹配导致,触发逻辑如下:
- Kinesis Firehose写入Parquet格式数据需要先做格式转换,转换完成后的对象默认使用Firehose所属AWS账号的托管KMS密钥(默认
aws/kinesis-firehose或aws/s3托管密钥)进行SSE-KMS加密。 - 你拥有该Parquet对象的读写ACL,仅代表你有权限读取S3对象的加密数据,但你没有其他团队账号下对应KMS密钥的
kms:Decrypt权限,无法解密数据,所以返回Access Denied。 - 你自己写入的CSV不需要格式转换、第三个账号的Firehose要么未启用SSE-KMS加密、要么使用了你账号的KMS密钥/给了你解密权限,所以访问正常。
其他可能根因
- 你的S3桶未开启「桶所有者强制」对象所有权规则,且你的IAM策略/桶策略中存在仅允许访问本账号所有对象的限制;
- 其他团队写入Parquet对象时附带了特殊标签/元数据,你的权限策略中存在对应禁止规则。
排查与修复步骤
- 第一步:查看异常Parquet对象的属性-加密设置,确认加密方式是否为SSE-KMS、对应密钥ARN是否属于其他团队的AWS账号
- 第二步:若确认是其他账号的KMS密钥,两种修复方案可选:
- 让其他团队在对应KMS密钥的策略中,添加你账号下对应IAM实体的
kms:Decrypt权限 - 让其他团队修改Kinesis Firehose配置,指定使用你S3桶的默认加密密钥/你账号下的KMS密钥加密写入对象,同时给他们的Firehose IAM角色授予该密钥的
kms:GenerateDataKey、kms:Encrypt权限
- 让其他团队在对应KMS密钥的策略中,添加你账号下对应IAM实体的
- 第三步(可选优化):开启S3桶的「对象所有权-桶所有者强制」规则,所有写入桶的对象所有权自动归属于你的账号,避免跨账号所有权带来的权限隐患。
内容的提问来源于stack exchange,提问作者CyclingDave
相关产品推荐
相关产品推荐

