部署到AWS Lambda后图片上传无法显示问题求助
问题描述
本地运行代码时,上传至AWS S3的图片可通过浏览器链接正常显示;但将代码部署到AWS Lambda后,上传的图片无法显示。已添加S3相关IAM权限但问题仍未解决。
上传函数代码(Go)
func UploadFile(uploader *manager.Uploader, key string, file multipart.File, fileHeader *multipart.FileHeader) (string, error) { if file == nil { return "", errors.New("file is nil") } contentType := fileHeader.Header.Get("Content-Type") if contentType == "" { contentType = "application/octet-stream" // Default to binary if content type is not provided } fileStat, err := fileHeader.Open() if err != nil { return "", fmt.Errorf("failed to open file for debugging: %w", err) } defer fileStat.Close() if _, err := file.Seek(0, 0); err != nil { return "", errors.New("failed to reset file cursor: " + err.Error()) } result, err := uploader.Upload(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String("unleap-bucket"), Key: aws.String("uneleap/" + key), Body: file, ContentType: aws.String(contentType), ACL: types.ObjectCannedACLPublicRead, }) if err != nil { return "", err } // Ensure the result is not nil and return the location of the uploaded file if result == nil || result.Location == "" { return "", errors.New("failed to get the uploaded file location") } return result.Location, err }
Serverless配置文件
service: uneleap-api-client frameworkVersion: ">=4.1.19" provider: name: aws region: eu-north-1 runtime: go1.x stage: ${opt:stage} iam: role: statements: - Effect: "Allow" Action: - "s3:PutObject" - "s3:GetObject" - "s3:PutObjectAcl" Resource: "arn:aws:s3:::u-bucket/*" custom: hooks: 'package:initialize': ./scripts/generate_swagger.sh package: patterns: - '!*/**' - bin/main functions: api: handler: bin/main events: - http: path: /{proxy+} method: ANY cors: true
已配置的IAM权限
iam: role: statements: - Effect: "Allow" Action: - "s3:PutObject" - "s3:GetObject" - "s3:PutObjectAcl" Resource: "arn:aws:s3:::u-bucket/*"
排查关键点
- Bucket名称不匹配:代码中指定的Bucket是
unleap-bucket,但IAM权限配置的Resource是u-bucket,两者不一致,导致权限无法覆盖实际使用的Bucket,这是核心问题之一。 - 文件指针重置有效性:代码中打开了
fileStat但未使用,反而对file执行Seek(0,0),需确认file的指针位置是否正确,若上传前文件指针已到末尾,会导致上传空文件。 - S3 Bucket公开访问限制:检查Bucket的「Block Public Access」设置,若开启了阻止公开访问,即使设置
PublicReadACL也无法让对象公开可访问。 - IAM权限范围修正:将IAM角色的Resource修改为
arn:aws:s3:::unleap-bucket/*,确保权限覆盖实际使用的Bucket及对象路径。 - 上传内容完整性验证:查看Lambda日志,对比本地和Lambda环境下上传的文件大小,确认是否完整上传。
- Content-Type正确性检查:验证Lambda环境下是否正确获取到文件的
Content-Type,若Content-Type错误(如默认成application/octet-stream),浏览器可能无法正确解析图片。
内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga
相关产品推荐
相关产品推荐

