Memfilter secret dan versi secret regional

Halaman ini menjelaskan proses pemfilteran secret dan versi secret di Secret Manager. Di lingkungan dengan banyak secret, pemfilteran membantu mengidentifikasi secret atau versi tertentu dengan cepat tanpa men-scroll seluruh daftar secara manual. Anda dapat memfilter berdasarkan kriteria seperti label, tanggal pembuatan, atau pola tertentu dalam nama secret, sehingga memungkinkan pengelolaan grup secret tertentu secara terfokus.

Di Secret Manager, Anda dapat memfilter secret dan versi secret menggunakan opsi Filter di konsol Google Cloud atau dengan menentukan kriteria filter dalam panggilan API. Di Google Cloud CLI, Anda dapat memfilter secret dan versi secret dengan menyertakan string filter saat mencantumkan secret.

Memfilter secret

Untuk memfilter secret, gunakan salah satu metode berikut:

Konsol

  1. Buka halaman Secret Manager di konsol Google Cloud.

    Buka Secret Manager

  2. Di halaman Secret Manager, klik tab Regional secrets.

  3. Di tabel Regional secret, klik kolom Filter.

  4. Pilih properti filter dan nilai yang sesuai, misalnya Location:asia-east1.

    Tabel akan otomatis difilter berdasarkan nilai yang dimasukkan. Hasil diurutkan menurut nama dalam urutan menaik.

gcloud

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • LOCATION: Lokasi secret Google Cloud
  • FILTER: string filter, misalnya name:asecret OR name:bsecret. gcloud CLI juga mendukung ekspresi reguler, misalnya name ~ "secret_ab.*".

Jalankan perintah berikut:

Linux, macOS, atau Cloud Shell

gcloud secrets list --location=LOCATION --filter="FILTER"

Windows (PowerShell)

gcloud secrets list --location=LOCATION --filter="FILTER"

Windows (cmd.exe)

gcloud secrets list --location=LOCATION --filter="FILTER"

REST

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • LOCATION: Lokasi secret Google Cloud
  • PROJECT_ID: project ID Google Cloud
  • FILTER: string filter. Filter ditentukan sebagai parameter string kueri filter dan harus dienkode URL. Misalnya, filter name:asecret OR name:bsecret akan dienkode ke URL sebagai name%3Aasecret+OR+name%3Absecret. Ekspresi reguler tidak didukung di API.

Metode HTTP dan URL:

GET https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?filter=FILTER

Isi JSON permintaan:

{}

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?filter=FILTER"

PowerShell

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?filter=FILTER" | Select-Object -Expand Content

Anda akan melihat respons JSON seperti berikut:

{
  "secrets": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID",
      "createTime": "2024-09-02T07:14:00.281541Z",
      "etag": "\"16211dd90b37e7\""
    }
  ]
}

Go

Untuk menjalankan kode ini, siapkan lingkungan pengembangan Go terlebih dahulu dan instal Secret Manager Go SDK. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

import (
	"context"
	"fmt"
	"io"

	secretmanager "cloud.google.com/go/secretmanager/apiv1"
	"cloud.google.com/go/secretmanager/apiv1/secretmanagerpb"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
)

// listSecretsWithFilter lists all filter-matching secrets in the given project.
func ListRegionalSecretsWithFilter(w io.Writer, projectId, locationId string, filter string) error {
	// parent := "projects/my-project/locations/my-location"
	// Follow https://cloud.google.com/secret-manager/docs/filtering
	// for filter syntax and examples.
	// filter := "name:name-substring"

	// Create the client.
	ctx := context.Background()
	//Endpoint to send the request to regional server
	endpoint := fmt.Sprintf("secretmanager.%s.rep.googleapis.com:443", locationId)
	client, err := secretmanager.NewClient(ctx, option.WithEndpoint(endpoint))

	if err != nil {
		return fmt.Errorf("failed to create regional secretmanager client: %w", err)
	}
	defer client.Close()

	parent := fmt.Sprintf("projects/%s/locations/%s", projectId, locationId)
	// Build the request.
	req := &secretmanagerpb.ListSecretsRequest{
		Parent: parent,
		Filter: filter,
	}

	// Call the API.
	it := client.ListSecrets(ctx, req)
	for {
		resp, err := it.Next()
		if err == iterator.Done {
			break
		}

		if err != nil {
			return fmt.Errorf("failed to list regional secrets: %w", err)
		}

		fmt.Fprintf(w, "Found regional secret %s\n", resp.Name)
	}

	return nil
}

Java

Untuk menjalankan kode ini, siapkan lingkungan pengembangan Java terlebih dahulu dan instal Secret Manager Java SDK. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

import com.google.cloud.secretmanager.v1.ListSecretsRequest;
import com.google.cloud.secretmanager.v1.LocationName;
import com.google.cloud.secretmanager.v1.SecretManagerServiceClient;
import com.google.cloud.secretmanager.v1.SecretManagerServiceClient.ListSecretsPage;
import com.google.cloud.secretmanager.v1.SecretManagerServiceClient.ListSecretsPagedResponse;
import com.google.cloud.secretmanager.v1.SecretManagerServiceSettings;
import java.io.IOException;

public class ListRegionalSecretsWithFilter {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.

    // Your GCP project ID.
    String projectId = "your-project-id";
    // Location of the secret.
    String locationId = "your-location-id";
    // Filter to be applied. 
    // See https://cloud.google.com/secret-manager/docs/filtering
    // for filter syntax and examples.
    String filter = "name:your-secret-substring AND expire_time<2022-01-01T00:00:00Z";
    listRegionalSecretsWithFilter(projectId, locationId, filter);
  }

  // List all secrets for a project
  public static ListSecretsPage listRegionalSecretsWithFilter(
      String projectId, String locationId, String filter) throws IOException {

    // Endpoint to call the regional secret manager sever
    String apiEndpoint = String.format("secretmanager.%s.rep.googleapis.com:443", locationId);
    SecretManagerServiceSettings secretManagerServiceSettings =
        SecretManagerServiceSettings.newBuilder().setEndpoint(apiEndpoint).build();

    // Initialize the client that will be used to send requests. This client only needs to be
    // created once, and can be reused for multiple requests.
    try (SecretManagerServiceClient client = 
        SecretManagerServiceClient.create(secretManagerServiceSettings)) {
      // Build the parent name.
      LocationName parent = LocationName.of(projectId, locationId);

      // Get filtered secrets.
      ListSecretsRequest request =
          ListSecretsRequest.newBuilder()
              .setParent(parent.toString())
              .setFilter(filter)
              .build();

      ListSecretsPagedResponse pagedResponse = client.listSecrets(request);

      // List all secrets.
      pagedResponse
          .iterateAll()
          .forEach(
              secret -> {
                System.out.printf("Regional secret %s\n", secret.getName());
              });

      return pagedResponse.getPage();
    }
  }
}

Python

Untuk menjalankan kode ini, pertama-tama siapkan lingkungan pengembangan Python dan instal Secret Manager Python SDK. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

# Import the Secret Manager client library.
from google.cloud import secretmanager_v1


def list_regional_secrets_with_filter(
    project_id: str, location_id: str, filter_str: str
) -> None:
    """
    Lists all regional secrets in the given project.
    """

    # Endpoint to call the regional secret manager sever.
    api_endpoint = f"secretmanager.{location_id}.rep.googleapis.com"

    # Create the Secret Manager client.
    client = secretmanager_v1.SecretManagerServiceClient(
        client_options={"api_endpoint": api_endpoint},
    )

    # Build the resource name of the parent project.
    parent = f"projects/{project_id}/locations/{location_id}"

    # List all secrets.
    for secret in client.list_secrets(request={"parent": parent, "filter": filter_str}):
        print(f"Found secret: {secret.name}")

Memfilter versi secret

Untuk memfilter versi secret, lakukan tindakan berikut:

  • Di konsol Google Cloud, pilih secret untuk mengakses versinya, lalu gunakan opsi Filter di tabel Versions.

  • Jika Anda menggunakan Google Cloud CLI atau Secret Manager API, sertakan string filter saat mencantumkan versi secret.

Contoh filter

Kasus penggunaan Filter
Secret yang namanya berisi substring mysecret name:mysecret
Secret dengan label tertentu labels.environment=production
Secret yang dibuat dalam rentang tanggal/waktu create_time<2021-01-01T06:00:00Z AND create_time>2021-01-01T12:00:00Z
Secret dengan replikasi otomatis replication.automatic:*
Secret dengan replikasi yang dikelola pengguna, tetapi tidak disimpan di salah satu region yang ditentukan replication.user_managed.replicas.location:* AND NOT replication.user_managed.replicas.location:(us-central1 OR us-east1)
Secret yang dienkripsi dengan kunci CMEK replication.user_managed.replicas.customerManagedEncryption:*
Secret yang dienkripsi dengan kunci CMEK tertentu replication.user_managed.replicas.customerManagedEncryption.kmsKeyName=projects/p/locations/us-central1/keyRings/kr/cryptoKeys/my-cmek-key
Secret tanpa periode rotasi NOT rotation.next_rotation_time:*
Secret dengan periode rotasi > 30 hari rotation.rotation_period>259200s
Secret dengan masa berlaku yang ditetapkan expire_time:*
Secret yang masa berlakunya habis sebelum tanggal tertentu expire_time<2021-07-31
Versi yang diaktifkan atau dinonaktifkan state:(ENABLED OR DISABLED)
Versi yang dihancurkan, dihancurkan setelah tanggal state:DESTROYED AND destroy_time>2021-01-01

Filter sintaksis

Sintaksis filter terdiri dari ekspresi pada satu atau beberapa kolom objek yang difilter.

Anda dapat menggunakan operator ekspresi berikut.

Operator Deskripsi
= Kesetaraan.
> Lebih besar dari.
< Kurang dari.
>= Lebih dari atau sama dengan.
<= Kurang dari atau sama dengan.
!=
-
NOT
Ketidaksetaraan. Berikut ini setara:
name!="topsecret"
-name="topsecret"
NOT name="topsecret"
:

Pembatasan. Ini adalah pencocokan substring yang tidak peka huruf besar/kecil.

Misalnya, name:"myapp" memfilter resource yang berisi myapp (tidak peka huruf besar/kecil) dalam nama resource.

AND

Logika AND.

Spasi setara dengan AND, sehingga hal berikut setara:
name:"myapp" AND name:"secret1"
name:"myapp" name:"secret1"

OR Logika OR.
*

Karakter pengganti.

Dapat digunakan sebagai mandiri dengan field:* menunjukkan bahwa field ditetapkan.

Sesuai dengan Cloud Search API, operasi OR dievaluasi sebelum operasi AND, kecuali jika tanda kurung digunakan untuk menentukan urutan yang berbeda secara eksplisit.

Saat memfilter nilai time, encode waktu sebagai string dalam format RFC 3399, seperti 2020-10-15T01:30:15Z.

Saat mengakses subkolom, gunakan sintaksis titik. Misalnya, resource Secret dapat menyertakan kolom labels yang nilainya adalah map nilai kunci. Jika label color digunakan, Anda dapat memfilter hasil Secret di subkolom labels.color sebagai berikut:

labels.color=red

Jika Anda hanya ingin mencantumkan secret dengan label color yang ditetapkan, gunakan karakter pengganti:

labels.color:*

String yang diapit tanda kutip ditafsirkan sebagai satu nilai, bukan urutan nilai.

Kolom filter

Anda dapat memfilter kolom apa pun dari objek Secret atau SecretVersion.

Metode daftar Menautkan ke kolom yang dapat difilter
projects.secrets.list Kolom secret
projects.secrets.versions.list Kolom SecretVersion

Total jumlah hasil

Jika filter ditetapkan dalam permintaan daftar, respons tidak menunjukkan jumlah hasil total (total_size=0 dalam respons).

Langkah selanjutnya