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.Bucket

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Grant s3:DeleteObject (and s3:ListBucket for existence checks) to the credentials used by the SDK
  2. Log/inspect the appended err detail: AccessDenied => fix policy, NoSuchBucket => fix bucket name, networking => check endpoint/region
  3. Verify the key passed to DeleteObject matches the stored key exactly (no leading slash, correct PathPrefix)
  4. 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

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


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/89e1266b8c9b5162. Report an issue: GitHub.