跨AWS账号Comprehend分析任务输出S3文件下载KMS权限报错
问题场景
在AWS账号A1中运行Comprehend分析任务,输出文件存储到AWS账号A2的S3桶中。任务完成后下载文件时触发403权限错误,报错信息:
software.amazon.awssdk.services.s3.model.S3Exception: User: user is not authorized to perform: kms:Decrypt on the resource associated with this ciphertext because the resource does not exist in this Region, no resource-based policies allow access, or a resource-based policy explicitly denies access (Service: S3, Status Code: 403, Request ID:id
注:创建Comprehend任务时未指定加密方式或KMS密钥。
根源分析
虽然Comprehend任务没指定加密,但目标S3桶(A2账号)大概率配置了默认服务器端加密(SSE-KMS),输出文件会自动继承桶的加密规则。此时下载文件需要同时具备:
- S3桶的读取权限(已配置,否则会报S3本身的权限错误)
- 对桶加密所用KMS密钥的
kms:Decrypt权限(当前缺失,导致报错)
解决方案
1. 确认目标S3桶的加密配置
登录A2账号的S3控制台,找到对应桶:
- 进入「加密」标签页,查看是否开启了「默认加密」
- 确认加密类型为「Amazon S3 托管式密钥(SSE-KMS)」(而非SSE-S3,SSE-S3不会触发KMS权限问题)
2. 配置KMS密钥的资源策略(A2账号操作)
找到桶加密所用的KMS密钥(在S3加密配置中可查看密钥ARN),修改其资源策略,添加允许A1账号用户/角色执行kms:Decrypt的规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::A1账号ID:user/你的用户名" }, "Action": "kms:Decrypt", "Resource": "*" } ] }
替换其中的A1账号ID和用户名,若使用IAM角色下载,替换为角色ARN即可。
3. 配置A1账号用户/角色的IAM权限
在A1账号中,给执行下载操作的用户/角色添加IAM策略,允许其访问A2账号的KMS密钥:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:A2账号区域:A2账号ID:key/密钥ID" } ] }
替换A2账号区域、账号ID和密钥ID为实际值。
4. 检查区域一致性
确保下载操作使用的AWS区域与KMS密钥所在区域完全一致(KMS是区域级资源,跨区域访问会直接报错)。
内容的提问来源于stack exchange,提问作者Soumik Dutta

