hashicorp/nomad · error

Multiregion jobs are unlicensed.

Error message

Multiregion jobs are unlicensed.

What it means

Multiregion.Validate in the CE build returns "Multiregion jobs are unlicensed." whenever a job carries a non-nil multiregion stanza. Multiregion deployments (running one job spec across multiple regions/federated clusters) are an Enterprise-only feature; the OSS binary rejects the stanza at job validation time.

Source

Thrown at nomad/structs/structs_ce.go:46

func (n *NamespaceVaultConfiguration) Validate() error {
	if n != nil {
		return errors.New("Multi-Cluster Vault is unlicensed.")
	}
	return nil
}

func (n *NamespaceConsulConfiguration) Canonicalize() {}

func (n *NamespaceConsulConfiguration) Validate() error {
	if n != nil {
		return errors.New("Multi-Cluster Consul is unlicensed.")
	}
	return nil
}

func (m *Multiregion) Validate(jobType string, jobDatacenters []string) error {
	if m != nil {
		return errors.New("Multiregion jobs are unlicensed.")
	}

	return nil
}

func (p *ScalingPolicy) validateType() multierror.Error {
	var mErr multierror.Error

	// Check policy type and target
	switch p.Type {
	case ScalingPolicyTypeHorizontal:
		targetErr := p.validateTargetHorizontal()
		mErr.Errors = append(mErr.Errors, targetErr.Errors...)
	default:
		mErr.Errors = append(mErr.Errors, fmt.Errorf(`scaling policy type "%s" is not valid`, p.Type))
	}

	return mErr

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Remove the multiregion stanza and submit the job to each region individually as a single-region job.
  2. Upgrade to Nomad Enterprise and apply a license that includes multiregion deployments.
  3. If the stanza is accidentally included by templates, strip it before submission (e.g. hcl2 jobs without multiregion).

Example fix

// before (HCL)
job "app" {
  multiregion { region "global" { datacenters = ["dc1"] } }
}
// after
job "app" {
  datacenters = ["dc1"]
}
Defensive patterns

Strategy: validation

Validate before calling

if job.Multiregion != nil {
	return errors.New("multiregion jobs require Nomad Enterprise")
}

Type guard

func multiregionLicensed(j *structs.Job) bool { return j == nil || j.Multiregion == nil }

Try / catch

if err := job.Validate(); err != nil && strings.Contains(err.Error(), "unlicensed") {
	job.Multiregion = nil // resubmit as a single-region job
}

Prevention

When it happens

Trigger: Submitting a job containing a top-level multiregion { ... } stanza (nomad job run / POST /v1/jobs) to a community-edition agent; job plan/validate endpoints also surface it.

Common situations: Copying an Enterprise example job file into an OSS cluster; automation generated for a multi-region Enterprise deployment being run against a dev OSS agent; license expired so agent downgraded behavior.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/734e58c817b661e4. Report an issue: GitHub.