生成S3预签名URL的Lambda函数最小权限配置问题
问题分析与解决方案
你的问题出在IAM策略的资源(Resource)配置上:当前策略仅授权了S3桶本身的权限,但s3:GetObject操作需要的是桶内对象的权限,而非桶的权限。此外,你的策略中多余的s3:PutObject权限可以移除,因为生成get_object类型的预签名URL只需要s3:GetObject权限。
修正后的SAM部署模板
GetReportFunction: Type: AWS::Serverless::Function Properties: FunctionName: !Sub 'getreport-${AWS::StackName}' Environment: Variables: BUCKET_NAME: !Ref LunchOrderBucket Runtime: python3.9 PackageType: Zip CodeUri: src/get_report Handler: get_report.lambda_handler Role: !GetAtt GetReportFunctionRole.Arn GetReportFunctionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: sts:AssumeRole Principal: Service: lambda.amazonaws.com Policies: - PolicyName: GetReportFunctionPolicy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: s3:GetObject Resource: !Sub '${LunchOrderBucket.Arn}/*'
修改说明
- 资源范围调整:将
Resource从桶的ARN改为${LunchOrderBucket.Arn}/*,表示授权该桶下所有对象的s3:GetObject权限,这是生成GetObject预签名URL的必要条件。 - 移除冗余权限:删除了不必要的
s3:PutObject权限,遵循最小权限原则。 - Lambda函数代码无需修改:你的Python代码逻辑是正确的,生成预签名URL的调用没有问题。
当使用修正后的策略时,Lambda函数就能以最小权限生成有效的S3对象预签名URL,不会再出现访问拒绝的问题。
内容的提问来源于stack exchange,提问作者Revanth Kumar Perla
相关产品推荐
相关产品推荐

