Register providers
Register storage, compute, catalog, and secret providers in a Redis Feature Form workspace.
Register the providers and secret backends Redis Feature Form needs before you author features or transformations. Providers connect a workspace to external systems, and definitions files reference them by name.
Prerequisites
Before you register a provider, make sure you have:
- A workspace.
- The
redis-featureformPython package installed. It includes the Python client and theffcommand-line interface (CLI). - Network access from the Feature Form server and its workers to the external system.
- A registered secret provider for each credential reference in the provider configuration.
The examples show Python first and the equivalent ff command second. Configure authentication through an active profile or environment variables before you use either interface. ff.Client.from_env() reads that configuration, including FEATUREFORM_BASE_URL and FEATUREFORM_TOKEN when set. The CLI connects to localhost:9090 by default; use --server <host:port> or configure another endpoint when the server is elsewhere.
The Python examples on this page use these workspace-scoped clients:
import featureform as ff
client = ff.Client.from_env()
providers = client.providers("<workspace-id>")
secret_providers = client.secret_providers("<workspace-id>")
Provider names are unique within a workspace. Use stable names because definitions files and other providers can refer to them.
Choose a provider
A provider fills one or more literal roles: offline-store, online-store, compute, or streaming. Registration support doesn't mean every resource accepts every provider.
| Provider | Roles | Use it for |
|---|---|---|
| Databricks | offline-store, compute |
Managed Spark compute with Unity Catalog outputs |
| Snowflake | offline-store, compute |
Snowflake datasets and SQL compute |
| PostgreSQL | offline-store, compute |
PostgreSQL datasets and SQL compute |
| S3 | offline-store |
Object storage and Spark data or staging access |
| Redis | online-store |
Low-latency feature serving |
| Spark | compute |
Generic Spark execution |
| Iceberg catalog | offline-store |
Catalog-backed Iceberg tables |
Use ff provider register --help to see the complete list of provider types and their current options.
Configure secret providers
Feature Form never stores credentials in any form. A provider configuration contains secret references, and the Feature Form process that needs a credential resolves it from the registered backend.
Each workspace includes an env secret provider. An env:PG_PASSWORD reference reads PG_PASSWORD from the Feature Form server's environment, not from the shell where you run ff.
Check the built-in provider:
ff secret-provider list --workspace <workspace-id>
ff secret-provider get env --workspace <workspace-id>
For production deployments, register the backend that manages your credentials before registering data providers that use it.
Register an environment secret provider
Use an environment provider for local development or bootstrap. A prefix helps separate its variables from other process configuration.
from featureform.types import EnvSecretConfig, SecretProviderType
secret_providers.register(
name="<secret-provider-name>",
provider_type=SecretProviderType.ENV,
config=EnvSecretConfig(prefix="FF_"),
)
Register Vault
The Feature Form server must be able to authenticate to Vault. The provider uses the key-value version 2 secrets engine.
from featureform.types import SecretProviderType, VaultSecretConfig
secret_providers.register(
name="<secret-provider-name>",
provider_type=SecretProviderType.VAULT,
config=VaultSecretConfig(
address="https://<vault-host>",
token_path="<vault-token-path>",
),
)
Register Kubernetes secrets
For a Kubernetes deployment, use in-cluster authentication. The Feature Form server's service account needs permission to read secrets in the target namespace.
from featureform.types import KubernetesSecretConfig, SecretProviderType
secret_providers.register(
name="<secret-provider-name>",
provider_type=SecretProviderType.K8S,
config=KubernetesSecretConfig(
namespace="<namespace>",
secret_name="<secret-name>",
in_cluster=True,
),
)
If Feature Form runs outside Kubernetes, omit in_cluster=True or use --no-k8s-in-cluster. The Feature Form server then uses ~/.kube/config and its current context. It doesn't use kubeconfig from the computer where you run ff.
Register AWS Secrets Manager
The Feature Form server authenticates with the standard Amazon Web Services (AWS) credential chain.
from featureform.types import AWSSecretsManagerSecretConfig, SecretProviderType
secret_providers.register(
name="<secret-provider-name>",
provider_type=SecretProviderType.AWS,
config=AWSSecretsManagerSecretConfig(region="<aws-region>"),
)
Register Redis for online serving
Register a redis or redis-cluster provider when feature views need an online store. See Register Redis providers for topology, authentication, TLS, Spark, and Databricks guidance.
Keep health checks enabled
Provider registration validates configuration and runs a synchronous health check before persistence by default. The exact check is provider-specific and might require write permissions.
Use --skip-health-check, or skip_health_check=True in Python, only when the external system is deliberately unavailable during registration. This skips the synchronous check but does not disable recurring monitoring. Use --disable-monitoring, or disable_monitoring=True, to skip the initial check and disable recurring checks.
Verify registration
ff provider list --workspace <workspace-id>
ff provider get <provider-name> --workspace <workspace-id>
Pass --output json or --output yaml for machine-readable output. If the provider isn't returned, rerun the registration command and review its validation or health-check error.
In Python, use providers.list() or providers.get("<provider-name>").
Update or delete a provider
ff provider update <provider-name> \
--workspace <workspace-id> \
<provider-options>
ff provider delete <provider-name> \
--workspace <workspace-id>
Provider-specific fields can be mutable, force-required, or immutable. --force allows a force-required change after Feature Form checks known direct uses. It doesn't override immutable fields, migrate external data, or guarantee that no indirect references exist. Review definitions and provider-to-provider references before an update or deletion.
In Python, use providers.update() and providers.delete(). Pass force=True to providers.update() only after the same review required for --force.
Automate repeatable registration
register() creates a provider and returns an error when that name already exists. For a repeatable automation script, register missing providers and update existing providers of the same type:
import featureform as ff
def ensure_registered(registry, name, provider_type, config):
try:
current = registry.get(name)
except ff.NotFoundError:
return registry.register(
name=name,
provider_type=provider_type,
config=config,
)
if current.type != provider_type:
raise ValueError(
f"{name!r} is registered as {current.type}, not {provider_type}"
)
return registry.update(
name=name,
config=config,
provider_type=provider_type,
)
You can pass either providers or secret_providers as registry. The helper deliberately doesn't force an update. A force-required or immutable change fails so you can review its effect before changing the provider.
Next steps
After you register the required providers, define and deploy features.