如何通过org.apache.hadoop.fs.s3a.S3AFileSystem访问带KMS加密的AWS S3
问题根因与解决方案
根因
你遇到的403 AccessDenied错误与S3权限无关,是KMS密钥操作权限缺失导致:
- S3A的
mkdirs方法本质是在对应路径下创建1个0字节的占位对象,因为你配置了SSE-KMS加密,创建该对象时需要调用KMS接口生成加密用的数据密钥 - 你当前的KMS策略仅开放了密钥的查询、管理类权限,缺少S3做SSE-KMS加密/解密必须的核心操作权限
- delete操作仅需要S3的删除权限,不需要调用KMS接口,因此可以正常执行
修复步骤
- 修改你使用的KMS密钥的策略,在
Action列表中补充以下3个必要权限:
"kms:GenerateDataKey", "kms:Decrypt", "kms:DescribeKey"
修改完成后的KMS策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateAlias", "kms:CreateKey", "kms:DeleteAlias", "kms:Describe*", "kms:GenerateRandom", "kms:Get*", "kms:List*", "kms:TagResource", "kms:UntagResource", "iam:ListGroups", "iam:ListRoles", "iam:ListUsers", "kms:GenerateDataKey", "kms:Decrypt", "kms:DescribeKey" ], "Resource": "*" } ] }
- (可选,针对hadoop-aws 2.9.2版本兼容性问题)如果修改KMS策略后依然报错,在core-site.xml中补充以下配置:
<property> <name>fs.s3a.server-side-encryption.enabled</name> <value>true</value> </property>
- 配置修改后无需重启EC2实例,重新调用
mkdirs方法即可正常执行。
内容的提问来源于stack exchange,提问作者LMK IND
相关产品推荐
相关产品推荐

