in compute/address/assign_static_address_to_existing_vm.go [31:119]
func assignStaticAddressToExistingVM(w io.Writer, projectID, zone, instanceName, IPAddress, networkInterfaceName string) error {
// projectID := "your_project_id"
// zone := "europe-central2-b"
// instanceName := "your_instance_name"
// IPAddress := "34.111.222.333"
// networkInterfaceName := "nic0"
ctx := context.Background()
instancesClient, err := compute.NewInstancesRESTClient(ctx)
if err != nil {
return fmt.Errorf("NewInstancesRESTClient: %w", err)
}
defer instancesClient.Close()
reqGet := &computepb.GetInstanceRequest{
Project: projectID,
Zone: zone,
Instance: instanceName,
}
instance, err := instancesClient.Get(ctx, reqGet)
if err != nil {
return fmt.Errorf("could not get instance: %w", err)
}
var networkInterface *computepb.NetworkInterface
for _, ni := range instance.NetworkInterfaces {
if *ni.Name == networkInterfaceName {
networkInterface = ni
break
}
}
if networkInterface == nil {
return fmt.Errorf("No network interface named '%s' found on instance %s", networkInterfaceName, instanceName)
}
var accessConfig *computepb.AccessConfig
for _, ac := range networkInterface.AccessConfigs {
if *ac.Type == computepb.AccessConfig_ONE_TO_ONE_NAT.String() {
accessConfig = ac
break
}
}
if accessConfig != nil {
// network interface is immutable - deletion stage is required in case of any assigned ip (static or ephemeral).
reqDelete := &computepb.DeleteAccessConfigInstanceRequest{
Project: projectID,
Zone: zone,
Instance: instanceName,
AccessConfig: *accessConfig.Name,
NetworkInterface: networkInterfaceName,
}
opDelete, err := instancesClient.DeleteAccessConfig(ctx, reqDelete)
if err != nil {
return fmt.Errorf("unable to delete access config: %w", err)
}
if err = opDelete.Wait(ctx); err != nil {
return fmt.Errorf("unable to wait for the operation: %w", err)
}
}
reqAdd := &computepb.AddAccessConfigInstanceRequest{
Project: projectID,
Zone: zone,
Instance: instanceName,
AccessConfigResource: &computepb.AccessConfig{
NatIP: &IPAddress,
Type: proto.String(computepb.AccessConfig_ONE_TO_ONE_NAT.String()),
},
NetworkInterface: networkInterfaceName,
}
opAdd, err := instancesClient.AddAccessConfig(ctx, reqAdd)
if err != nil {
return fmt.Errorf("unable to add access config: %w", err)
}
if err = opAdd.Wait(ctx); err != nil {
return fmt.Errorf("unable to wait for the operation: %w", err)
}
fmt.Fprintf(w, "Static address %s assigned to the instance %s\n", IPAddress, instanceName)
return nil
}