Secret Manager는 최적의 동시 실행 제어를 위해 항목 태그(ETags) 사용을 지원합니다.
경우에 따라 동일한 리소스를 동시에 업데이트하는 두 프로세스가 서로 간섭할 수 있으며, 나중의 프로세스가 이전 프로세스의 작업을 덮어쓰게 됩니다.
ETag는 프로세스가 리소스에 조치를 취하기 전에 리소스가 수정되었는지 여부를 확인할 수 있도록 하여 낙관적 동시 실행 제어를 위한 수단을 제공합니다.
Secret Manager에서 ETag 사용
다음 리소스 수정 요청은 ETag를 지원합니다.
secrets.patch 요청에서 요청 ETag는 보안 비밀 데이터에 삽입됩니다. 다른 모든 요청은 선택적 etag
매개변수를 허용합니다.
ETag가 제공되고 현재 리소스 ETag와 일치하면 요청이 성공한 것이며 그렇지 않으면 FAILED_PRECONDITION
오류와 HTTP 상태 코드 400으로 실패합니다. ETag가 제공되지 않으면 현재 저장된 ETag 값을 확인하지 않고 요청이 진행됩니다.
리소스 ETag는 리소스 생성 시(projects.secrets.create, projects.secrets.addVersion) 생성되고 위에 나열된 각 수정 요청에 대해 업데이트됩니다. 수정 요청은 적용되는 리소스의 ETag만 업데이트합니다. 즉, 보안 비밀 버전을 업데이트해도 보안 비밀 ETag에 영향을 미치지 않으며 마찬가지로 ETag를 업데이트해도 보안 비밀 버전에 영향을 미치지 않습니다.
업데이트로 인해 리소스 상태가 변경되지 않더라도 리소스 ETag는 업데이트됩니다.
다음 예시를 참조하세요.
-
사용자 1이 보안 비밀 버전이 이미 사용 설정되어 있는지 모르고 이를 사용 설정하려고 합니다. 시스템은 이를 처리하여 버전의 ETag만 변경합니다.
-
사용자 2가 이전 ETag를 사용하여 버전을 사용 중지하려고 시도합니다.
-
이는 시스템이 버전을 사용 설정된 상태로 유지하려는 최신 인텐트를 나타내는 최신 ETag를 인식하기 때문에 실패합니다.
사소해 보이는 업데이트도 ETag 변경으로 인해 중요합니다. 이에 따라 특히 여러 사용자 또는 시스템이 동일한 리소스와 상호작용할 때 데이터 일관성이 보장됩니다.
리소스 etag
는 리소스(Secret 또는 SecretVersion)가 포함될 때마다 응답에 반환됩니다.
ETag가 포함된 보안 비밀 삭제
이 섹션에서는 보안 비밀을 삭제할 때 ETag를 사용하는 방법을 설명합니다. 다른 프로세스에 의해 보안 비밀이 수정된 경우 삭제 작업이 실패합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- LOCATION: 보안 비밀의 Google Cloud 위치입니다.
- ETAG: 보안 비밀의 항목 태그입니다. ETag에는 둘러싸인 따옴표를 포함해야 합니다.
예를 들어 ETag 값이
"abc"
이면 셸 이스케이프 처리된 값은"\"abc\""
입니다.
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets delete SECRET_ID --location=LOCATION \ --etag "ETAG"
Windows(PowerShell)
gcloud secrets delete SECRET_ID --location=LOCATION ` --etag "ETAG"
Windows(cmd.exe)
gcloud secrets delete SECRET_ID --location=LOCATION ^ --etag "ETAG"
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION: 보안 비밀의 Google Cloud 위치입니다.
- PROJECT_ID: Google Cloud 프로젝트 ID
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- ETAG: 보안 비밀의 항목 태그입니다. ETag는 URL 쿼리 문자열의 일부로 지정되며 URL로 인코딩되어야 합니다. 예를 들어 ETag 값이
"abc"
이면 따옴표 문자는%22
로 인코딩되므로 URL로 인코딩된 값은%22abc%22
가 됩니다.
HTTP 메서드 및 URL:
DELETE https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID?etag=ETAG
JSON 요청 본문:
{}
요청을 보내려면 다음 옵션 중 하나를 선택합니다.
curl
요청 본문을 request.json
파일에 저장하고 다음 명령어를 실행합니다.
curl -X DELETE \
-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?etag=ETAG"
PowerShell
요청 본문을 request.json
파일에 저장하고 다음 명령어를 실행합니다.
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method DELETE `
-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?etag=ETAG" | Select-Object -Expand Content
다음과 비슷한 JSON 응답이 표시됩니다.
{}
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Secret Manager Go SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Secret Manager 자바 SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Secret Manager Python SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
ETag가 포함된 보안 비밀 업데이트
이 섹션에서는 보안 비밀을 업데이트할 때 ETag를 사용하는 방법을 설명합니다. 다른 프로세스에 의해 보안 비밀이 수정된 경우 업데이트 작업이 실패합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- LOCATION: 보안 비밀의 Google Cloud 위치입니다.
- KEY: 라벨 이름입니다.
- VALUE: 해당하는 라벨 값입니다.
- ETAG: 보안 비밀의 항목 태그입니다. ETag에는 둘러싸인 따옴표를 포함해야 합니다.
예를 들어 ETag 값이
"abc"
이면 셸 이스케이프 처리된 값은"\"abc\""
입니다.
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --update-labels "KEY=VALUE" \ --etag "ETAG"
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --update-labels "KEY=VALUE" ` --etag "ETAG"
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --update-labels "KEY=VALUE" ^ --etag "ETAG"
응답은 보안 비밀을 반환합니다.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION: 보안 비밀의 Google Cloud 위치입니다.
- PROJECT_ID: Google Cloud 프로젝트 ID입니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- ETAG: 보안 비밀의 항목 태그입니다. ETag는 Secret에서 필드로 지정되며 둘러싸인 따옴표를 포함해야 합니다. 예를 들어 ETag 값이
"abc"
이면 JSON 이스케이프 처리된 값은{"etag":"\"abc\""}
입니다. - KEY: 라벨 이름입니다.
- VALUE: 해당하는 라벨 값입니다.
HTTP 메서드 및 URL:
PATCH https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID?updateMask=labels
JSON 요청 본문:
{"etag":"ETAG", "labels":{"KEY": "VALUE"}}
요청을 보내려면 다음 옵션 중 하나를 선택합니다.
curl
요청 본문을 request.json
파일에 저장하고 다음 명령어를 실행합니다.
curl -X PATCH \
-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?updateMask=labels"
PowerShell
요청 본문을 request.json
파일에 저장하고 다음 명령어를 실행합니다.
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-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?updateMask=labels" | Select-Object -Expand Content
다음과 비슷한 JSON 응답이 표시됩니다.
{ "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID", "createTime": "2024-09-04T04:06:00.660420Z", "labels": { "KEY": "VALUE" }, "etag": "\"162145a4f894d5\"" }
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Secret Manager Go SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Secret Manager 자바 SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Secret Manager Python SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
ETag로 보안 비밀 버전 업데이트
이 섹션에서는 보안 비밀 버전을 업데이트할 때 ETag를 사용하는 방법을 설명합니다. 보안 비밀 버전이 다른 프로세스에 의해 수정된 경우 업데이트 작업이 실패합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- VERSION_ID: 보안 비밀 버전의 ID입니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- LOCATION: 보안 비밀의 Google Cloud 위치입니다.
- ETAG: 항목 태그입니다. ETag에는 둘러싸인 따옴표를 포함해야 합니다.
예를 들어 ETag 값이
"abc"
이면 셸 이스케이프 처리된 값은"\"abc\""
입니다.
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets versions disable VERSION_ID \ --secret SECRET_ID \ --location=LOCATION \ --etag "ETAG"
Windows(PowerShell)
gcloud secrets versions disable VERSION_ID ` --secret SECRET_ID ` --location=LOCATION ` --etag "ETAG"
Windows(cmd.exe)
gcloud secrets versions disable VERSION_ID ^ --secret SECRET_ID ^ --location=LOCATION ^ --etag "ETAG"
응답은 보안 비밀을 반환합니다.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION: 보안 비밀의 Google Cloud 위치
- PROJECT_ID: Google Cloud 프로젝트 ID
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- VERSION_ID: 보안 비밀 버전의 ID
- ETAG: 보안 비밀 버전의 항목 태그입니다. ETag는 SecretVersion에서 필드로 지정되며 둘러싸인 따옴표를 포함해야 합니다. 예를 들어 ETag 값이
"abc"
이면 JSON 이스케이프 처리된 값은{"etag":"\"abc\""}
입니다.
HTTP 메서드 및 URL:
POST https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID/versions/VERSION_ID:disable
JSON 요청 본문:
{"etag":"ETAG"}
요청을 보내려면 다음 옵션 중 하나를 선택합니다.
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/versions/VERSION_ID:disable"
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/versions/VERSION_ID:disable" | Select-Object -Expand Content
다음과 비슷한 JSON 응답이 표시됩니다.
{ "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID/versions/VERSION_ID", "createTime": "2024-09-04T06:41:57.859674Z", "state": "DISABLED", "etag": "\"1621457b3c1459\"" }
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Secret Manager Go SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Secret Manager 자바 SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Secret Manager Python SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
이 코드 샘플에서는 ETag를 사용하여 보안 비밀 버전을 사용 설정하는 방법을 설명합니다. 보안 비밀 버전 사용 중지 또는 폐기와 같은 다른 보안 비밀 변형 작업 중에 ETag를 지정할 수도 있습니다. Secret Manager의 코드 샘플을 참고하세요.