AWS Canary访问Secrets Manager触发KMS AccessDeniedException报错求助
AWS Secrets Manager加密规则及报错解决方案
核心疑问解答
即使未主动配置自定义加密密钥,AWS Secrets Manager(ASM)也会默认对存储的所有秘密进行KMS加密,默认使用AWS为当前账户自动创建的托管KMS密钥(别名固定为aws/secretsmanager),该加密机制默认开启无法关闭。
你收到KMS访问拒绝报错的原因是:调用GetSecretValue接口获取秘密时,除了ASM本身的权限,还需要调用者持有对应KMS密钥的解密权限,你当前的Canary运行IAM角色缺少该权限。
解决方案
根据你使用的KMS密钥类型,选择对应操作:
- 使用默认AWS托管
aws/secretsmanager密钥(即当前你未主动配置加密的场景)- 进入AWS KMS控制台,切换到对应区域(你当前的资源都在us-west-1),选择「AWS托管的密钥」分类
- 找到别名为
aws/secretsmanager的密钥,复制它的ARN - 给Canary运行的IAM角色附加如下权限的策略:
{ "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "替换为你刚才复制的aws/secretsmanager密钥的ARN" } - 后续如果改用自定义KMS密钥加密ASM秘密
除了给IAM角色添加上述kms:Decrypt权限外,还需要在自定义KMS密钥的密钥策略中,添加允许该Canary IAM角色执行解密操作的声明。
附加代码优化建议
你当前提供的代码存在两处可优化点:
getKeyCert函数没有返回值,后续const [ key, cert ] = await getKeyCert();会得到undefined,需要补充返回逻辑,比如return [key.SecretString, cert.SecretString]- 连续两次调用同一个SecretId获取密钥,属于重复请求,你可以只调用一次
getSecretValue,同时取出key和cert值,减少不必要的API调用开销。
内容的提问来源于stack exchange,提问作者edwio
相关产品推荐
相关产品推荐

