Resource option: providers
The providers resource option is supported only on component resources. It sets a map of providers (keyed by package name) for the component and its child resources — the map flows from the component to every child via parent inheritance. To pass an explicit provider to a single custom resource, use the provider option instead.
When the SDK creates a resource it picks a provider by checking, in order:
- The explicit
provideroption, if set. - A matching provider in the resource’s
providersmap (looked up by package name). - A matching provider inherited from the parent’s
providersmap.
The first match wins. So a child resource created with a component as its parent automatically picks up the matching provider from the component’s inherited map — a child aws.s3.Bucket picks up the aws provider, a child kubernetes.helm.v3.Chart picks up the kubernetes provider, and so on. If a component is itself a child of another component, its providers are inherited from that parent in turn.
Example
A component can be instantiated multiple times against different sets of providers. Suppose MyComponent deploys a regional AWS database alongside a Helm chart on a Kubernetes cluster in the same region. To run the component in two regions from a single Pulumi program, declare a separate AWS provider and Kubernetes provider for each region, then pass the matching pair into each component instance via the providers map.
import * as aws from "@pulumi/aws";
import * as k8s from "@pulumi/kubernetes";
const awsEast = new aws.Provider("aws-east", { region: "us-east-1" });
const awsWest = new aws.Provider("aws-west", { region: "us-west-2" });
const k8sEast = new k8s.Provider("k8s-east", { kubeconfig: kubeconfigEast });
const k8sWest = new k8s.Provider("k8s-west", { kubeconfig: kubeconfigWest });
const east = new MyComponent("east", {}, {
providers: { aws: awsEast, kubernetes: k8sEast },
});
const west = new MyComponent("west", {}, {
providers: { aws: awsWest, kubernetes: k8sWest },
});
import pulumi
import pulumi_aws as aws
import pulumi_kubernetes as k8s
aws_east = aws.Provider("aws-east", region="us-east-1")
aws_west = aws.Provider("aws-west", region="us-west-2")
k8s_east = k8s.Provider("k8s-east", kubeconfig=kubeconfig_east)
k8s_west = k8s.Provider("k8s-west", kubeconfig=kubeconfig_west)
east = MyComponent("east", MyComponentArgs(), pulumi.ResourceOptions(providers={
"aws": aws_east,
"kubernetes": k8s_east,
}))
west = MyComponent("west", MyComponentArgs(), pulumi.ResourceOptions(providers={
"aws": aws_west,
"kubernetes": k8s_west,
}))
awsEast, err := aws.NewProvider(ctx, "aws-east", &aws.ProviderArgs{
Region: pulumi.String("us-east-1"),
})
if err != nil {
return err
}
awsWest, err := aws.NewProvider(ctx, "aws-west", &aws.ProviderArgs{
Region: pulumi.String("us-west-2"),
})
if err != nil {
return err
}
k8sEast, err := k8s.NewProvider(ctx, "k8s-east", &k8s.ProviderArgs{
Kubeconfig: pulumi.String(kubeconfigEast),
})
if err != nil {
return err
}
k8sWest, err := k8s.NewProvider(ctx, "k8s-west", &k8s.ProviderArgs{
Kubeconfig: pulumi.String(kubeconfigWest),
})
if err != nil {
return err
}
_, err = NewMyComponent(ctx, "east", &MyComponentArgs{},
pulumi.ProviderMap(map[string]pulumi.ProviderResource{
"aws": awsEast,
"kubernetes": k8sEast,
}))
if err != nil {
return err
}
_, err = NewMyComponent(ctx, "west", &MyComponentArgs{},
pulumi.ProviderMap(map[string]pulumi.ProviderResource{
"aws": awsWest,
"kubernetes": k8sWest,
}))
if err != nil {
return err
}
var awsEast = new Pulumi.Aws.Provider("aws-east",
new Pulumi.Aws.ProviderArgs { Region = "us-east-1" });
var awsWest = new Pulumi.Aws.Provider("aws-west",
new Pulumi.Aws.ProviderArgs { Region = "us-west-2" });
var k8sEast = new Pulumi.Kubernetes.Provider("k8s-east",
new Pulumi.Kubernetes.ProviderArgs { KubeConfig = kubeconfigEast });
var k8sWest = new Pulumi.Kubernetes.Provider("k8s-west",
new Pulumi.Kubernetes.ProviderArgs { KubeConfig = kubeconfigWest });
var east = new MyComponent("east", new MyComponentArgs(),
new ComponentResourceOptions {
Providers = { awsEast, k8sEast },
});
var west = new MyComponent("west", new MyComponentArgs(),
new ComponentResourceOptions {
Providers = { awsWest, k8sWest },
});
var awsEast = new com.pulumi.aws.Provider("aws-east",
com.pulumi.aws.ProviderArgs.builder().region("us-east-1").build());
var awsWest = new com.pulumi.aws.Provider("aws-west",
com.pulumi.aws.ProviderArgs.builder().region("us-west-2").build());
var k8sEast = new com.pulumi.kubernetes.Provider("k8s-east",
com.pulumi.kubernetes.ProviderArgs.builder()
.kubeconfig(kubeconfigEast).build());
var k8sWest = new com.pulumi.kubernetes.Provider("k8s-west",
com.pulumi.kubernetes.ProviderArgs.builder()
.kubeconfig(kubeconfigWest).build());
var east = new MyComponent("east", new MyComponentArgs(),
ComponentResourceOptions.builder().providers(awsEast, k8sEast).build());
var west = new MyComponent("west", new MyComponentArgs(),
ComponentResourceOptions.builder().providers(awsWest, k8sWest).build());
Thank you for your feedback!
If you have a question about how to use Pulumi, reach out in Community Slack.
Open an issue on GitHub to report a problem or suggest an improvement.