flipped-aurora/gin-vue-admin · error
function client.DeleteObject() failed, err:
Error message
function client.DeleteObject() failed, err:
What it means
Wraps the error from the AWS SDK v2 client.DeleteObject() call in AwsS3.DeleteFile. The SDK returns an error when the delete request fails at the API level: invalid credentials, missing s3:DeleteObject permission, wrong bucket/key, or network/API failure. This is the first half of DeleteFile; afterwards the code waits for ObjectNotExists to confirm deletion, but this error fires before that wait.
Source
Thrown at server/utils/upload/aws_s3.go:82
//@description: Delete file from Aws S3 using aws-sdk-go-v2. See https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/s3-example-basic-bucket-operations.html
//@param: key string
//@return: error
func (*AwsS3) DeleteFile(ctx context.Context, key string) error {
client, err := newS3Client()
if err != nil {
return err
}
filename := global.GVA_CONFIG.AwsS3.PathPrefix + "/" + key
bucket := global.GVA_CONFIG.AwsS3.Bucket
_, err = client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(filename),
})
if err != nil {
logger.WithCtx(ctx).Mod("upload").Err(err).Error("function client.DeleteObject() failed")
return errors.New("function client.DeleteObject() failed, err:" + err.Error())
}
waiter := s3.NewObjectNotExistsWaiter(client)
_ = waiter.Wait(context.TODO(), &s3.HeadObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(filename),
}, 30*time.Second)
return nil
}
// Exists 检查对象是否存在。404 统一降级为 (false, nil)。
func (*AwsS3) Exists(ctx context.Context, key string) (bool, error) {
client, err := newS3Client()
if err != nil {
return false, err
}
bucket := global.GVA_CONFIG.AwsS3.BucketView on GitHub (pinned to 3136500ef3)
Solutions
- Grant s3:DeleteObject (and s3:ListBucket for existence checks) to the credentials used by the SDK
- Log/inspect the appended err detail: AccessDenied => fix policy, NoSuchBucket => fix bucket name, networking => check endpoint/region
- Verify the key passed to DeleteObject matches the stored key exactly (no leading slash, correct PathPrefix)
- Test the same delete with aws s3api delete-object using identical credentials to isolate app vs AWS config
Example fix
// before
Key: aws.String("/" + filename) // leading slash creates a mismatched key
// after
Key: aws.String(strings.TrimPrefix(filename, "/")) Defensive patterns
Strategy: try-catch
Validate before calling
key := strings.TrimPrefix(filename, "/")
if bucket == "" || key == "" {
return errors.New("delete requires non-empty bucket and key")
}
_, err := client.HeadObject(ctx, &s3.HeadObjectInput{Bucket: aws.String(bucket), Key: aws.String(key)})
if err != nil { return fmt.Errorf("object %s not found/accessible before delete: %w", key, err) } Type guard
func isAccessDenied(err error) bool {
var ae smithy.APIError
return errors.As(err, &ae) && (ae.ErrorCode() == "AccessDenied" || ae.ErrorCode() == "NoSuchBucket")
} Try / catch
err := s3Store.DeleteFile(key)
var ae smithy.APIError
if err != nil && errors.As(err, &ae) {
switch ae.ErrorCode() {
case "AccessDenied": return fmt.Errorf("missing s3:DeleteObject on %s: %w", key, err)
case "NoSuchBucket": return fmt.Errorf("check bucket config: %w", err)
default: return err
}
} Prevention
- Verify key construction (PathPrefix + timestamp + filename) matches keys produced by UploadFile
- Include s3:DeleteObject and s3:ListBucket in the runtime IAM policy
- Use aws s3api delete-object with the same credentials as a smoke test during setup
- Log the raw SDK error code, not just the wrapped message, for faster triage
When it happens
Trigger: Calling DeleteFile when: the IAM identity lacks s3:DeleteObject on the key, the bucket name resolved from config/bucket parameter is wrong, credentials are invalid, the key contains characters that were improperly encoded, or a network error/timeout occurs against the S3 endpoint.
Common situations: Read-only IAM policies applied to the app role; bucket misspelled or pointing at another environment; S3-compatible endpoints (MinIO) unreachable; object key built with an untrimmed path prefix so the key never matches.
Related errors
- function client.DeleteObjects() failed, err:
- unknown error
- function bucket.DeleteObjects() failed, err:
- function bucket.ListObjects() failed, err:
- function file.Open() failed, err:
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/89e1266b8c9b5162.
Report an issue: GitHub.