使用Jenkins+CodeCommit+S3部署Lambda遇S3访问拒绝错误求助
我来帮你梳理下这个问题——这个403错误的核心是Lambda服务(或者你用来部署Lambda的Jenkins身份)在尝试从S3桶获取bucket/Version.zip这个部署包时,没有足够的权限执行GetObject操作。下面是几个关键的排查和解决方向:
先查部署用的IAM角色/用户权限
如果你是通过Jenkins调用Lambda API来更新函数代码,那Jenkins使用的IAM身份(不管是EC2实例角色、IAM用户凭据)必须同时具备两个权限:- Lambda的
UpdateFunctionCode权限,允许它触发函数更新 - S3的
GetObject权限,针对目标桶和Version.zip这个具体文件
别搞混了:Lambda函数自身的执行角色主要管运行时权限,部署阶段的权限问题重点看Jenkins用的那个身份。
- Lambda的
验证S3桶的权限策略
打开S3控制台找到你的桶,检查桶策略有没有拒绝必要的访问。比如,你需要给部署用的IAM角色加一条允许s3:GetObject的策略,示例如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的Jenkins部署角色" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/Version.zip" } ] }另外还要注意:如果桶开了S3块公共访问,要确认它没阻止合法的IAM访问;如果桶用了KMS加密,那部署角色还得有KMS的
Decrypt权限,不然就算能拿到对象,也解不开加密内容。检查单个对象的ACL权限
有时候Version.zip这个文件本身的ACL设置会拒绝访问,你可以在S3控制台找到这个文件,查看它的权限配置,确保部署用的IAM角色有读取权限。确认Jenkins的凭据配置没问题
如果Jenkins是用IAM用户的Access Key/Secret Key,先确认这些凭据没过期,而且对应的IAM用户确实有前面说的Lambda和S3权限;如果是用EC2实例角色运行Jenkins,要确认实例角色的权限策略正确,并且Jenkins服务已经成功获取到了角色的临时凭据(比如重启下Jenkins服务试试)。如果Lambda在VPC里,排查VPC端点配置
要是你的Lambda函数部署在VPC内,那它访问S3可能需要通过VPC网关端点。你得确认VPC里已经创建了S3的网关端点,并且Lambda所在子网的路由表已经配置了指向这个端点的路由规则。
最后推荐个小技巧:用IAM控制台的策略模拟器,测试你的部署角色是否同时具备s3:GetObject和lambda:UpdateFunctionCode权限,能快速定位到底缺了哪项权限。
内容的提问来源于stack exchange,提问作者ABCD

