Create and manage instance configurations
Stay organized with collections
Save and categorize content based on your preferences.
This page describes how to list, create, update, delete, and show the details of
a Spanner instance configuration.
Some custom instance configuration functionalities are not available in the
Google Cloud console UI. In those cases, use the Google Cloud CLI (gcloud) commands
provided.
List instance configurations
You can list all the available Spanner instance configurations
with the gcloud CLI and client libraries.
To find a list of all Spanner instance configurations, see
Regional and multi-region configurations.
The instance configurations with predefined regions and replication topologies
are called base instance configurations. You can't change the replication
topology of base instance configurations.
You can create a custom instance configuration, which lets you add additional
optional read-only replicas to the
predefined base instance configuration. This scales reads and supports low
latency stale reads. The added read-only replica must be in a region that isn't
part of the existing instance configuration. For a list of the optional
read-only regions that you can use to create a custom instance configuration,
see the Optional Region column under
Regional available configurations
and Multi-region available configurations.
To create a custom instance configuration, you must have the
spanner.instanceConfigs.create permission. By default, roles that have the
spanner.instances.create permission will also have the
spanner.instanceConfigs.create permission.
Console
You can't create a custom instance configuration using the
Google Cloud console. To create an instance with read-only replicas, use
the gcloud CLI
or client libraries.
gcloud
Use the gcloud spanner instance-configs create command:
You can use the --clone-config flag as a convenient way to clone another
base or custom instance configuration while also declaring the location and
type of a specific custom replica.
A
permanent identifier that is unique within your Google Cloud project. You
can't change the instance configuration ID later. The custom-
prefix is required to avoid name conflicts with base instance
configurations.
DISPLAY-NAME
The
name to display for the custom instance configuration in the
Google Cloud console.
If you choose to use the flags `--base-config` and `--replicas`, provide the
following values:
BASE-CONFIG
The region name of the base instance configuration on which your
custom instance configuration is based. For example, eur6
or regional-us-central1.
LOCATION
The region name of the serving resources (replicas), for example,
us-east1. To find out what location names are accepted, run
gcloud spanner instance-configs describe INSTANCE-CONFIG
and refer to the replicas and optionalReplicas
lists.
TYPE
The type of replica. To find out what corresponding locations and
replica types are accepted, run gcloud spanner instance-configs
describe INSTANCE-CONFIG and refer to the
replicas and optionalReplicas lists. The types
are one of the following:
READ_ONLY
READ_WRITE
WITNESS
Items in the list are separated by ":".
Unless the --[clone-config] flag is used, all replica
LOCATION and TYPE
must be specified when creating a custom instance configuration,
including the ones predefined in the base configuration. For more
information, see the
gcloud instance-configs describe help-text.
If you choose to use the flags --clone-config and --add-replicas (only
use --skip-replicas if there are replicas you want to skip from being
cloned), provide the following values:
--clone-config=INSTANCE-CONFIG
Use this flag as a convenient way to clone another base or custom
instance configuration while also declaring the location and type of a
specific custom replica. Then use
--add-replicas=location=LOCATION,type=TYPE
to specify where you want to add your optional replica.
For example, to create a custom instance configuration with two
read-only replicas in us-east1 while copying all the other replica
locations from the eur6 base instance configuration, run:
Use this flag to skip any replica from being cloned.
For example, to create a custom instance configuration with one
read-only replica in us-east4 while copying all the other replica
locations from the nam3 base instance configuration except the
read-only replica in us-central1, run:
KEY and VALUE: A list of
key and value pairs to add to your custom instance configuration.
Keys must start with a lowercase character and contain only hyphens (-),
underscores (_), lowercase characters, and numbers. Values must contain
only hyphens (-), underscores (_), lowercase characters, and numbers.
--validate-only
Use this flag to validate that the request will succeed before executing
it.
For example, to create a custom instance configuration with the eur6 base
configuration with one additional read-only replica in us-east1, run:
voidCreateInstanceConfig(google::cloud::spanner_admin::InstanceAdminClientclient,std::stringconst&project_id,std::stringconst&user_config_id,std::stringconst&base_config_id){autoproject=google::cloud::Project(project_id);autobase_config=client.GetInstanceConfig(project.FullName()+"/instanceConfigs/"+base_config_id);if(!base_config)throwstd::move(base_config).status();if(base_config->optional_replicas().empty()){throwstd::runtime_error("No optional replicas in base config");}google::spanner::admin::instance::v1::CreateInstanceConfigRequestrequest;request.set_parent(project.FullName());request.set_instance_config_id(user_config_id);auto*request_config=request.mutable_instance_config();request_config->set_name(project.FullName()+"/instanceConfigs/"+user_config_id);request_config->set_display_name("My instance config");// The user-managed instance config must contain all the replicas// of the base config plus at least one of the optional replicas.*request_config->mutable_replicas()=base_config->replicas();for(autoconst&replica:base_config->optional_replicas()){*request_config->add_replicas()=replica;}request_config->set_base_config(base_config->name());*request_config->mutable_leader_options()=base_config->leader_options();request.set_validate_only(false);autouser_config=client.CreateInstanceConfig(request).get();if(!user_config)throwstd::move(user_config).status();std::cout << "Created instance config [" << user_config_id << "]:\n" << user_config->DebugString();}
usingSystem;usingSystem.Threading.Tasks;usingGoogle.Api.Gax.ResourceNames;usingGoogle.Cloud.Spanner.Admin.Instance.V1;publicclassCreateInstanceConfigAsyncSample{publicasyncTask<InstanceConfig>CreateInstanceConfigAsync(stringprojectId,stringbaseInstanceConfigId,stringcustomInstanceConfigId){InstanceAdminClientinstanceAdminClient=awaitInstanceAdminClient.CreateAsync();varinstanceConfigName=newInstanceConfigName(projectId,baseInstanceConfigId);varinstanceConfig=awaitinstanceAdminClient.GetInstanceConfigAsync(instanceConfigName);varcustomInstanceConfigName=newInstanceConfigName(projectId,customInstanceConfigId);//Create a custom config.InstanceConfiguserInstanceConfig=newInstanceConfig{DisplayName="C# test custom instance config",ConfigType=InstanceConfig.Types.Type.UserManaged,BaseConfigAsInstanceConfigName=instanceConfigName,InstanceConfigName=customInstanceConfigName,//The replicas for the custom instance configuration must include all the replicas of the base//configuration, in addition to at least one from the list of optional replicas of the base//configuration.Replicas={instanceConfig.Replicas},OptionalReplicas={newReplicaInfo{Type=ReplicaInfo.Types.ReplicaType.ReadOnly,Location="us-east1",DefaultLeaderLocation=false},//The replicas for the custom instance configuration must include all the replicas of the base//configuration, in addition to at least one from the list of optional replicas of the base//configuration.instanceConfig.OptionalReplicas}};varoperationResult=awaitinstanceAdminClient.CreateInstanceConfigAsync(newCreateInstanceConfigRequest{ParentAsProjectName=ProjectName.FromProject(projectId),InstanceConfig=userInstanceConfig,InstanceConfigId=customInstanceConfigId});varpollResult=awaitoperationResult.PollUntilCompletedAsync();if(pollResult.IsFaulted){throwpollResult.Exception;}Console.WriteLine($"Instance config created successfully");Console.WriteLine($"Available custom replication options for instance config {pollResult.Result.Name}\r\n{pollResult.Result.OptionalReplicas}");returnpollResult.Result;}}
import("context""fmt""io""time"instance"cloud.google.com/go/spanner/admin/instance/apiv1""cloud.google.com/go/spanner/admin/instance/apiv1/instancepb")// createInstanceConfig creates a custom spanner instance configfunccreateInstanceConfig(wio.Writer,projectID,userConfigID,baseConfigIDstring)error{// projectID := "my-project-id"// userConfigID := "custom-config", custom config names must start with the prefix “custom-”.// baseConfigID := "my-base-config"// Add timeout to context.ctx,cancel:=context.WithTimeout(context.Background(),10*time.Minute)defercancel()adminClient,err:=instance.NewInstanceAdminClient(ctx)iferr!=nil{returnerr}deferadmiadminClient.ClosebaseConfig,err:=adminClient.GetInstanceConfig(ctx,&instancepb.GetInstanceConfigRequest{Name:fmt.Sprintf("projects/%s/instanceConfigs/%s",projectID,baseConfigID),})iferr!=nil{returnfmt.Errorf("createInstanceConfig.GetInstanceConfig: %w",err)}ifbaseConfig.OptionalReplicas==nil||len(baseConfig.OptionalReplicas)==0{returnfmt.Errorf("CreateInstanceConfig expects base config with at least from the list of optional replicas")}op,err:=adminClient.CreateInstanceConfig(ctx,&instancepb.CreateInstanceConfigRequest{Parent:fmt.Sprintf("projects/%s",projectID),// Custom config names must start with the prefix “custom-”.InstanceConfigId:userConfigID,InstanceConfig:&instancepb.InstanceConfig{Name:fmt.Sprintf("projects/%s/instanceConfigs/%s",projectID,userConfigID),DisplayName:"custom-golang-samples",ConfigType:instanceinstancepb.InstanceConfig_USER_MANAGEDThereplicasforthecustominstanceconfigurationmustincludeallthereplicasofthebase// configuration, in addition to at least one from the list of optional replicas of the base// configuration.Replicas:append(baseConfig.Replicas,baseConfig.OptionalReplicas...),BaseConfig:baseConfig.Name,Labels:map[string]string{"go_cloud_spanner_samples":"true"},},})iferr!=nil{returnerr}fmt.Fprintf(w,"Waiting for create operation on projects/%s/instanceConfigs/%s to complete...\n",projectID,userConfigID)// Wait for the instance configuration creation to finish.i,err:=op.Wait(ctx)iferr!=nil{returnfmt.Errorf("Waiting for instance config creation to finish failed: %w",err)}// The instance configuration may not be ready to serve yet.ifi.State!=instanceinstancepb.InstanceConfig_READY.Fprintf(w,"InstanceConfig state is not READY yet. Got state %v\n",i.State)}fmt.Fprintf(w,"Created instance configuration [%s]\n",userConfigID)returnnil}
importcom.google.cloud.spanner.Spanner;importcom.google.cloud.spanner.SpannerOptions;importcom.google.cloud.spanner.admin.instance.v1.InstanceAdminClient;importcom.google.spanner.admin.instance.v1.CreateInstanceConfigRequest;importcom.google.spanner.admin.instance.v1.InstanceConfig;importcom.google.spanner.admin.instance.v1.InstanceConfigName;importcom.google.spanner.admin.instance.v1.ProjectName;importcom.google.spanner.admin.instance.v1.ReplicaInfo;importjava.util.List;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;importjava.util.stream.Collectors;importjava.util.stream.Stream;classCreateInstanceConfigSample{staticvoidcreateInstanceConfig(){// TODO(developer): Replace these variables before running the sample.StringprojectId="my-project";StringbaseInstanceConfigId="nam11";StringinstanceConfigId="custom-instance-config4";createInstanceConfig(projectId,baseInstanceConfigId,instanceConfigId);}staticvoidcreateInstanceConfig(StringprojectId,StringbaseInstanceConfigId,StringinstanceConfigId){try(Spannerspanner=SpannerOptions.newBuilder().setProjectId(projectId).build().getService();InstanceAdminClientinstanceAdminClient=spanner.createInstanceAdminClient()){finalInstanceConfigNamebaseInstanceConfigName=InstanceConfigName.of(projectId,baseInstanceConfigId);finalInstanceConfigbaseConfig=instanceAdminClient.getInstanceConfig(baseInstanceConfigName.toString());finalInstanceConfigNameinstanceConfigName=InstanceConfigName.of(projectId,instanceConfigId);/** * The replicas for the custom instance configuration must include all the replicas of the * base configuration, in addition to at least one from the list of optional replicas of the * base configuration. */finalList<ReplicaInfo>replicas=Stream.concat(baseConfig.getReplicasList().stream(),baseConfig.getOptionalReplicasList().stream().limit(1)).collect(Collectors.toList());finalInstanceConfiginstanceConfig=InstanceConfig.newBuilder().setName(instanceConfigName.toString()).setBaseConfig(baseInstanceConfigName.toString()).setDisplayName("Instance Configuration").addAllReplicas(replicas).build();finalCreateInstanceConfigRequestcreateInstanceConfigRequest=CreateInstanceConfigRequest.newBuilder().setParent(ProjectName.of(projectId).toString()).setInstanceConfigId(instanceConfigId).setInstanceConfig(instanceConfig).build();try{System.out.printf("Waiting for create operation for %s to complete...\n",instanceConfigName);InstanceConfiginstanceConfigResult=instanceAdminClient.createInstanceConfigAsync(createInstanceConfigRequest).get(5,TimeUnit.MINUTES);System.out.printf("Created instance configuration %s\n",instanceConfigResult.getName());}catch(ExecutionException|TimeoutExceptione){System.out.printf("Error: Creating instance configuration %s failed with error message %s\n",instanceConfig.getName(),e.getMessage());}catch(InterruptedExceptione){System.out.println("Error: Waiting for createInstanceConfig operation to finish was interrupted");}}}}
/** * TODO(developer): Uncomment the following lines before running the sample. */// const instanceConfigId = 'custom-my-instance-config-id'// const baseInstanceConfigId = 'my-base-instance-config-id';// const projectId = 'my-project-id';// Imports the Google Cloud client libraryconst{Spanner}=require('@google-cloud/spanner');// Creates a clientconstspanner=newSpanner({projectId:projectId,});constinstanceAdminClient=spanner.getInstanceAdminClient();// Creates a new instance configasyncfunctioncreateInstanceConfig(){const[baseInstanceConfig]=awaitinstanceAdminClient.getInstanceConfig({name:instanceAdminClient.instanceConfigPath(projectId,baseInstanceConfigId,),});try{console.log(`Creating instance config ${instanceAdminClient.instanceConfigPath(projectId,instanceConfigId,)}.`,);const[operation]=awaitinstanceAdminClient.createInstanceConfig({instanceConfigId:instanceConfigId,parent:instanceAdminClient.projectPath(projectId),instanceConfig:{name:instanceAdminClient.instanceConfigPath(projectId,instanceConfigId,),baseConfig:instanceAdminClient.instanceConfigPath(projectId,baseInstanceConfigId,),displayName:instanceConfigId,replicas:baseInstanceConfig.replicas.concat(baseInstanceConfig.optionalReplicas[0],),},});console.log(`Waiting for create operation for ${instanceConfigId} to complete...`,);awaitoperation.promise();console.log(`Created instance config ${instanceConfigId}.`);}catch(err){console.error('ERROR: Creating instance config ',instanceConfigId,' failed with error message ',err,);}}createInstanceConfig();
defcreate_instance_config(user_config_name,base_config_id):"""Creates the new user-managed instance configuration using base instance config."""# user_config_name = `custom-nam11`# base_config_id = `projects/<project>/instanceConfigs/nam11`spanner_client=spanner.Client()base_config=spanner_client.instance_admin_api.get_instance_config(name=base_config_id)# The replicas for the custom instance configuration must include all the replicas of the base# configuration, in addition to at least one from the list of optional replicas of the base# configuration.replicas=[]forreplicainbase_config.replicas:replicas.append(replica)replicas.append(base_config.optional_replicas[0])operation=spanner_client.instance_admin_api.create_instance_config(parent=spanner_client.project_name,instance_config_id=user_config_name,instance_config=spanner_instance_admin.InstanceConfig(name="{}/instanceConfigs/{}".format(spanner_client.project_name,user_config_name),display_name="custom-python-samples",config_type=spanner_instance_admin.InstanceConfig.Type.USER_MANAGED,replicas=replicas,base_config=base_config.name,labels={"python_cloud_spanner_samples":"true"},),)print("Waiting for operation to complete...")operation.result(OPERATION_TIMEOUT_SECONDS)print("Created instance configuration {}".format(user_config_name))
require"google/cloud/spanner"require"google/cloud/spanner/admin/instance"defspanner_create_instance_configproject_id:,user_config_name:,base_config_id:# project_id = "Your Google Cloud project ID"# user_config_name = "Your custom instance configuration name, The name must start with 'custom-'"# base_config_id = "Base configuration ID to be used for creation, e.g projects/<project>/instanceConfigs/nam11"instance_admin_client=Google::Cloud::Spanner::Admin::Instance.instance_adminproject_path=instance_admin_client.project_pathproject:project_idbase_instance_config=instance_admin_client.get_instance_configname:base_config_id# The replicas for the custom instance configuration must include all the replicas of the base# configuration, in addition to at least one from the list of optional replicas of the base# configuration.custom_replicas=base_instance_config.replicas.mapdo|replica|replicaendcustom_replicas << base_instance_config.optional_replicas[0]custom_instance_config_id=instance_admin_client.instance_config_path\project:project_id,instance_config:user_config_namecustom_instance_config={name:custom_instance_config_id,display_name:"custom-ruby-samples",config_type::USER_MANAGED,replicas:custom_replicas,base_config:base_config_id,labels:{ruby_cloud_spanner_samples:"true"}}request={parent:project_path,# Custom config names must start with the prefix “custom-”.instance_config_id:user_config_name,instance_config:custom_instance_config}job=instance_admin_client.create_instance_configrequestputs"Waiting for create instance config operation to complete"job.wait_until_done!ifjob.error?putsjob.errorelseputs"Created instance configuration #{user_config_name}"endend
Create an instance in a custom instance configuration
You can create an instance in a custom instance configuration.
You can change the display name and labels of a custom instance configuration.
You cannot change or update the replicas of your custom instance configuration.
However, you can create a new custom instance configuration with additional
replicas, then move your instance to the new
custom instance configuration with your chosen additional replicas. For example,
if your instance is in regional-us-central1 and you want to add a read-only
replica us-west1, then you need to create a new custom instance
configuration with regional-us-central1 as the base configuration and add
us-west1 as a read-only replica. Then move your instance
to this new custom instance configuration.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-06-09 UTC."],[],[]]