Mengonfigurasi alamat IP eksternal statis


Anda dapat menetapkan alamat IP eksternal statis ke instance virtual machine (VM) dan instance bare metal. Anda juga dapat mengubah, mencantumkan, dan merilis alamat IP statis untuk instance. Untuk mencadangkan alamat IP eksternal statis, lihat Mencadangkan alamat IP eksternal statis.

Alamat IP eksternal dapat bersifat statis atau sementara. Jika instance memerlukan alamat IP eksternal tetap yang tidak berubah, lakukan langkah-langkah berikut:

  1. Dapatkan alamat IP eksternal statis. Anda dapat mencadangkan alamat IP eksternal baru atau mempromosikan alamat IP eksternal sementara yang sudah ada.
  2. Tetapkan alamat IP yang dicadangkan ke instance yang ada, atau tetapkan saat membuat instance baru.

Jika memerlukan alamat IP statis di jaringan Compute Engine internal, lihat Mencadangkan alamat IP internal statis.

Untuk informasi tentang cara mencadangkan alamat IP eksternal statis atau membuat alamat IP eksternal global, lihat Mencadangkan alamat IP eksternal statis.

Sebelum memulai

  • Baca tentang alamat IP.
  • Baca kuota dan batas untuk alamat IP eksternal statis.
  • Baca tentang harga alamat IP eksternal.
  • Jika Anda belum melakukannya, siapkan autentikasi. Autentikasi adalah proses verifikasi identitas Anda untuk mengakses layanan dan API Google Cloud . Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat mengautentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      Untuk menggunakan contoh Terraform di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      REST

      Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Untuk informasi selengkapnya, lihat Mengautentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud .

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna mengonfigurasi dan mengelola alamat IP statis, minta administrator untuk memberi Anda peran IAM berikut di project Anda:

Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk mengonfigurasi dan mengelola alamat IP statis. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk mengonfigurasi dan mengelola alamat IP statis:

  • compute.instances.update pada instance
  • compute.instances.updateNetworkInterface pada instance
  • compute.instances.addAccessConfig pada instance
  • compute.instances.deleteAccessConfig pada instance
  • compute.networks.list di jaringan
  • compute.subnetworks.use di subnet
  • compute.subnetworks.list di subnet
  • Untuk membuat instance:
    • compute.instances.create pada project
    • Untuk menggunakan image kustom guna membuat VM: compute.images.useReadOnly pada image
    • Untuk menggunakan snapshot guna membuat VM: compute.snapshots.useReadOnly pada snapshot
    • Untuk menggunakan template instance guna membuat VM: compute.instanceTemplates.useReadOnly di template instance
    • Untuk menetapkan jaringan lama ke VM: compute.networks.use di project
    • Untuk menentukan alamat IP statis untuk VM: compute.addresses.use pada project
    • Untuk menetapkan alamat IP eksternal ke VM saat menggunakan jaringan lama: compute.networks.useExternalIp di project
    • Untuk menentukan subnet bagi VM: compute.subnetworks.use di project atau di subnet yang dipilih
    • Untuk menetapkan alamat IP eksternal ke VM saat menggunakan jaringan VPC: compute.subnetworks.useExternalIp di project atau di subnet yang dipilih
    • Untuk menetapkan metadata instance VM untuk VM: compute.instances.setMetadata di project
    • Untuk menetapkan tag untuk VM: compute.instances.setTags di VM
    • Untuk menetapkan label untuk VM: compute.instances.setLabels di VM
    • Untuk menetapkan akun layanan yang akan digunakan VM: compute.instances.setServiceAccount di VM
    • Untuk membuat disk baru bagi VM: compute.disks.create pada project
    • Untuk memasang disk yang ada dalam mode hanya baca atau baca-tulis: compute.disks.use pada disk
    • Untuk memasang disk yang ada dalam mode hanya baca: compute.disks.useReadOnly pada disk

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Batasan

  • Hanya satu resource dalam satu waktu yang dapat menggunakan alamat IP eksternal statis.

  • Tidak ada cara untuk memeriksa apakah alamat IP bersifat statis atau sementara setelah ditetapkan ke resource. Anda dapat membandingkan alamat IP dengan daftar alamat IP eksternal statis yang dicadangkan untuk project tersebut. Gunakan sub-perintah gcloud compute addresses list untuk melihat daftar alamat IP eksternal statis yang tersedia untuk project.

  • Setiap VM dapat memiliki beberapa antarmuka jaringan, dan setiap antarmuka dapat memiliki alamat IP berikut yang ditetapkan sesuai dengan jenis stack-nya:

    • Antarmuka khusus IPv4:
      • Alamat IPv4 internal (wajib)
      • Alamat IPv4 eksternal (opsional)
    • Antarmuka stack ganda (IPv4 dan IPv6):
      • Alamat IPv4 internal (wajib)
      • Alamat IPv4 eksternal (opsional)
      • Rentang alamat IPv6 /96, baik internal maupun eksternal, tetapi tidak keduanya (wajib)
    • Antarmuka khusus IPv6 (Pratinjau):
      • Rentang alamat IPv6 /96, baik internal maupun eksternal, tetapi tidak keduanya (wajib)
  • Anda tidak dapat membatalkan penetapan atau mengubah alamat IPv6 eksternal VM dengan antarmuka jaringan khusus IPv6. Namun, Anda dapat mempromosikan alamat IP eksternal sementara dari sebuah resource menjadi alamat IP eksternal statis, sehingga alamat tersebut tetap dipertahankan bahkan setelah resource dihapus.

  • Anda tidak dapat mengubah nama alamat IP statis.

Catatan: Antarmuka jaringan dapat menerima traffic dari beberapa aturan penerusan, yang mungkin menyalurkan alamat IP eksternal lainnya. Sejumlah alamat IP eksternal dapat mereferensikan antarmuka jaringan melalui aturan penerusan ini, tetapi setiap antarmuka jaringan hanya dapat ditetapkan satu alamat IPv4 eksternal dan satu rentang alamat IPv6 /96 eksternal.

Untuk mengetahui informasi selengkapnya tentang aturan penerusan dan load balancing, baca dokumentasi load balancing.

Melihat alamat IP eksternal statis yang tersedia

Untuk mencantumkan alamat IP eksternal statis yang telah dicadangkan untuk project Anda, ikuti langkah-langkah berikut.

Konsol

  1. Di konsol Google Cloud , buka halaman IP addresses.

    Buka IP addresses

  2. Klik Alamat IP eksternal.

gcloud

Gunakan perintah gcloud compute addresses list:

  • Untuk menampilkan semua alamat IP, gunakan perintah berikut:

    gcloud compute addresses list
  • Untuk menampilkan daftar semua alamat IP global, gunakan perintah berikut:

    gcloud compute addresses list --global
  • Untuk menampilkan daftar semua alamat IP regional di region tertentu, gunakan perintah berikut:

    gcloud compute addresses list \
        --regions=REGION
    

    Ganti REGION dengan region yang alamatnya ingin Anda cantumkan. Anda dapat mencantumkan alamat beberapa region dengan menentukan nama region yang dipisahkan koma:

    gcloud compute addresses list \
        --regions=REGION1,REGION2,..REGION_n_
    

API

  • Untuk mencantumkan alamat IPv4 atau IPv6 regional, panggil metode addresses.list:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses
    

    Ganti kode berikut:

    • PROJECT_ID: project ID untuk permintaan ini
    • REGION: nama region untuk permintaan ini
  • Untuk menampilkan daftar semua alamat di semua region, panggil metode addresses.aggregatedList:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/addresses
    
  • Untuk mencantumkan alamat IPv4 atau IPv6 global, panggil metode globalAddresses.list:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    

    Ganti kode berikut:

    PROJECT_ID: project ID untuk permintaan ini

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"google.golang.org/api/iterator"

	"cloud.google.com/go/compute/apiv1/computepb"
)

// listRegionalExternal retrieves list external IP addresses in Google Cloud Platform region.
func listRegionalExternal(w io.Writer, projectID, region string) ([]*computepb.Address, error) {
	// projectID := "your_project_id"
	// region := "europe-west3"

	ctx := context.Background()
	// Create the service client.
	addressesClient, err := compute.NewAddressesRESTClient(ctx)
	if err != nil {
		return nil, err
	}
	defer addressesClient.Close()

	// Build the request.
	req := &computepb.ListAddressesRequest{
		Project: projectID,
		Region:  region,
	}

	// List the addresses.
	it := addressesClient.List(ctx, req)

	// Iterate over the results.
	var addresses []*computepb.Address
	for {
		address, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, err
		}
		addresses = append(addresses, address)
	}

	// Print the addresses.
	fmt.Fprint(w, "Fetched addresses: \n")
	for _, address := range addresses {
		fmt.Fprintf(w, "%s\n", *address.Name)
	}

	return addresses, nil
}

// listGlobalExternal retrieves list external global IP addresses in Google Cloud Platform.
func listGlobalExternal(w io.Writer, projectID string) ([]*computepb.Address, error) {
	// projectID := "your_project_id"

	ctx := context.Background()
	// Create the service client.
	addressesClient, err := compute.NewGlobalAddressesRESTClient(ctx)
	if err != nil {
		return nil, err
	}
	defer addressesClient.Close()

	// Build the request.
	req := &computepb.ListGlobalAddressesRequest{
		Project: projectID,
	}

	// List the addresses.
	it := addressesClient.List(ctx, req)

	// Iterate over the results.
	var addresses []*computepb.Address
	for {
		address, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, err
		}
		addresses = append(addresses, address)
	}

	// Print the addresses.
	fmt.Fprint(w, "Fetched addresses: \n")
	for _, address := range addresses {
		fmt.Fprintf(w, "%s\n", *address.Name)
	}

	return addresses, nil
}

Java


import com.google.cloud.compute.v1.Address;
import com.google.cloud.compute.v1.AddressesClient;
import com.google.cloud.compute.v1.GlobalAddressesClient;
import com.google.cloud.compute.v1.ListAddressesRequest;
import com.google.cloud.compute.v1.ListGlobalAddressesRequest;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class ListStaticExternalIp {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Region where the VM and IP is located.
    String region = "your-region-id";

    listStaticExternalIp(projectId, region);
  }

  // Lists all static external IP addresses, either regional or global.
  public static List<Address> listStaticExternalIp(String projectId, String region)
          throws IOException {
    // Use regional client if a region is specified
    if (region != null) {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (AddressesClient client = AddressesClient.create()) {
        ListAddressesRequest request = ListAddressesRequest.newBuilder()
                .setProject(projectId)
                .setRegion(region)
                .build();

        return Lists.newArrayList(client.list(request).iterateAll());
      }
    } else {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (GlobalAddressesClient client = GlobalAddressesClient.create()) {
        ListGlobalAddressesRequest request = ListGlobalAddressesRequest.newBuilder()
                .setProject(projectId)
                .build();

        return Lists.newArrayList(client.list(request).iterateAll());
      }
    }
  }
}

Python

from typing import List, Optional

from google.cloud.compute_v1.services.addresses.client import AddressesClient
from google.cloud.compute_v1.services.global_addresses import GlobalAddressesClient
from google.cloud.compute_v1.types import Address


def list_static_ip_addresses(
    project_id: str, region: Optional[str] = None
) -> List[Address]:
    """
    Lists all static external IP addresses, either regional or global.

    Args:
    project_id (str): project ID.
    region (Optional[str]): The region of the IP addresses if regional. None if global.

    Returns:
    List[Address]: A list of Address objects containing details about the requested IPs.
    """
    if region:
        # Use regional client if a region is specified
        client = AddressesClient()
        addresses_iterator = client.list(project=project_id, region=region)
    else:
        # Use global client if no region is specified
        client = GlobalAddressesClient()
        addresses_iterator = client.list(project=project_id)

    return list(addresses_iterator)  # Convert the iterator to a list to return

Mengonfigurasi alamat IP eksternal statis

Bagian berikut menjelaskan cara mengonfigurasi alamat IP eksternal statis untuk instance Anda.

Membuat instance yang menggunakan alamat IP eksternal statis

Setelah mencadangkan alamat IP eksternal statis, Anda dapat menetapkannya ke instance.

Konsol

  1. Di konsol Google Cloud , buka halaman Create an instance.

    Buka halaman Buat instance

  2. Tentukan detail instance.

  3. Luaskan bagian Advanced options.

  4. Luaskan bagian Networking.

  5. Di bagian Network interfaces, luaskan antarmuka jaringan untuk mengeditnya.

  6. Untuk menetapkan alamat IPv4, lakukan hal berikut:

    1. Pilih jaringan.
    2. Pilih alamat IP dari daftar External IPv4 address.
  7. Untuk menetapkan alamat IPv6, lakukan hal berikut:

    1. Pilih jaringan yang berisi subnet dengan rentang alamat IPv6 eksternal.
    2. Pilih subnet dari daftar Subnetwork.
    3. Untuk IP stack type, pilih IPv4 and IPv6 (dual-stack) atau IPv6 (single-stack).
    4. Pilih alamat IPv6 eksternal yang baru dicadangkan dari daftar External IPv6 address. Atau, pilih Cadangkan alamat IPv6 eksternal statis dan cadangkan alamat IPv6 eksternal statis yang baru.
    5. Untuk Network Service Tier, pilih Premium.
  8. Untuk menyelesaikan modifikasi antarmuka jaringan default, klik Selesai.

  9. Lanjutkan dengan proses pembuatan instance.

gcloud

Anda dapat membuat instance dan menetapkan alamat IP eksternal regional statis yang telah dicadangkan.

  • Untuk menetapkan alamat IPv4 eksternal statis, lakukan hal berikut:

    gcloud compute instances create INSTANCE_NAME \
        --zone=ZONE \
        --address=IPV4_ADDRESS
    
  • Untuk menetapkan alamat IPv6 eksternal statis, lakukan hal berikut:

    gcloud compute instances create INSTANCE_NAME \
        --zone=ZONE \
        --subnet=SUBNET \
        --stack-type=STACK_TYPE \
        --external-ipv6-address=IPV6_ADDRESS \
        --external-ipv6-prefix-length=96 \
        --ipv6-network-tier=PREMIUM
    

    Ganti kode berikut:

    • INSTANCE_NAME: nama instance compute.
    • ZONE: zona tempat instance dibuat
    • IPV4_ADDRESS: alamat IPv4 yang akan ditetapkan ke instance. Gunakan alamat IP eksternal statis yang dicadangkan, bukan nama alamat.
    • SUBNET: subnet yang berisi alamat IPv6 eksternal
    • STACK_TYPE: jenis stack untuk instance, IPV4_IPV6 (dual-stack) atau IPV6_ONLY
    • IPV6_ADDRESS: alamat IPv6 yang akan ditetapkan ke instance. Gunakan alamat IP eksternal statis yang dicadangkan, bukan nama alamat.

Terraform

Anda dapat menggunakan resource google_compute_instance untuk menetapkan alamat IP eksternal.

resource "google_compute_instance" "default" {
  name         = "dns-proxy-nfs"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "ubuntu-1404-trusty-v20160627"
    }
  }

  network_interface {
    network = "default"
    access_config {
      nat_ip = google_compute_address.default.address
    }
  }
}

REST

  • Untuk menetapkan alamat IPv4 eksternal statis ke instance komputasi baru, lakukan hal berikut:

    Dalam permintaan Anda untuk membuat instance baru, secara eksplisit berikan properti networkInterfaces[].accessConfigs[].natIP dan alamat IPv4 eksternal yang ingin Anda gunakan, misalnya:

    {
      "name": "INSTANCE_NAME",
      "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
      "networkInterfaces": [{
          "accessConfigs": [{
            "type": "ONE_TO_ONE_NAT",
            "name": "External NAT",
            "natIP": "IPV4_ADDRESS"
          }],
          "network": "global/networks/default"
      }],
      "disks": [{
          "autoDelete": "true",
            "boot": "true",
            "type": "PERSISTENT",
            "initializeParams": {
                "sourceImage": "SOURCE_IMAGE"
             }
      }]
    }
    

    Ganti kode berikut:

    • INSTANCE_NAME: nama instance compute
    • ZONE: zona tempat instance dibuat
    • MACHINE_TYPE: Opsional: URL lengkap atau sebagian dari resource jenis mesin yang akan digunakan saat membuat instance, dalam format: zones/ZONE/machineTypes/MACHINE_TYPE
    • IPV4_ADDRESS: alamat IPv4 yang akan ditetapkan ke instance. Gunakan alamat IP eksternal statis yang dicadangkan, bukan nama alamat.
    • SOURCE_IMAGE: versi tertentu dari image publik, seperti projects/debian-cloud/global/images/debian-10-buster-v20200309 atau kelompok image, seperti projects/debian-cloud/global/images/family/debian-10
  • Untuk menetapkan alamat IPv6 eksternal statis ke instance baru, lakukan hal berikut:

    Dalam permintaan Anda untuk membuat instance baru, secara eksplisit berikan properti networkInterfaces[].ipv6AccessConfigs[].externalIpv6 dan alamat IPv6 eksternal yang ingin Anda gunakan, misalnya:

    {
      "name": "INSTANCE_NAME",
      "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
      "networkInterfaces": [{
              "ipv6AccessConfigs": [{
             "externalIpv6": "IPV6_ADDRESS",
             "externalIpv6PrefixLength": 96,
             "name": "external-ipv6-access-config",
             "networkTier": "PREMIUM",
             "type": "DIRECT_IPV6"
              }],
          "stackType": "STACK_TYPE",
          "subnetwork":"SUBNETWORK"
      }],
      "disks": [{
          "autoDelete": "true",
          "boot": "true",
          "mode": "READ_WRITE",
          "type": "PERSISTENT",
          "initializeParams": {
              "sourceImage": "SOURCE_IMAGE"
          },
      }],
    }
    

    Ganti kode berikut:

    • INSTANCE_NAME: nama instance compute
    • ZONE: zona tempat instance dibuat
    • MACHINE_TYPE: Opsional: URL lengkap atau sebagian dari resource jenis mesin yang akan digunakan saat membuat instance, dalam format: zones/ZONE/machineTypes/MACHINE_TYPE
    • IPV6_ADDRESS: alamat IPv6 yang akan ditetapkan ke instance. Gunakan alamat IP eksternal statis yang dicadangkan, bukan nama alamat.
    • STACK_TYPE: jenis stack untuk instance, baik IPV4_IPV6 (stack ganda) atau IPV6_ONLY
    • SUBNET: subnet yang berisi alamat IPv6 eksternal
    • SOURCE_IMAGE: versi tertentu dari image publik, seperti "projects/debian-cloud/global/images/debian-10-buster-v20200309" atau kelompok image, seperti "projects/debian-cloud/global/images/family/debian-10"

Go


// assignStaticExternalToNewVM creates a new VM instance and assigns a static external IP address to it.
// NOTE: ip address is expected to exist and be located in the same region as new VM
func assignStaticExternalToNewVM(w io.Writer, projectID, zone, instanceName, ipAddress string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	// ipAddress := 301.222.11.123

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	imagesClient, err := compute.NewImagesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewImagesRESTClient: %w", err)
	}
	defer imagesClient.Close()

	// List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details.
	newestDebianReq := &computepb.GetFromFamilyImageRequest{
		Project: "debian-cloud",
		Family:  "debian-12",
	}
	newestDebian, err := imagesClient.GetFromFamily(ctx, newestDebianReq)
	if err != nil {
		return fmt.Errorf("unable to get image from family: %w", err)
	}

	req := &computepb.InsertInstanceRequest{
		Project: projectID,
		Zone:    zone,
		InstanceResource: &computepb.Instance{
			Name: proto.String(instanceName),
			Disks: []*computepb.AttachedDisk{
				{
					InitializeParams: &computepb.AttachedDiskInitializeParams{
						DiskSizeGb:  proto.Int64(10),
						SourceImage: newestDebian.SelfLink,
						DiskType:    proto.String(fmt.Sprintf("zones/%s/diskTypes/pd-standard", zone)),
					},
					AutoDelete: proto.Bool(true),
					Boot:       proto.Bool(true),
					Type:       proto.String(computepb.AttachedDisk_PERSISTENT.String()),
				},
			},
			MachineType: proto.String(fmt.Sprintf("zones/%s/machineTypes/n1-standard-1", zone)),
			NetworkInterfaces: []*computepb.NetworkInterface{
				{
					AccessConfigs: []*computepb.AccessConfig{
						{
							Type:        proto.String(computepb.AccessConfig_ONE_TO_ONE_NAT.String()),
							Name:        proto.String("External NAT"),
							NetworkTier: proto.String(computepb.AccessConfig_PREMIUM.String()),
							NatIP:       proto.String(ipAddress),
						},
					},
				},
			},
		},
	}

	op, err := instancesClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create instance: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Static address %s assigned to new VM", ipAddress)

	return nil
}

Java


import com.google.cloud.compute.v1.AccessConfig;
import com.google.cloud.compute.v1.AccessConfig.Type;
import com.google.cloud.compute.v1.Address.NetworkTier;
import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
import com.google.cloud.compute.v1.GetInstanceRequest;
import com.google.cloud.compute.v1.ImagesClient;
import com.google.cloud.compute.v1.InsertInstanceRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class AssignStaticExternalNewVmAddress {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Instance ID of the Google Cloud project you want to use.
    String instanceId = "your-instance-id";
    // Name of the zone to create the instance in. For example: "us-west3-b"
    String zone = "your-zone-id";
    // machine type of the VM being created. This value uses the
    // following format: "zones/{zone}/machineTypes/{type_name}".
    // For example: "zones/europe-west3-c/machineTypes/f1-micro"
    String machineType = String.format("zones/%s/machineTypes/{your-machineType-id}", zone);
    // boolean flag indicating if the instance should have an external IPv4 address assigned.
    boolean externalAccess = true;
    // external IPv4 address to be assigned to this instance. If you specify
    // an external IP address, it must live in the same region as the zone of the instance.
    // This setting requires `external_access` to be set to True to work.
    String externalIpv4 = "your-externalIpv4-id";

    assignStaticExternalNewVmAddress(projectId, instanceId, zone,
            externalAccess, machineType, externalIpv4);
  }

  // Create a new VM instance with assigned static external IP address.
  public static Instance assignStaticExternalNewVmAddress(String projectId, String instanceName,
                                                          String zone, boolean externalAccess,
                                                          String machineType, String externalIpv4)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    String sourceImage;
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ImagesClient imagesClient = ImagesClient.create()) {
      sourceImage = imagesClient.getFromFamily("debian-cloud", "debian-11").getSelfLink();
    }
    AttachedDisk attachedDisk = buildAttachedDisk(sourceImage, zone);

    return createInstance(projectId, instanceName, zone,
            attachedDisk, machineType, externalAccess, externalIpv4);
  }

  private static AttachedDisk buildAttachedDisk(String sourceImage, String zone) {
    AttachedDiskInitializeParams initializeParams = AttachedDiskInitializeParams.newBuilder()
            .setSourceImage(sourceImage)
            .setDiskSizeGb(10)
            .setDiskType(String.format("zones/%s/diskTypes/pd-standard", zone))
            .build();

    return AttachedDisk.newBuilder()
            .setInitializeParams(initializeParams)
            // Remember to set auto_delete to True if you want the disk to be deleted
            // when you delete your VM instance.
            .setAutoDelete(true)
            .setBoot(true)
            .build();
  }

  // Send an instance creation request to the Compute Engine API and wait for it to complete.
  private static Instance createInstance(String projectId, String instanceName,
                                         String zone, AttachedDisk disks,
                                         String machineType, boolean externalAccess,
                                         String externalIpv4)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (InstancesClient client = InstancesClient.create()) {
      Instance instanceResource =
              buildInstanceResource(instanceName, disks, machineType, externalAccess, externalIpv4);

      InsertInstanceRequest build = InsertInstanceRequest.newBuilder()
              .setProject(projectId)
              .setRequestId(UUID.randomUUID().toString())
              .setZone(zone)
              .setInstanceResource(instanceResource)
              .build();
      client.insertCallable().futureCall(build).get(60, TimeUnit.SECONDS);

      GetInstanceRequest getInstanceRequest = GetInstanceRequest.newBuilder()
              .setInstance(instanceName)
              .setProject(projectId)
              .setZone(zone)
              .build();

      return client.get(getInstanceRequest);
    }
  }

  private static Instance buildInstanceResource(String instanceName, AttachedDisk disk,
                                                String machineType, boolean externalAccess,
                                                String externalIpv4) {
    NetworkInterface networkInterface =
            networkInterface(externalAccess, externalIpv4);

    return Instance.newBuilder()
            .setName(instanceName)
            .addDisks(disk)
            .setMachineType(machineType)
            .addNetworkInterfaces(networkInterface)
            .build();
  }

  private static NetworkInterface networkInterface(boolean externalAccess, String externalIpv4) {
    NetworkInterface.Builder build = NetworkInterface.newBuilder()
            .setNetwork("global/networks/default");
    if (externalAccess) {
      AccessConfig.Builder accessConfig = AccessConfig.newBuilder()
              .setType(Type.ONE_TO_ONE_NAT.name())
              .setName("External NAT")
              .setNetworkTier(NetworkTier.PREMIUM.name());
      if (externalIpv4 != null) {
        accessConfig.setNatIP(externalIpv4);
      }
      build.addAccessConfigs(accessConfig.build());
    }

    return build.build();
  }
}

Python

from __future__ import annotations

import re
import sys
from typing import Any
import warnings

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def get_image_from_family(project: str, family: str) -> compute_v1.Image:
    """
    Retrieve the newest image that is part of a given family in a project.

    Args:
        project: project ID or project number of the Cloud project you want to get image from.
        family: name of the image family you want to get image from.

    Returns:
        An Image object.
    """
    image_client = compute_v1.ImagesClient()
    # List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details
    newest_image = image_client.get_from_family(project=project, family=family)
    return newest_image


def disk_from_image(
    disk_type: str,
    disk_size_gb: int,
    boot: bool,
    source_image: str,
    auto_delete: bool = True,
) -> compute_v1.AttachedDisk:
    """
    Create an AttachedDisk object to be used in VM instance creation. Uses an image as the
    source for the new disk.

    Args:
         disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        boot: boolean flag indicating whether this disk should be used as a boot disk of an instance
        source_image: source image to use when creating this disk. You must have read access to this disk. This can be one
            of the publicly available images or an image from one of your projects.
            This value uses the following format: "projects/{project_name}/global/images/{image_name}"
        auto_delete: boolean flag indicating whether this disk should be deleted with the VM that uses it

    Returns:
        AttachedDisk object configured to be created using the specified image.
    """
    boot_disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = source_image
    initialize_params.disk_size_gb = disk_size_gb
    initialize_params.disk_type = disk_type
    boot_disk.initialize_params = initialize_params
    # Remember to set auto_delete to True if you want the disk to be deleted when you delete
    # your VM instance.
    boot_disk.auto_delete = auto_delete
    boot_disk.boot = boot
    return boot_disk


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_instance(
    project_id: str,
    zone: str,
    instance_name: str,
    disks: list[compute_v1.AttachedDisk],
    machine_type: str = "n1-standard-1",
    network_link: str = "global/networks/default",
    subnetwork_link: str = None,
    internal_ip: str = None,
    external_access: bool = False,
    external_ipv4: str = None,
    accelerators: list[compute_v1.AcceleratorConfig] = None,
    preemptible: bool = False,
    spot: bool = False,
    instance_termination_action: str = "STOP",
    custom_hostname: str = None,
    delete_protection: bool = False,
) -> compute_v1.Instance:
    """
    Send an instance creation request to the Compute Engine API and wait for it to complete.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.
        disks: a list of compute_v1.AttachedDisk objects describing the disks
            you want to attach to your new instance.
        machine_type: machine type of the VM being created. This value uses the
            following format: "zones/{zone}/machineTypes/{type_name}".
            For example: "zones/europe-west3-c/machineTypes/f1-micro"
        network_link: name of the network you want the new instance to use.
            For example: "global/networks/default" represents the network
            named "default", which is created automatically for each project.
        subnetwork_link: name of the subnetwork you want the new instance to use.
            This value uses the following format:
            "regions/{region}/subnetworks/{subnetwork_name}"
        internal_ip: internal IP address you want to assign to the new instance.
            By default, a free address from the pool of available internal IP addresses of
            used subnet will be used.
        external_access: boolean flag indicating if the instance should have an external IPv4
            address assigned.
        external_ipv4: external IPv4 address to be assigned to this instance. If you specify
            an external IP address, it must live in the same region as the zone of the instance.
            This setting requires `external_access` to be set to True to work.
        accelerators: a list of AcceleratorConfig objects describing the accelerators that will
            be attached to the new instance.
        preemptible: boolean value indicating if the new instance should be preemptible
            or not. Preemptible VMs have been deprecated and you should now use Spot VMs.
        spot: boolean value indicating if the new instance should be a Spot VM or not.
        instance_termination_action: What action should be taken once a Spot VM is terminated.
            Possible values: "STOP", "DELETE"
        custom_hostname: Custom hostname of the new VM instance.
            Custom hostnames must conform to RFC 1035 requirements for valid hostnames.
        delete_protection: boolean value indicating if the new virtual machine should be
            protected against deletion or not.
    Returns:
        Instance object.
    """
    instance_client = compute_v1.InstancesClient()

    # Use the network interface provided in the network_link argument.
    network_interface = compute_v1.NetworkInterface()
    network_interface.network = network_link
    if subnetwork_link:
        network_interface.subnetwork = subnetwork_link

    if internal_ip:
        network_interface.network_i_p = internal_ip

    if external_access:
        access = compute_v1.AccessConfig()
        access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name
        access.name = "External NAT"
        access.network_tier = access.NetworkTier.PREMIUM.name
        if external_ipv4:
            access.nat_i_p = external_ipv4
        network_interface.access_configs = [access]

    # Collect information into the Instance object.
    instance = compute_v1.Instance()
    instance.network_interfaces = [network_interface]
    instance.name = instance_name
    instance.disks = disks
    if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):
        instance.machine_type = machine_type
    else:
        instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"

    instance.scheduling = compute_v1.Scheduling()
    if accelerators:
        instance.guest_accelerators = accelerators
        instance.scheduling.on_host_maintenance = (
            compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name
        )

    if preemptible:
        # Set the preemptible setting
        warnings.warn(
            "Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning
        )
        instance.scheduling = compute_v1.Scheduling()
        instance.scheduling.preemptible = True

    if spot:
        # Set the Spot VM setting
        instance.scheduling.provisioning_model = (
            compute_v1.Scheduling.ProvisioningModel.SPOT.name
        )
        instance.scheduling.instance_termination_action = instance_termination_action

    if custom_hostname is not None:
        # Set the custom hostname for the instance
        instance.hostname = custom_hostname

    if delete_protection:
        # Set the delete protection bit
        instance.deletion_protection = True

    # Prepare the request to insert an instance.
    request = compute_v1.InsertInstanceRequest()
    request.zone = zone
    request.project = project_id
    request.instance_resource = instance

    # Wait for the create operation to complete.
    print(f"Creating the {instance_name} instance in {zone}...")

    operation = instance_client.insert(request=request)

    wait_for_extended_operation(operation, "instance creation")

    print(f"Instance {instance_name} created.")
    return instance_client.get(project=project_id, zone=zone, instance=instance_name)


def assign_static_external_ip_to_new_vm(
    project_id: str, zone: str, instance_name: str, ip_address: str
) -> compute_v1.Instance:
    """
    Create a new VM instance with assigned static external IP address.

    Args:
        project_id (str): project ID or project number of the Cloud project you want to use.
        zone (str): name of the zone to create the instance in. For example: "us-west3-b"
        instance_name (str): name of the new virtual machine (VM) instance.
        ip_address(str): external address to be assigned to this instance. It must live in the same
        region as the zone of the instance and be precreated before function called.

    Returns:
        Instance object.
    """
    newest_debian = get_image_from_family(project="debian-cloud", family="debian-12")
    disk_type = f"zones/{zone}/diskTypes/pd-standard"
    disks = [disk_from_image(disk_type, 10, True, newest_debian.self_link, True)]
    instance = create_instance(
        project_id,
        zone,
        instance_name,
        disks,
        external_ipv4=ip_address,
        external_access=True,
    )
    return instance

Mengubah atau menetapkan alamat IP eksternal ke instance yang ada

Anda dapat mengubah atau menetapkan alamat IP eksternal, baik sementara maupun statis, ke instance IPv4 saja atau stack ganda yang ada. Prosedur ini tidak didukung untuk instance khusus IPv6.

Instance komputasi dapat memiliki beberapa antarmuka. Antarmuka satu stack dapat memiliki satu alamat IP eksternal. Antarmuka dual-stack dapat memiliki satu alamat IPv4 eksternal dan satu alamat IPv6 eksternal. Jika instance sudah memiliki alamat IP eksternal, Anda harus menghapus alamat tersebut terlebih dahulu. Kemudian, Anda dapat menetapkan alamat IP eksternal baru ke instance yang ada.

Konsol

  1. Di konsol Google Cloud , buka halaman Instance VM.

    Buka instance VM

  2. Klik nama instance yang ingin Anda tetapkan IP eksternal. Halaman Detail instance akan ditampilkan.

  3. Dari halaman Instance details, selesaikan langkah-langkah berikut:

    1. Klik Edit.
    2. Perluas Antarmuka jaringan.
    3. Pilih alamat IP eksternal yang diperlukan untuk ditetapkan ke instance. Jika instance hanya menggunakan IPv4 dan Anda ingin menetapkan alamat IPv6, Anda harus mengubah jenis stack menjadi stack ganda terlebih dahulu.
      1. Untuk External IPv4 address, pilih Ephemeral atau alamat IPv4 eksternal statis.
      2. Untuk External IPv6 address, pilih Ephemeral atau alamat IPv6 eksternal statis.
    4. Klik Done.
  4. Klik Save.

gcloud

  1. Opsional: Cadangkan alamat IP eksternal statis.

    Jika ingin menetapkan alamat IP eksternal statis, Anda harus mencadangkan alamat dan memastikan alamat tersebut tidak digunakan oleh resource lain. Jika perlu, ikuti petunjuk untuk memesan alamat IP eksternal statis baru atau untuk membatalkan penetapan alamat IP eksternal statis.

    Jika ingin menggunakan alamat IP eksternal sementara, Anda dapat melewati langkah ini, dan Compute Engine akan secara acak menetapkan alamat IP eksternal sementara.

  2. Hapus penetapan alamat IP yang ada, seperti yang dijelaskan dalam Membatalkan penetapan alamat IP eksternal statis.

  3. Tetapkan alamat IP eksternal baru.

    • Untuk menetapkan alamat IPv4, gunakan sub-perintah instances add-access-config:

      Catatan: Jangan ganti IP_ADDRESS dengan nama alamat IP statis. Anda harus menggunakan alamat IP yang sebenarnya.
      gcloud compute instances add-access-config INSTANCE_NAME \
        --access-config-name="ACCESS_CONFIG_NAME" --address=IP_ADDRESS
      

      Ganti kode berikut:

      • INSTANCE_NAME: nama instance.
      • ACCESS_CONFIG_NAME: nama untuk memanggil konfigurasi akses ini. Pastikan untuk menyertakan nama lengkap di antara tanda kutip.
      • IP_ADDRESS: alamat IP yang akan ditambahkan.

      Jika Anda ingin Compute Engine menetapkan alamat IP eksternal sementara dan bukan menggunakan alamat IP eksternal statis, hapus properti --address IP_ADDRESS:

      gcloud compute instances add-access-config INSTANCE_NAME \
        --access-config-name="ACCESS_CONFIG_NAME"
      
    • Untuk mengubah instance menjadi dual-stack dan menetapkan alamat IPv6, gunakan sub-perintah instance network-interfaces update:

      gcloud compute instances network-interfaces update INSTANCE_NAME \
        --network-interface=NIC \
        --ipv6-network-tier=PREMIUM \
        --stack-type=STACK_TYPE \
        --external-ipv6-address=IPV6_ADDRESS \
        --external-ipv6-prefix-length=96 \
        --zone=ZONE
      

      Ganti kode berikut:

      • INSTANCE_NAME: nama instance.
      • NIC: nama antarmuka jaringan.
      • STACK_TYPE: jenis stack untuk instance, yang harus berupa IPV4_IPV6. Anda tidak dapat mengubah jenis stack menjadi IPV6_ONLY.
      • IPV6_ADDRESS: alamat IPv6 yang akan ditetapkan ke instance. Tentukan alamat IPv6 pertama dalam rentang /96.
      • ZONE: zona instance.

REST

Anda dapat mengubah alamat IPv4 atau IPv6 eksternal instance dengan menambahkan konfigurasi akses baru untuk instance tersebut.

  1. Hapus penetapan alamat IP yang ada, seperti yang dijelaskan dalam Membatalkan penetapan alamat IP eksternal statis.

  2. Hapus konfigurasi akses yang ada dengan membuat permintaan POST ke metode instances.deleteAccessConfig.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/deleteAccessConfig
    
  3. Tambahkan konfigurasi akses baru ke antarmuka jaringan instance dengan membuat permintaan POST ke metode instances.addAccessConfig.

Go

import (
	"context"
	"fmt"
	"io"

	"google.golang.org/protobuf/proto"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// assignStaticAddressToExistingVM assigns a static external IP address to an existing VM instance.
// Note: VM and assigned IP must be in the same region.
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
}

Java


import com.google.cloud.compute.v1.AccessConfig;
import com.google.cloud.compute.v1.AccessConfig.Type;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class AssignStaticExistingVm {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Instance ID of the Google Cloud project you want to use.
    String instanceId = "your-instance-id";
    // Name of the zone to create the instance in. For example: "us-west3-b"
    String zone = "your-zone-id";
    // Name of the network interface to assign.
    String netInterfaceName = "your-netInterfaceName-id";

    assignStaticExistingVmAddress(projectId, instanceId, zone, netInterfaceName);
  }

  // Updates or creates an access configuration for a VM instance to assign a static external IP.
  // As network interface is immutable - deletion stage is required
  // in case of any assigned ip (static or ephemeral).
  // VM and ip address must be created before calling this function.
  // IMPORTANT: VM and assigned IP must be in the same region.
  public static Instance assignStaticExistingVmAddress(String projectId, String instanceId,
                                                       String zone, String netInterfaceName)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (InstancesClient client = InstancesClient.create()) {
      Instance instance = client.get(projectId, zone, instanceId);

      NetworkInterface networkInterface = null;
      for (NetworkInterface netInterface : instance.getNetworkInterfacesList()) {
        if (netInterface.getName().equals(netInterfaceName)) {
          networkInterface = netInterface;
          break;
        }
      }

      if (networkInterface == null) {
        throw new IllegalArgumentException(
                String.format(
                        "No '{network_interface_name}' variable found on instance %s.",
                        instanceId)
        );
      }
      AccessConfig accessConfig = null;
      for (AccessConfig config : networkInterface.getAccessConfigsList()) {
        if (config.getType().equals(Type.ONE_TO_ONE_NAT.name())) {
          accessConfig = config;
          break;
        }
      }

      if (accessConfig != null) {
        // Delete the existing access configuration first
        client.deleteAccessConfigAsync(projectId, zone, instanceId,
                        accessConfig.getName(), netInterfaceName)
                .get(30, TimeUnit.SECONDS);
      }

      // Add a new access configuration with the new IP
      AccessConfig newAccessConfig = AccessConfig.newBuilder()
              // Leave this field undefined to use an IP from a shared ephemeral IP address pool
              // .setNatIP(ipAddress)
              .setType(Type.ONE_TO_ONE_NAT.name())
              .setName("external-nat")
              .build();

      client.addAccessConfigAsync(projectId, zone, instanceId, netInterfaceName, newAccessConfig)
              .get(30, TimeUnit.SECONDS);

      // return updated instance
      return client.get(projectId, zone, instanceId);
    }
  }
}

Python

import uuid

from google.cloud.compute_v1 import InstancesClient
from google.cloud.compute_v1.types import AccessConfig
from google.cloud.compute_v1.types import AddAccessConfigInstanceRequest
from google.cloud.compute_v1.types import DeleteAccessConfigInstanceRequest


def assign_static_ip_to_existing_vm(
    project_id: str,
    zone: str,
    instance_name: str,
    ip_address: str,
    network_interface_name: str = "nic0",
):
    """
    Updates or creates an access configuration for a VM instance to assign a static external IP.
    As network interface is immutable - deletion stage is required in case of any assigned ip (static or ephemeral).
    VM and ip address must be created before calling this function.
    IMPORTANT: VM and assigned IP must be in the same region.

    Args:
        project_id (str): Project ID.
        zone (str): Zone where the VM is located.
        instance_name (str): Name of the VM instance.
        ip_address (str): New static external IP address to assign to the VM.
        network_interface_name (str): Name of the network interface to assign.

    Returns:
        google.cloud.compute_v1.types.Instance: Updated instance object.
    """
    client = InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)
    network_interface = next(
        (ni for ni in instance.network_interfaces if ni.name == network_interface_name),
        None,
    )

    if network_interface is None:
        raise ValueError(
            f"No network interface named '{network_interface_name}' found on instance {instance_name}."
        )

    access_config = next(
        (ac for ac in network_interface.access_configs if ac.type_ == "ONE_TO_ONE_NAT"),
        None,
    )

    if access_config:
        # Delete the existing access configuration first
        delete_request = DeleteAccessConfigInstanceRequest(
            project=project_id,
            zone=zone,
            instance=instance_name,
            access_config=access_config.name,
            network_interface=network_interface_name,
            request_id=str(uuid.uuid4()),
        )
        delete_operation = client.delete_access_config(delete_request)
        delete_operation.result()

    # Add a new access configuration with the new IP
    add_request = AddAccessConfigInstanceRequest(
        project=project_id,
        zone=zone,
        instance=instance_name,
        network_interface="nic0",
        access_config_resource=AccessConfig(
            nat_i_p=ip_address, type_="ONE_TO_ONE_NAT", name="external-nat"
        ),
        request_id=str(uuid.uuid4()),
    )
    add_operation = client.add_access_config(add_request)
    add_operation.result()

    updated_instance = client.get(project=project_id, zone=zone, instance=instance_name)
    return updated_instance

Membatasi alamat IP eksternal ke instance tertentu

Untuk workload tertentu, Anda mungkin memiliki persyaratan penting yang mencakup keamanan dan pembatasan jaringan. Misalnya, Anda mungkin ingin membatasi alamat IP eksternal sehingga hanya instance komputasi tertentu yang dapat menggunakannya. Opsi ini dapat membantu mencegah pemindahan data yang tidak sah atau mempertahankan isolasi jaringan. Dengan menggunakan Kebijakan Organisasi, Anda dapat membatasi alamat IP eksternal ke instance tertentu dengan batasan untuk mengontrol penggunaan alamat IP eksternal untuk instance Anda dalam suatu organisasi atau sebuah project.

Batasan untuk mengontrol alamat IP eksternal pada instance adalah:

constraints/compute.vmExternalIpAccess

Untuk menggunakan batasan ini, tentukan kebijakan dengan allowedList instance yang dapat memiliki alamat IP eksternal. Jika Anda tidak menentukan kebijakan, semua alamat IP eksternal diizinkan untuk semua instance. Saat kebijakan ini diterapkan, hanya instance yang tercantum dalam daftar allowedValues yang dapat diberi alamat IP eksternal, baik sementara maupun statis, dan instance Compute Engine lainnya di organisasi atau project yang tidak ditentukan secara eksplisit dalam kebijakan dilarang menggunakan alamat IP eksternal.

Instance diidentifikasi dalam daftar yang diizinkan dan ditolak menggunakan URI instance:

projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME

Spesifikasi untuk membatasi alamat IP eksternal

  • Anda hanya dapat menerapkan batasan daftar ini untuk instance.
  • Anda tidak dapat menerapkan batasan secara surut. Semua instance yang memiliki alamat IP eksternal sebelum Anda mengaktifkan kebijakan akan mempertahankan alamat IP eksternalnya.
  • Batasan ini menerima allowedList atau deniedList, tetapi tidak keduanya dalam kebijakan yang sama.
  • Pengelolaan dan pemeliharaan siklus proses dan integritas instance bergantung pada Anda atau administrator yang memiliki izin yang diperlukan. Batasan hanya memverifikasi URI instance, dan tidak mencegah instance dalam daftar yang diizinkan untuk diubah, dihapus, atau dibuat ulang.

Izin diperlukan untuk membatasi alamat IP eksternal

Untuk menetapkan batasan di level project atau organisasi, Anda harus telah diberi peran orgpolicy.policyAdmin di organisasi.

Menetapkan batasan kebijakan di tingkat organisasi

Konsol

  1. Buka halaman Kebijakan Organisasi.

    Buka Kebijakan Organisasi

  2. Jika perlu, pilih organisasi yang diperlukan dari menu drop-down project.
  3. Klik Menentukan IP eksternal yang diizinkan untuk instance VM.
  4. Klik Edit untuk mengedit kebijakan IP eksternal. Jika tidak dapat mengakses alat Edit, berarti Anda tidak memiliki izin yang tepat.
  5. Pilih Customize untuk menetapkan kebijakan organisasi untuk instance tertentu.

    Sesuaikan di halaman edit kebijakan organisasi.

  6. Pilih Penegakan kebijakan dan Jenis kebijakan yang diperlukan.

  7. Untuk Nilai kebijakan, pilih Kustom.

  8. Masukkan URI untuk instance. URI harus dalam format berikut:

    projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
    
  9. Klik New policy value dan masukkan URI untuk instance sesuai kebutuhan.

  10. Klik Simpan untuk menerapkan batasan.

gcloud

Untuk menetapkan batasan bagi akses IP eksternal, Anda memerlukan ID organisasi terlebih dahulu. Anda dapat menemukan ID organisasi dengan menjalankan perintah organizations list dan mencari ID numerik dalam respons:

gcloud organizations list

Gcloud CLI menampilkan daftar organisasi dalam format berikut:

DISPLAY_NAME               ID
example-organization1      29252605212
example-organization2      1234567890

Gunakan perintah gcloud resource-manager org-policies set-policy untuk menetapkan kebijakan. Anda harus menyediakan kebijakan Anda sebagai file JSON. Buat file JSON dalam format berikut:

{
"constraint": "constraints/compute.vmExternalIpAccess",
"listPolicy": {
  "allowedValues": [
     "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
     "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
     "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
  ]
 }
}

Ganti kode berikut:

  • PROJECT_ID: project ID untuk permintaan ini, seperti example-project. Perhatikan bahwa hal ini berbeda dengan menyiapkan kebijakan organisasi, yang memerlukan ID numerik organisasi.
  • ZONE: zona instance
  • INSTANCE_NAME: nama instance

Atau, Anda dapat menentukan daftar deniedValues untuk menunjukkan instance yang secara eksplisit ingin Anda larang memiliki alamat IP eksternal. Setiap instance yang tidak ada dalam daftar akan secara implisit diizinkan memiliki alamat IP eksternal. Anda hanya dapat menentukan salah satu dari allowedValues atau deniedValues, tetapi tidak keduanya.

Kemudian, teruskan file dengan permintaan Anda:

gcloud resource-manager org-policies set-policy MY_POLICY.JSON --organization=ORGANIZATION_ID

Ganti ORGANIZATION_ID dengan ID numerik organisasi.

Jika tidak ingin instance mana pun memiliki akses IP eksternal, Anda dapat menetapkan kebijakan dengan allValues ditetapkan ke DENY:

{
  "constraint": "constraints/compute.vmExternalIpAccess",
  "listPolicy": {
    "allValues": "DENY"
  }
}

REST

Gunakan setOrgPolicy() API untuk menentukan batasan Anda. Instance dalam daftar allowedValue yang Anda tentukan diizinkan memiliki alamat IP eksternal. Atau, Anda dapat menentukan daftar deniedValues untuk menyatakan instance yang secara eksplisit ingin Anda larang memiliki alamat IP eksternal. Setiap instance yang tidak ada dalam daftar akan secara implisit diizinkan memiliki alamat IP eksternal. Anda hanya dapat menentukan allowedValues atau deniedValues, tetapi tidak keduanya.

Misalnya, berikut adalah permintaan untuk menerapkan batasan compute.vmExternalIpAccess ke organisasi tempat instance dari project tertentu dalam organisasi diizinkan untuk memiliki alamat IP eksternal:

POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORGANIZATION_ID:setOrgPolicy

dengan ORGANIZATION_ID adalah ID numerik organisasi.

Sekarang, di isi permintaan, berikan kebijakan untuk batasan ini:

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allowedValues": [
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
        ]
      }
    }
 }

Jika tidak ingin instance mana pun memiliki akses IP eksternal, Anda dapat menetapkan kebijakan dengan allValues ditetapkan ke DENY:

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allValues": "DENY"
      }
    }
 }

Menetapkan kebijakan di level project

Menetapkan kebijakan di level project akan menggantikan kebijakan di level organisasi. Misalnya, jika tingkat organisasi memiliki example-vm-1 pada daftar allowedValues, tetapi kebijakan di level project memiliki instance yang sama di daftar deniedValues, instance tidak akan diizinkan memiliki alamat IP eksternal.

Konsol

Ikuti proses yang sama seperti yang didokumentasikan di bagian Menetapkan batasan kebijakan di tingkat organisasi, tetapi pilih project yang diinginkan dari pemilih project, bukan organisasi.

Pemilih project.

gcloud

Gunakan perintah gcloud resource-manager org-policies set-policy untuk menetapkan kebijakan. Anda harus menyediakan kebijakan Anda sebagai file JSON. Buat file JSON dalam format berikut:

{
 "constraint": "constraints/compute.vmExternalIpAccess",
 "listPolicy": {
  "allowedValues": [
   "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
  ]
 }
}

Ganti kode berikut:

  • PROJECT_ID: project ID untuk permintaan ini, seperti example-project. Perhatikan bahwa hal ini berbeda dengan menyiapkan kebijakan organisasi, yang memerlukan ID numerik organisasi.
  • ZONE: zona instance.
  • INSTANCE_NAME: nama instance.

Atau, Anda dapat menentukan daftar deniedValues instance yang secara eksplisit ingin Anda larang memiliki alamat IP eksternal. Setiap instance yang tidak ada dalam daftar akan secara implisit diizinkan memiliki alamat IP eksternal. Anda hanya dapat menentukan salah satu dari allowedValues atau deniedValues, tetapi tidak keduanya.

Kemudian, teruskan file dengan permintaan Anda:

gcloud resource-manager org-policies set-policy MY_POLICY.JSON --project=example-project

REST

Gunakan setOrgPolicy API untuk menentukan batasan Anda. Instance dalam daftar allowedValue yang Anda tentukan diizinkan memiliki alamat IP eksternal. Atau, Anda dapat menentukan daftar deniedValues untuk menyatakan instance yang secara eksplisit ingin Anda larang memiliki alamat IP eksternal. Setiap instance yang tidak ada dalam daftar secara implisit diizinkan untuk memiliki alamat IP eksternal. Anda hanya dapat menentukan allowedValues atau deniedValues, tetapi tidak keduanya.

Misalnya, berikut adalah permintaan untuk menetapkan batasan compute.vmExternalIpAccess pada project untuk mengizinkan instance tertentu memiliki alamat IP eksternal:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setOrgPolicy

Ganti PROJECT_ID dengan project ID untuk permintaan ini.

Isi permintaan berisi kebijakan untuk batasan ini:

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allowedValues": [
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
      ]
    }
  }
}

Praktik terbaik untuk membatasi alamat IP eksternal

  • Hindari penggunaan daftar deniedValues dengan batasan ini. Jika Anda menentukan nilai dalam daftar deniedValues, berarti hanya instance dalam daftar deniedValues yang dibatasi agar tidak menggunakan alamat IP eksternal. Hal ini dapat menjadi masalah keamanan jika Anda ingin mengontrol secara pasti instance mana yang dapat memiliki alamat IP eksternal. Jika Anda ingin menghapus instance tertentu dari daftar allowedValues, perbarui kebijakan yang ada untuk menghapus instance dari allowedList, bukan memasukkan instance ke dalam daftar deniedValues pada hierarki yang lebih rendah.

  • Jika Anda ingin menetapkan kebijakan pada sebagian besar hierarki resource tetapi mengecualikan project tertentu, pulihkan kebijakan default menggunakan metode setOrgPolicy dengan menentukan objek restoreDefault untuk mengizinkan semua instance dalam project dikaitkan dengan alamat IP eksternal. Kebijakan saat ini untuk project tidak terpengaruh oleh setelan default.

  • Gunakan kebijakan organisasi bersama dengan peran IAM untuk mengontrol lingkungan Anda dengan lebih baik. Kebijakan ini hanya berlaku untuk instance, tetapi jika Anda ingin mengontrol dan membatasi alamat IP eksternal dengan lebih baik pada perangkat jaringan, Anda dapat memberikan peran compute.networkAdmin kepada pihak yang sesuai.

  • Setiap layanan dan produk yang berjalan di Compute Engine dalam organisasi atau project yang mengaktifkan kebijakan tersebut tunduk pada kebijakan organisasi ini. Secara khusus, layanan seperti Google Kubernetes Engine, Dataflow, Dataproc, dan Cloud SQL terpengaruh oleh kebijakan ini. Jika ini menjadi masalah, Google merekomendasikan agar Anda menyiapkan layanan dan produk lain di project lain yang tidak menerapkan kebijakan organisasi, dan menggunakan VPC Bersama, jika diperlukan.

Mengelola alamat IP eksternal statis

Bagian berikut menjelaskan cara mengelola alamat IP eksternal statis untuk instance Anda.

Menentukan apakah alamat IP internal bersifat sementara atau statis

Alamat IP internal statis dan sementara berperilaku dan tampak sama dalam sebagian besar konteks. Namun, dengan alamat IP internal statis, Anda dapat menggunakan alamat IP yang sama untuk resource yang sama meskipun Anda menghapus dan membuat ulang resource. Secara umum, alamat IP sementara akan dirilis jika Anda menghentikan atau menghapus resource.

Untuk menentukan apakah alamat bersifat statis atau sementara, lakukan hal berikut:

  1. Di konsol Google Cloud , buka halaman IP addresses.

    Buka IP addresses

  2. Temukan alamat dalam daftar dan periksa kolom Jenis untuk mengetahui jenis alamat IP.

Membatalkan penetapan alamat IP eksternal statis

Membatalkan penetapan alamat IP akan menghapusnya dari resource, tetapi mempertahankan alamat IP tetap dicadangkan. Setelah penetapan alamat IP dibatalkan, Anda dapat menetapkan ulang alamat IP ke resource lain. Prosedur ini didukung untuk instance dual-stack, tetapi tidak untuk instance khusus IPv6.

Anda juga dapat membatalkan penetapan alamat IPv4 atau IPv6 dengan menghapus instance.

Konsol

  1. Di konsol Google Cloud , buka halaman IP addresses.

    Buka IP addresses

  2. Klik Alamat IP eksternal.

  3. Pilih alamat IP statis yang ingin Anda batalkan penetapannya.

  4. Klik Lihat tindakan, lalu pilih opsi Tetapkan ulang ke resource lain.

  5. Dari menu drop-down Lampirkan ke, pilih Tidak ada.

  6. Klik Oke.

gcloud

  1. Periksa apakah alamat IP statis sedang digunakan dengan menggunakan perintah gcloud compute addresses list:

    gcloud compute addresses list
    

    Outputnya mirip dengan yang berikut ini:

    NAME                      REGION    ADDRESS                  STATUS
    example-address-ipv4      REGION    198.51.100.1             RESERVED
    example-address-new-ipv4  REGION    203.0.113.1              IN_USE
    example-address-ipv6      REGION    2001:db8:1:1:1:1:1:1     RESERVED
    example-address-new-ipv6  REGION    2001:db8:4:4:4:4:4:4     IN_USE
    
    • Jika alamat IP tidak digunakan, statusnya adalah RESERVED.
    • Jika alamat IP sedang digunakan, statusnya adalah IN_USE.
  2. Ambil nama instance yang menggunakan alamat IP:

    gcloud compute addresses describe ADDRESS_NAME \
      --region=REGION
    

    Ganti kode berikut:

    • ADDRESS_NAME: nama resource alamat IPv6.
    • REGION: region resource alamat IPv6.

    Outputnya mirip dengan hal berikut ini:

    address: IP_ADDRESS
    addressType: EXTERNAL
    ...
    region: https://www.googleapis.com/compute/v1/projects/PROJECT/regions/REGION
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/addresses/ADDRESS_NAME
    status: IN_USE
    subnetwork: https://www.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/subnetworks/SUBNET
    users:
    - https://www.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instances/INSTANCE_NAME
    

    Kolom users menampilkan nama instance yang menggunakan alamat IP.

  3. Batalkan penetapan alamat IP dari instance.

    • Untuk membatalkan penetapan alamat IPv4, hapus file konfigurasi akses instance:

      1. Mendapatkan nama konfigurasi akses yang akan dihapus. Untuk mendapatkan nama tersebut, gunakan perintah gcloud compute instances describe. Ganti INSTANCE_NAME dengan nama instance.

        gcloud compute instances describe INSTANCE_NAME
        

        Konfigurasi akses muncul dalam format berikut:

        networkInterfaces:
          - accessConfigs:
            - kind: compute#accessConfig
              name: external-nat
              natIP: 203.0.113.1
              type: ONE_TO_ONE_NAT
        
      2. Hapus konfigurasi akses menggunakan perintah gcloud compute instances delete-access-config:

        gcloud compute instances delete-access-config INSTANCE_NAME \
          --access-config-name="ACCESS_CONFIG_NAME"
        

        Ganti kode berikut:

        • INSTANCE_NAME: nama instance.
        • ACCESS_CONFIG_NAME: nama konfigurasi akses yang akan dihapus. Pastikan untuk menyertakan nama lengkap di antara tanda kutip.
    • Untuk membatalkan penetapan rentang alamat IPv6, gunakan perintah instance network-interfaces update:

      gcloud compute instances network-interfaces update INSTANCE_NAME \
        --network-interface=nic0 \
        --stack-type=IPV4_ONLY \
        --zone=ZONE
      

      Ganti kode berikut:

      • INSTANCE_NAME: nama instance yang menggunakan alamat IP tersebut.
      • ZONE: zona instance.
  4. Pastikan alamat IP eksternal statis Anda kini tersedia dan ditandai sebagai RESERVED, bukan IN_USE.

    gcloud compute addresses list \
      --filter="ADDRESS_NAME AND region=REGION"
    

    Ganti kode berikut:

    • ADDRESS_NAME: nama resource alamat IP.
    • REGION: region resource alamat IP.

Setelah alamat IP eksternal statis tersedia, Anda dapat memilih untuk menetapkannya ke instance lain.

REST

Untuk membatalkan penetapan alamat IPv4 atau IPv6 eksternal statis, lakukan langkah-langkah berikut:

  • Untuk alamat IPv4, hapus konfigurasi akses yang dipasang ke instance yang menggunakan alamat tersebut.

    1. Untuk memeriksa detail konfigurasi akses instance, buat permintaan GET ke metode instances.get.

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
      
    2. Hapus konfigurasi akses yang ada dengan membuat permintaan POST ke metode instances.deleteAccessConfig.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/deleteAccessConfig
      

      Ganti kode berikut:

      • PROJECT_ID: project ID untuk permintaan ini
      • ZONE: zona tempat instance berada
      • INSTANCE_NAME: nama instance
  • Untuk alamat IPv6, perbarui jenis stack antarmuka jaringan untuk instance tempat alamat IPv6 terpasang.

    1. Buat permintaan PATCH ke metode instances.updateNetworkInterface.

    2. Dalam isi permintaan, perbarui nilai kolom stackType menjadi IPV4_ONLY.

      Contoh:

      PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/updateNetworkInterface
      
      {
        "networkInterfaces": [{
          ...
          "stackType" : "IPV4_ONLY"
          ...
          }]
      }
      

Java


import com.google.cloud.compute.v1.AccessConfig;
import com.google.cloud.compute.v1.AccessConfig.Type;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class UnassignStaticIpAddress {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Instance ID of the Google Cloud project you want to use.
    String instanceId = "your-instance-id";
    // Name of the zone to create the instance in. For example: "us-west3-b"
    String zone = "your-zone";
    // Name of the network interface to assign.
    String netInterfaceName = "your-netInterfaceName";

    unassignStaticIpAddress(projectId, instanceId, zone, netInterfaceName);
  }

  public static Instance unassignStaticIpAddress(String projectId, String instanceId,
                                                 String zone, String netInterfaceName)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (InstancesClient client = InstancesClient.create()) {
      Instance instance = client.get(projectId, zone, instanceId);
      NetworkInterface networkInterface = null;
      for (NetworkInterface netIterface : instance.getNetworkInterfacesList()) {
        if (netIterface.getName().equals(netInterfaceName)) {
          networkInterface = netIterface;
          break;
        }
      }

      if (networkInterface == null) {
        throw new IllegalArgumentException(
                String.format(
                        "No '{network_interface_name}' variable found on instance %s.",
                        instanceId)
        );
      }

      AccessConfig accessConfig = null;
      for (AccessConfig config : networkInterface.getAccessConfigsList()) {
        if (config.getType().equals(Type.ONE_TO_ONE_NAT.name())) {
          accessConfig = config;
          break;
        }
      }

      if (accessConfig != null) {
        // Delete the existing access configuration first
        client.deleteAccessConfigAsync(projectId, zone, instanceId,
                        accessConfig.getName(), netInterfaceName).get(30, TimeUnit.SECONDS);
      }

      // return updated instance
      return client.get(projectId, zone, instanceId);
    }
  }
}

Python

import uuid

from google.cloud.compute_v1 import InstancesClient
from google.cloud.compute_v1.types import DeleteAccessConfigInstanceRequest


def unassign_static_ip_from_existing_vm(
    project_id: str,
    zone: str,
    instance_name: str,
    network_interface_name: str = "nic0",
):
    """
    Updates access configuration for a VM instance to unassign a static external IP.
    VM (and IP address in case of static IP assigned) must be created before calling this function.

    Args:
        project_id (str): Project ID.
        zone (str): Zone where the VM is located.
        instance_name (str): Name of the VM instance.
        network_interface_name (str): Name of the network interface to unassign.
    """
    client = InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)
    network_interface = next(
        (ni for ni in instance.network_interfaces if ni.name == network_interface_name),
        None,
    )

    if network_interface is None:
        raise ValueError(
            f"No network interface named '{network_interface_name}' found on instance {instance_name}."
        )

    access_config = next(
        (ac for ac in network_interface.access_configs if ac.type_ == "ONE_TO_ONE_NAT"),
        None,
    )

    if access_config:
        # Delete the existing access configuration
        delete_request = DeleteAccessConfigInstanceRequest(
            project=project_id,
            zone=zone,
            instance=instance_name,
            access_config=access_config.name,
            network_interface=network_interface_name,
            request_id=str(uuid.uuid4()),
        )
        delete_operation = client.delete_access_config(delete_request)
        delete_operation.result()

    updated_instance = client.get(project=project_id, zone=zone, instance=instance_name)
    return updated_instance

Merilis alamat IP eksternal statis

Jika tidak lagi memerlukan alamat IPv4 atau IPv6 eksternal statis, Anda dapat melepas alamat IP dengan menghapus resource alamat IP. Menghapus instance tidak akan otomatis melepaskan alamat IP eksternal statis. Anda harus melepas alamat IP eksternal statis secara manual jika tidak lagi memerlukannya.

Untuk merilis alamat IP eksternal statis, lihat Merilis alamat IP eksternal statis dalam dokumentasi VPC.

Langkah selanjutnya