如何处理Lambda调用S3 PutObject操作时的Access Denied错误
解决Lambda调用S3 PutObject时的AccessDenied错误
嘿,我看到你的Lambda函数在往S3桶写文件时碰到了权限拒绝的问题,这大概率是权限配置没到位导致的,我给你整理几个最常见的解决方向:
首先先确认下你的代码(方便对照排查):
import boto3 def lambda_handler(event, context): bucket='tessstinggbucccket' key='june/22/testlog1.txt' some_binary_data = b'Here we have some data' s3 = boto3.resource("s3") object = s3.Object(bucket, key) object.put(Body=some_binary_data)
1. 给Lambda的执行角色添加S3写入权限
Lambda函数是靠它的执行角色来获取访问AWS服务的权限的,这个角色必须明确被允许执行s3:PutObject操作,针对你的目标桶或者特定路径。
你需要给Lambda的IAM角色添加这样的权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::tessstinggbucccket/june/22/*" } ] }
建议遵循最小权限原则,只给需要的路径授权;如果需要对整个桶有写入权限,可以把Resource改成arn:aws:s3:::tessstinggbucccket/*。
2. 检查S3桶的Bucket Policy
有时候哪怕Lambda角色本身有权限,S3桶的Bucket Policy也可能拒绝访问请求。你需要确认桶的Policy里没有阻止该角色的PutObject操作,必要的话添加允许语句:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的Lambda执行角色名称" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::tessstinggbucccket/june/22/*" } ] }
注意:Bucket Policy里的Deny语句优先级高于Allow,所以要仔细检查有没有意外的拒绝规则。
3. 确认桶名和路径的正确性
虽然看起来你的桶名是tessstinggbucccket,但要确认这个桶确实存在于你的AWS账号下,并且路径june/22/的拼写完全正确——S3的路径是区分大小写的,别因为大小写或者拼写错误导致权限校验失败。
4. 检查桶的服务器端加密配置(如果启用)
如果你的S3桶启用了默认的服务器端加密(比如使用AWS KMS密钥),那Lambda的执行角色还需要额外拥有kms:GenerateDataKey和kms:Decrypt权限,针对对应的KMS密钥,否则会因为加密权限不足触发AccessDenied错误。
内容的提问来源于stack exchange,提问作者SRNG
相关产品推荐
相关产品推荐

