This guide covers how to configure Pyvider providers in your Terraform configurations, including provider-level settings, environment variables, and best practices for managing sensitive data.
🤖 AI-Generated Content
This documentation was generated with AI assistance and is still being audited. Some, or potentially a lot, of this information may be inaccurate. Learn more.
variable"mycloud_api_key"{type=stringdescription="MyCloud API key"sensitive=true}variable"mycloud_endpoint"{type=stringdefault="https://api.mycloud.com"description="MyCloud API endpoint"}
def_build_schema(self)->PvsSchema:returns_provider({"api_key":a_str(required=True,sensitive=True,# Marks value as sensitivedescription="API key for authentication"),"password":a_str(required=True,sensitive=True,description="Password for authentication"),})
Benefits of marking attributes as sensitive:
- Values are masked in Terraform output
- Not shown in terraform plan or terraform show
- Protected in state file (when using remote state with encryption)
- Hidden in logs
# Production environmentprovider"mycloud"{alias="prod"api_key=var.prod_api_keyendpoint="https://api.prod.mycloud.com"}# Staging environmentprovider"mycloud"{alias="staging"api_key=var.staging_api_keyendpoint="https://api.staging.mycloud.com"}# Use specific provider instanceresource"mycloud_server""web"{provider=mycloud.prodname="web-server"}
def_build_schema(self)->PvsSchema:returns_provider({"api_key":a_str(required=True,sensitive=True),"region":a_str(default="us-east-1",description="AWS-compatible region identifier"),})
@attrs.defineclassRetryConfig:"""Retry configuration."""max_retries:int=3retry_delay:int=5timeout:int=60def_build_schema(self)->PvsSchema:returns_provider({"timeout":a_num(default=60,description="Request timeout in seconds"),"max_retries":a_num(default=3,description="Maximum number of retry attempts"),"retry_delay":a_num(default=5,description="Delay between retries in seconds"),})asyncdefconfigure(self,config:dict)->None:awaitsuper().configure(config)retry_config=RetryConfig(timeout=config.get("timeout",60),max_retries=config.get("max_retries",3),retry_delay=config.get("retry_delay",5),)self.client=MyCloudClient(api_key=config["api_key"],retry_config=retry_config,)
asyncdefconfigure(self,config:dict)->None:"""Configure provider with validation."""awaitsuper().configure(config)# Validate endpoint URLendpoint=config.get("endpoint","")ifnotendpoint.startswith(("http://","https://")):raiseProviderConfigurationError("Endpoint must be a valid HTTP(S) URL")# Validate timeouttimeout=config.get("timeout",30)iftimeout<1ortimeout>300:raiseProviderConfigurationError("Timeout must be between 1 and 300 seconds")# Test connectiontry:self.client=MyCloudClient(api_key=config["api_key"],endpoint=endpoint,timeout=timeout,)awaitself.client.test_connection()exceptConnectionErrorase:raiseProviderConfigurationError(f"Failed to connect to {endpoint}: {e}")self.config=MyCloudConfig(api_key=config["api_key"],endpoint=endpoint,timeout=timeout,)
frompyvider.resourcesimportregister_resource,BaseResourcefrompyvider.resources.contextimportResourceContextfrompyvider.hubimporthub@register_resource("server")classServer(BaseResource):asyncdef_create_apply(self,ctx:ResourceContext)->tuple[ServerState|None,None]:"""Create server using provider configuration."""# Get provider instanceprovider=hub.get_component("singleton","provider")ifproviderisNoneorprovider.configisNone:raiseRuntimeError("Provider has not been configured yet.")# Access provider configapi_key=provider.config.api_keyendpoint=provider.config.endpoint# Use provider's clientserver=awaitprovider.client.create_server(name=ctx.config.name,region=provider.config.region,)returnServerState(...),None
def_build_schema(self)->PvsSchema:returns_provider({"api_key":a_str(required=True,sensitive=True),"tls_verify":a_bool(default=True),"tls_ca_cert_file":a_str(description="Path to CA certificate"),"tls_client_cert":a_str(description="Path to client certificate"),"tls_client_key":a_str(sensitive=True,description="Path to client key"),})
asyncdefconfigure(self,config:dict)->None:awaitsuper().configure(config)# Validate configurationifconfig["timeout"]<1:raiseProviderConfigurationError("Timeout must be positive")# Test connectivityawaitself.test_connection(config)
@attrs.defineclassProviderConfig:"""Type-safe provider configuration."""api_key:strendpoint:str="https://api.mycloud.com"timeout:int=30def__attrs_post_init__(self):"""Validate after initialization."""ifself.timeout<1:raiseValueError("Timeout must be positive")