argoproj/argo-workflows · error
failed to check if bucket %s exists: %w
Error message
failed to check if bucket %s exists: %w
What it means
Raised in Save when outputArtifact.OSS.CreateBucketIfNotPresent is true and the IsBucketExist probe fails. This is an API/transport error while checking bucket existence, not a 'bucket missing' result — usually credentials, endpoint, or permission problems. Non-transient errors abort the Save backoff immediately.
Source
Thrown at workflow/artifacts/oss/oss.go:241
logger.Info(ctx, "OSS Save")
osscli, err := ossDriver.newOSSClient(ctx)
if err != nil {
return !isTransientOSSErr(ctx, err), err
}
isDir, err := file.IsDirectory(path)
if err != nil {
logger.WithError(err).Warn(ctx, "Failed to test if path is a directory")
return false, nil
}
bucketName := outputArtifact.OSS.Bucket
err = setBucketLogging(osscli, bucketName)
if err != nil {
return !isTransientOSSErr(ctx, err), err
}
if outputArtifact.OSS.CreateBucketIfNotPresent {
exists, existsErr := osscli.IsBucketExist(bucketName)
if existsErr != nil {
return !isTransientOSSErr(ctx, existsErr), fmt.Errorf("failed to check if bucket %s exists: %w", bucketName, existsErr)
}
if !exists {
err = osscli.CreateBucket(bucketName)
if err != nil {
return !isTransientOSSErr(ctx, err), fmt.Errorf("failed to automatically create bucket %s when it's not present: %w", bucketName, err)
}
}
}
bucket, err := osscli.Bucket(bucketName)
if err != nil {
return !isTransientOSSErr(ctx, err), err
}
objectName := outputArtifact.OSS.Key
if outputArtifact.OSS.LifecycleRule != nil {
err = setBucketLifecycleRule(osscli, outputArtifact.OSS)
if err != nil {
return !isTransientOSSErr(ctx, err), err
}View on GitHub (pinned to 35bff19146)
Solutions
- Check the wrapped OSS error code to distinguish AccessDenied (fix RAM policy: add oss:GetBucketInfo/oss:ListObjects) from network errors (fix endpoint/DNS).
- Verify endpoint and credentials in the artifact repository secret; test with ossutil using the same AK/SK/endpoint.
- If you pre-create the bucket yourself, set createBucketIfNotPresent: false to skip the existence probe entirely.
- If transient (network/throttle), re-run — the driver's backoff already retries transient errors.
Example fix
// before (workflow spec) oss: createBucketIfNotPresent: true // after (bucket managed externally, avoids the probe) oss: createBucketIfNotPresent: false
Defensive patterns
Strategy: validation
Validate before calling
// preflight outside the workflow, same credentials
cli, err := oss.New(endpoint, ak, sk)
if err != nil { panic(err) }
ok, err := cli.IsBucketExist(bucketName)
if err != nil { panic(fmt.Sprintf("bucket probe failed (creds/endpoint/permission): %v", err)) }
fmt.Printf("bucket %s exists: %v\n", bucketName, ok) Type guard
func isBucketProbeErr(err error) bool {
se, ok := err.(oss.ServiceError)
return ok && (se.Code == "AccessDenied" || se.Code == "SignatureDoesNotMatch" || se.StatusCode == 403)
} Try / catch
err := driver.Save(ctx, path, artifact)
if err != nil && strings.Contains(err.Error(), "failed to check if bucket") {
var se oss.ServiceError
if errors.As(err, &se) && se.StatusCode == 403 {
// credentials/permission problem: alert, don't retry
}
} Prevention
- Keep createBucketIfNotPresent: false in production; manage buckets via IaC.
- Preflight credentials with ossutil (ossutil ls) using the exact secret values.
- Scope RAM policies to include bucket-level read actions if the probe stays enabled.
- Document env/secret setup so endpoints match the pod network (internal vs public endpoint).
When it happens
Trigger: Saving an output artifact with createBucketIfNotPresent: true while osscli.IsBucketExist errors: invalid AK/SK, unreachable or wrong endpoint, missing oss:GetBucketInfo/List permission on the account, or DNS/network failure from the exec to OSS.
Common situations: First-time setup where the secret's endpoint is wrong (e.g. internal endpoint from outside the VPC); RAM user lacking bucket-level read permissions; typo'd bucket name violating OSS naming rules can also surface here depending on SDK validation; corporate proxy blocking the OSS endpoint.
Related errors
- failed to automatically create bucket %s when it's not prese
- mkdir %s error: %w
- failed to test if %s/%s is a directory: %w
- failed get directory: %w
- failed to configure bucket logging: %w
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/07fb3ef262f30619.
Report an issue: GitHub.