Secret
This page covers building custom secrets providers. If you only need to configure secret resolution for a deployment, use Providers > Secret.
Secrets providers resolve named secrets at server startup. When the Gestalt config references a structured secret ref, the secrets provider fetches the value from whatever backend it wraps (a cloud key vault, a file on disk, an environment variable, etc.) and injects it into the config before any other component starts.
The built-in env and file providers cover local development. For production deployments that store secrets in a cloud vault, use an external secrets provider.
The examples on this page use a Google Secret Manager provider as the running example.
Manifest
A secrets provider manifest declares kind: secrets:
kind: secrets
source: github.com/your-org/secrets/google
version: 0.0.1
displayName: Google Secret Manager
description: Resolves secrets from Google Cloud Secret Manager.
spec:
configSchemaPath: ./secrets_config.jsonThe optional spec.configSchemaPath field points to a JSON Schema that validates the config block in the server config.
Interface
A secrets provider implements two methods: Configure and GetSecret. Configure receives the provider name and the raw config map. GetSecret receives a secret name and returns the resolved value as a string.
Go
package googlesecrets
import (
"context"
"fmt"
secretmanager "cloud.google.com/go/secretmanager/apiv1"
"cloud.google.com/go/secretmanager/apiv1/secretmanagerpb"
)
type GoogleSecrets struct {
client *secretmanager.Client
project string
version string
}
func New() *GoogleSecrets { return &GoogleSecrets{} }
func (s *GoogleSecrets) Configure(ctx context.Context, _ string, config map[string]any) error {
s.project, _ = config["project"].(string)
if s.project == "" {
return fmt.Errorf("project is required")
}
s.version, _ = config["version"].(string)
if s.version == "" {
s.version = "latest"
}
var err error
s.client, err = secretmanager.NewClient(ctx)
return err
}
func (s *GoogleSecrets) GetSecret(ctx context.Context, name string) (string, error) {
resp, err := s.client.AccessSecretVersion(ctx, &secretmanagerpb.AccessSecretVersionRequest{
Name: fmt.Sprintf("projects/%s/secrets/%s/versions/%s", s.project, name, s.version),
})
if err != nil {
return "", err
}
return string(resp.Payload.Data), nil
}
Config reference
To use a secrets provider in a Gestalt deployment, reference it as a named entry in the providers.secrets block:
providers:
secrets:
google:
source: ./google-secrets/manifest.yaml
config:
project: my-gcp-projectsource: ./manifest.yaml points at the provider’s manifest.yaml during development. For production, use a published provider-release.yaml metadata URL:
providers:
secrets:
google:
source: https://artifacts.example.com/secrets/google/v0.0.1/provider-release.yaml
config:
project: my-gcp-projectThe config block is passed to Configure at startup.
Built-in providers
Two simple providers are built in and do not require a plugin manifest:
env resolves secrets from environment variables. Secret names are uppercased with hyphens converted to underscores. An optional prefix is prepended.
providers:
secrets:
default:
source: env
config:
prefix: GESTALT_file reads secrets from files in a directory. Each secret name maps to a file in the configured directory.
providers:
secrets:
default:
source: file
config:
dir: /run/secretsAvailable providers
| Provider | Source ref | Description |
|---|---|---|
| AWS Secrets Manager | github.com/valon-technologies/gestalt-providers/secrets/aws | Config: region (required), versionStage, endpoint |
| Azure Key Vault | github.com/valon-technologies/gestalt-providers/secrets/azure | Config: vaultUrl (required), version |
| Google Secret Manager | github.com/valon-technologies/gestalt-providers/secrets/google | Config: project (required), version |
| HashiCorp Vault | github.com/valon-technologies/gestalt-providers/secrets/vault | Config: address (required), token (required), mountPath, namespace |
What to read next
- Configuration: how structured secret refs are used across the server config
- Releasing: packaging and publishing provider releases
- Built-in Providers: full reference for
envandfileproviders