AWS CloudFormation部署Lambda时如何访问S3中KMS加密的代码文件?
解决CloudFormation部署Lambda时KMS加密S3文件的AccessDenied问题
这个问题的核心其实不是S3存储桶策略的问题——你已经拥有GetObject权限,但错误提示确实存在误导性。真正的原因是:当S3对象用KMS加密后,任何尝试获取该对象的请求(包括CloudFormation拉取Lambda代码包的操作),除了需要S3的GetObject权限,还需要对加密该对象的KMS密钥拥有kms:Decrypt权限。
具体解决方案
你需要给执行CloudFormation堆栈的IAM角色(也就是部署时使用的角色)添加KMS解密权限,有两种方式可以实现:
方式1:给CloudFormation执行角色附加IAM权限策略
直接在该角色的权限策略中添加允许解密目标KMS密钥的语句,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:你的区域:你的账号ID:key/你的KMS密钥ID" } ] }
方式2:修改KMS密钥的密钥策略
如果你有权限编辑KMS密钥的策略,可以直接在密钥策略中添加允许CloudFormation角色解密的规则,示例:
{ "Sid": "AllowCloudFormationDeploymentRoleToDecrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:role/你的CloudFormation执行角色名称" }, "Action": "kms:Decrypt", "Resource": "*" }
额外注意事项
- 如果你后续Lambda函数需要访问其他KMS加密的资源(比如加密的S3对象、Secrets Manager密钥等),那Lambda的执行角色也需要对应的KMS权限,但当前部署失败的问题只需要解决CloudFormation角色的权限即可。
- S3返回
AccessDenied而不是明确的KMS权限错误是AWS的设计逻辑,因为从S3的视角来看,整个获取对象的请求失败了,所以统一返回S3层面的权限错误,这也是为什么提示会有误导性。
内容的提问来源于stack exchange,提问作者Jim Robertson
相关产品推荐
相关产品推荐

