リージョン シークレットとシークレット バージョンをフィルタする

このページでは、Secret Manager でシークレットとシークレット バージョンをフィルタするプロセスについて説明します。シークレットが多数ある環境では、フィルタを使用すると、リスト全体を手動でスクロールしなくても、特定のシークレットまたはバージョンをすばやく特定できます。ラベル、作成日、シークレット名内の特定のパターンなどの条件に基づいてフィルタできるため、特定のシークレットのグループを重点的に管理できます。

Secret Manager では、Google Cloud コンソールの [フィルタ] オプションを使用するか、API 呼び出し内でフィルタ条件を指定して、シークレットと シークレットのバージョンをフィルタできます。Google Cloud CLI では、シークレットを一覧表示するときに filter 文字列を含めることで、シークレットとシークレット バージョンをフィルタできます。

シークレットをフィルタする

シークレットをフィルタするには、次のいずれかの方法を使用します。

Console

  1. Google Cloud コンソールの [Secret Manager] ページに移動します。

    Secret Manager に移動

  2. [Secret Manager] ページで、[リージョン シークレット] タブをクリックします。

  3. [リージョン シークレット] テーブルで、[フィルタ] フィールドをクリックします。

  4. フィルタ プロパティと、それに対応する値(Location:asia-east1 など)を選択します。

    入力した値に基づいてテーブルが自動的にフィルタされます。結果は名前の昇順で並べ替えられます。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • LOCATION: シークレットの Google Cloud ロケーション
  • FILTER: フィルタ文字列(例: name:asecret OR name:bsecret)。gcloud CLI は、name ~ "secret_ab.*" などの正規表現もサポートしています。

次のコマンドを実行します。

Linux、macOS、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

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION: シークレットの Google Cloud ロケーション
  • PROJECT_ID: Google Cloud プロジェクト ID
  • FILTER: フィルタ文字列。フィルタは filter クエリ文字列パラメータとして指定され、URL エンコードされている必要があります。たとえば、フィルタ name:asecret OR name:bsecretname%3Aasecret+OR+name%3Absecret として URL エンコードされます。正規表現は API でサポートされていません。

HTTP メソッドと URL:

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

リクエストの本文(JSON):

{}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

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

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$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

次のような JSON レスポンスが返されます。

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

Go

このコードを実行するには、まず Go 開発環境を設定し、Secret Manager Go SDK をインストールします。 Compute Engine または GKE では、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

このコードを実行するには、まず Java 開発環境を設定し、Secret Manager Java SDK をインストールします。 Compute Engine または GKE では、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

このコードを実行するには、まず Python 開発環境を設定し、Secret Manager Python SDK をインストールします。 Compute Engine または GKE では、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}")

シークレット バージョンをフィルタする

シークレット バージョンをフィルタするには、次の操作を行います。

  • Google Cloud コンソールで、シークレットを選択してそのバージョンにアクセスし、[バージョン] テーブルの [フィルタ] オプションを使用します。

  • Google Cloud CLI または Secret Manager API を使用している場合は、シークレット バージョンを一覧表示するときに filter 文字列を含めます。

フィルタの例

ユースケース フィルタ
名前に部分文字列 mysecret が含まれるシークレット name:mysecret
特定のラベルを持つシークレット labels.environment=production
日時の範囲内で作成されたシークレット create_time<2021-01-01T06:00:00Z AND create_time>2021-01-01T12:00:00Z
自動レプリケーションによるシークレット replication.automatic:*
ユーザー管理のレプリケーションによるシークレットのうち、指定したいずれのリージョンにも保存されていないもの replication.user_managed.replicas.location:* AND NOT replication.user_managed.replicas.location:(us-central1 OR us-east1)
CMEK 鍵で暗号化されたシークレット replication.user_managed.replicas.customerManagedEncryption:*
特定の CMEK キーで暗号化されたシークレット replication.user_managed.replicas.customerManagedEncryption.kmsKeyName=projects/p/locations/us-central1/keyRings/kr/cryptoKeys/my-cmek-key
ローテーション期間のないシークレット NOT rotation.next_rotation_time:*
ローテーション期間が 30 日を超えるシークレット rotation.rotation_period>259200s
有効期限が設定されているシークレット expire_time:*
日付より前に期限切れになるシークレット expire_time<2021-07-31
有効または無効なバージョン state:(ENABLED OR DISABLED)
破棄されたバージョン、日付より後に破棄されたバージョン state:DESTROYED AND destroy_time>2021-01-01

フィルタの構文

フィルタの構文は、フィルタ対象となるオブジェクトの 1 つ以上のフィールドに対する式で構成されます。

式には次の演算子を使用できます。

演算子 説明
= 等しい。
> より大きい。
< 次より小さい
>= 以上。
<= 以下。
!=
-
NOT
等しくない。次の式はすべて同じ結果になります。
name!="topsecret"
-name="topsecret"
NOT name="topsecret"
:

包含。これは、大文字と小文字が区別されない部分文字列一致です。

たとえば、name:"myapp" は、リソース名に myapp(大文字と小文字を区別しない)を含むリソースをフィルタします。

AND

論理 AND

スペースは AND と同等であるため、次の式はすべて同じ結果になります。
name:"myapp" AND name:"secret1"
name:"myapp" name:"secret1"

OR 論理 OR。
*

ワイルドカード

field:*field が設定されていることを示すスタンドアロンとして使用できます。

Cloud Search API と整合して、かっこを使用して別の順序を明示的に定義しない限り、OR 演算は AND 演算の前に評価されます。

time 値でフィルタする場合は、2020-10-15T01:30:15Z のように、時刻を RFC 3399 形式の文字列にエンコードします。

サブフィールドにアクセスする場合は、ドット構文を使用します。たとえば、シークレット リソースには、値が Key-Value maplabels フィールドを含めることができます。color ラベルを使用している場合、次のようにサブフィールド labels.colorSecret の結果をフィルタできます。

labels.color=red

color ラベルセットを持つシークレットだけを一覧表示する場合は、ワイルドカードを使用します。

labels.color:*

引用符で囲まれた文字列は、一続きの値ではなく、単一の値として解釈されます。

フィルタ フィールド

Secret または SecretVersion オブジェクトの任意のフィールドでフィルタリングできます。

list メソッド フィルタリング可能フィールドへのリンク
projects.secrets.list シークレット フィールド
projects.secrets.versions.list SecretVersion フィールド

結果の総数

リスト リクエストで filter が設定されている場合、レスポンスに結果の総数(レスポンスの total_size=0)は表示されません。

次のステップ