리전 보안 비밀 버전 추가

보안 비밀 데이터는 변경할 수 없으며 대부분의 작업은 보안 비밀 버전에서 이루어집니다. 보안 비밀 버전에는 실제 보안 비밀 데이터와 보안 비밀에 대한 상태 및 메타데이터가 포함됩니다. 이 페이지에서는 보안 비밀 버전을 추가하는 방법을 설명합니다.

버전 관리에 대한 자세한 내용은 버전 관리에 대한 이 동영상을 참조하세요.

필요한 역할

보안 비밀 버전을 추가하는 데 필요한 권한을 얻으려면 관리자에게 보안 비밀에 대해 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

보안 비밀 버전에 IAM 역할을 부여할 수 없습니다.

보안 비밀 버전 추가

보안 비밀 버전을 추가하려면 다음 방법 중 하나를 사용합니다.

콘솔

  1. Google Cloud 콘솔에서 Secret Manager 페이지로 이동합니다.

    Secret Manager로 이동

  2. Secret Manager 페이지에서 리전 보안 비밀 탭을 클릭한 후 새 버전을 추가하려는 보안 비밀을 찾습니다.

  3. 해당 보안 비밀과 연결된 작업 메뉴를 클릭한 후 새 버전 추가를 클릭합니다. 새 버전 추가 대화상자가 표시됩니다.

  4. 보안 비밀 값 필드에 abcd1234와 같은 보안 비밀에 대한 값을 입력합니다. 또는 보안 비밀 값이 포함된 파일을 업로드할 수 있습니다.

  5. 새 버전 추가를 클릭합니다.

gcloud

디스크 파일의 콘텐츠에서 보안 비밀 버전을 추가합니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자입니다.
  • LOCATION: 보안 비밀의 Google Cloud 위치입니다.
  • FILE_PATH: 버전 세부정보가 포함된 파일의 전체 경로(파일 이름 포함)입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud secrets versions add SECRET_ID --location=LOCATION --data-file="FILE_PATH"

Windows(PowerShell)

gcloud secrets versions add SECRET_ID --location=LOCATION --data-file="FILE_PATH"

Windows(cmd.exe)

gcloud secrets versions add SECRET_ID --location=LOCATION --data-file="FILE_PATH"

응답에 새로 생성된 보안 비밀 버전이 포함됩니다.

명령줄에서 직접 보안 비밀 버전 추가

명령줄에서 직접 보안 비밀 버전을 추가할 수도 있지만 이 경우 프로세스 목록에 일반 텍스트로 표시되며 다른 시스템 사용자가 캡처할 수 있으므로 권장되지 않습니다. 일반 텍스트가 있는 명령어는 셸 기록에도 저장됩니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • SECRET_DATA: 보안 비밀 버전에 저장할 데이터입니다.
  • SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자입니다.
  • LOCATION: 보안 비밀의 Google Cloud 위치입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

echo -n "SECRET_DATA" | \
    gcloud secrets versions add SECRET_ID --location=LOCATION --data-file=-

Windows(PowerShell)

echo -n "SECRET_DATA" | `
    gcloud secrets versions add SECRET_ID --location=LOCATION --data-file=-

Windows(cmd.exe)

echo -n "SECRET_DATA" | ^
    gcloud secrets versions add SECRET_ID --location=LOCATION --data-file=-

응답에 새로 생성된 보안 비밀 버전이 포함됩니다.

선택사항: 보안 비밀을 처음 만들 때 파일 콘텐츠에서 버전을 추가합니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자입니다.
  • LOCATION: 보안 비밀의 Google Cloud 위치입니다.
  • FILE_PATH: 버전 세부정보가 포함된 파일의 전체 경로(파일 이름 포함)입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud secrets create SECRET_ID --location=LOCATION --data-file="FILE_PATH"

Windows(PowerShell)

gcloud secrets create SECRET_ID --location=LOCATION --data-file="FILE_PATH"

Windows(cmd.exe)

gcloud secrets create SECRET_ID --location=LOCATION --data-file="FILE_PATH"

응답에 새로 생성된 보안 비밀 버전이 포함됩니다.

REST

보안 비밀 데이터를 Base64로 인코딩하고 셸 변수로 저장합니다.

$ SECRET_DATA=$(echo "seCr3t" | base64)

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION: 보안 비밀의 Google Cloud 위치입니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자입니다.

HTTP 메서드 및 URL:

POST https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID:addVersion

JSON 요청 본문:

{"payload": {"data": "${SECRET_DATA}"}}

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

curl -X POST \
-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/SECRET_ID:addVersion"

PowerShell

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

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

Invoke-WebRequest `
-Method POST `
-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/SECRET_ID:addVersion" | Select-Object -Expand Content

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID/versions/1",
  "createTime": "2024-03-25T08:24:13.153705Z",
  "state": "ENABLED",
  "etag": "\"161477e6071da9\""
}

Go

이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Secret Manager Go SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

import (
	"context"
	"fmt"
	"hash/crc32"
	"io"

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

// addSecretVersion adds a new secret version to the given secret with the
// provided payload.
func AddRegionalSecretVersion(w io.Writer, projectId, locationId, secretId string) error {
	// parent := "projects/my-project/locations/my-location/secrets/my-secret"

	// Declare the payload to store.
	payload := []byte("my super secret data")
	// Compute checksum, use Castagnoli polynomial. Providing a checksum
	// is optional.
	crc32c := crc32.MakeTable(crc32.Castagnoli)
	checksum := int64(crc32.Checksum(payload, crc32c))

	// 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/secrets/%s", projectId, locationId, secretId)

	// Build the request.
	req := &secretmanagerpb.AddSecretVersionRequest{
		Parent: parent,
		Payload: &secretmanagerpb.SecretPayload{
			Data:       payload,
			DataCrc32C: &checksum,
		},
	}

	// Call the API.
	result, err := client.AddSecretVersion(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to add regional secret version: %w", err)
	}
	fmt.Fprintf(w, "Added regional secret version: %s\n", result.Name)
	return nil
}

Java

이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Secret Manager 자바 SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

import com.google.cloud.secretmanager.v1.SecretManagerServiceClient;
import com.google.cloud.secretmanager.v1.SecretManagerServiceSettings;
import com.google.cloud.secretmanager.v1.SecretName;
import com.google.cloud.secretmanager.v1.SecretPayload;
import com.google.cloud.secretmanager.v1.SecretVersion;
import com.google.protobuf.ByteString;
import java.io.IOException;
import java.util.zip.CRC32C;
import java.util.zip.Checksum;

public class AddRegionalSecretVersion {

  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";
    // Resource ID of the secret.
    String secretId = "your-secret-id";
    addRegionalSecretVersion(projectId, locationId, secretId);
  }

  // Add a new version to the existing regional secret.
  public static SecretVersion addRegionalSecretVersion(
      String projectId, String locationId, String secretId) 
      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 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)) {
      SecretName secretName = 
          SecretName.ofProjectLocationSecretName(projectId, locationId, secretId);
      byte[] data = "my super secret data".getBytes();
      // Calculate data checksum. The library is available in Java 9+.
      // For Java 8, use:
      // https://cloud.google.com/appengine/docs/standard/java/javadoc/com/google/appengine/api/files/Crc32c
      Checksum checksum = new CRC32C();
      checksum.update(data, 0, data.length);

      // Create the secret payload.
      SecretPayload payload =
          SecretPayload.newBuilder()
              .setData(ByteString.copyFrom(data))
              // Providing data checksum is optional.
              .setDataCrc32C(checksum.getValue())
              .build();

      // Add the secret version.
      SecretVersion version = client.addSecretVersion(secretName, payload);
      System.out.printf("Added regional secret version %s\n", version.getName());

      return version;
    }
  }
}

Node.js

이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Secret Manager Node.js SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const projectId = 'my-project';
// const locationId = 'location';
// const secretId = 'my-secret';

const parent = `projects/${projectId}/locations/${locationId}/secrets/${secretId}`;
// Imports the Secret Manager library
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');

// Adding the endpoint to call the regional secret manager sever
const options = {};
options.apiEndpoint = `secretmanager.${locationId}.rep.googleapis.com`;

// Instantiates a client
const client = new SecretManagerServiceClient(options);

// Payload is the plaintext data to store in the secret
const payload = Buffer.from('my super secret data', 'utf8');

async function addRegionalSecretVersion() {
  const [version] = await client.addSecretVersion({
    parent: parent,
    payload: {
      data: payload,
    },
  });

  console.log(`Added regional secret version ${version.name}`);
}

addRegionalSecretVersion();

Python

이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Secret Manager Python SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

from google.cloud import secretmanager_v1
import google_crc32c


def add_regional_secret_version(
    project_id: str,
    location_id: str,
    secret_id: str,
    payload: str,
) -> secretmanager_v1.SecretVersion:
    """
    Adds a new secret version to the given secret with the provided payload.
    """

    # 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 secret.
    parent = f"projects/{project_id}/locations/{location_id}/secrets/{secret_id}"

    # Convert the string payload into a bytes. This step can be omitted if you
    # pass in bytes instead of a str for the payload argument.
    payload_bytes = payload.encode("UTF-8")

    # Calculate payload checksum. Passing a checksum in add-version request
    # is optional.
    crc32c = google_crc32c.Checksum()
    crc32c.update(payload_bytes)

    # Add the secret version.
    response = client.add_secret_version(
        request={
            "parent": parent,
            "payload": {
                "data": payload_bytes,
                "data_crc32c": int(crc32c.hexdigest(), 16),
            },
        }
    )

    # Print the new secret version name.
    print(f"Added secret version: {response.name}")
    return response

보안 비밀 버전 상태

보안 비밀 버전은 언제든지 다음 중 하나일 수 있습니다.

  • 사용 설정됨 - 이 상태에서 보안 비밀 버전에 액세스하여 설명할 수 있습니다. 이 상태는 새로운 보안 비밀 버전의 기본 상태입니다.

  • 중지됨 - 이 상태에서는 보안 비밀 버전에 액세스할 수 없지만 보안 비밀 콘텐츠는 여전히 존재합니다. 보안 비밀 버전을 다시 사용 설정하면 액세스 권한을 복원할 수 있습니다.

  • 폐기됨 - 이 상태에서는 보안 비밀 버전의 콘텐츠가 삭제됩니다. 보안 비밀 버전을 다른 상태로 변경할 수 없습니다.

사용 설정된 보안 비밀 버전과 사용 중지된 보안 비밀 버전 모두 요금이 청구됩니다. 폐기됨 상태의 보안 비밀 버전에 대해서는 요금이 청구되지 않습니다.

다음 단계