You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:05:35