1. 개요
Confidential Space는 여러 사용자 간의 공동작업을 위한 안전한 환경을 제공합니다. 이 Codelab에서는 Confidential Space를 사용하여 머신러닝 모델과 같은 민감한 지식 재산을 보호하는 방법을 보여줍니다.
이 Codelab에서는 Confidential Space를 사용하여 한 회사가 이 모델을 사용하려는 다른 회사와 독점 머신러닝 모델을 안전하게 공유할 수 있도록 합니다. 특히 회사 Primus는 Confidential Space에서 실행되는 워크로드에만 배포되는 머신러닝 모델을 보유하고 있어 Primus가 지적 재산을 완전히 제어할 수 있게 되었습니다. Company Secundus가 워크로드 운영자 역할을 하며 Confidential Space에서 머신러닝 워크로드를 실행할 예정입니다. Secundus가 이 모델을 로드하고 Secundus가 소유한 샘플 데이터를 사용하여 추론을 실행합니다.
여기에서 Primus는 워크로드 코드를 작성하는 워크로드 작성자이자, 신뢰할 수 없는 워크로드 운영업체인 Secundus로부터 지적 재산을 보호하고자 하는 공동작업자입니다. Secundus는 머신러닝 워크로드의 워크로드 운영자입니다.
학습할 내용
- 한 당사자가 지식 재산에 대한 통제권을 잃지 않고 독점 ML 모델을 다른 당사자와 공유할 수 있는 환경을 구성하는 방법
필요한 항목
- Google Cloud Platform 프로젝트
- Google Compute Engine ( Codelab), 컨피덴셜 VM, 컨테이너, 원격 저장소에 관한 기본 지식
- 서비스 계정, 워크로드 아이덴티티 제휴, 속성 조건에 대한 기본 지식
Confidential Space 설정과 관련된 역할
이 Codelab에서 회사 Primus는 리소스 소유자이자 워크로드 작성자가 되어 다음을 담당합니다.
- 머신러닝 모델을 사용하여 필요한 클라우드 리소스 설정
- 워크로드 코드 작성
- 워크로드 이미지 게시
- 신뢰할 수 없는 연산자로부터 ML 모델을 보호하도록 워크로드 아이덴티티 풀 정책 구성
Secundus Company가 운영자이며 다음에 대한 책임을 집니다.
- 워크로드에 사용되는 샘플 이미지와 결과를 저장하기 위해 필요한 클라우드 리소스를 설정합니다.
- Primus에서 제공한 모델을 사용하여 Confidential Space에서 ML 워크로드 실행
Confidential Space 작동 방식
Confidential Space에서 워크로드를 실행하면 구성된 리소스를 사용하여 다음 프로세스가 실행됩니다.
- 워크로드가 워크로드 아이덴티티 풀에서
$PRIMUS_SERVICEACCOUNT
에 대한 일반 Google 액세스 토큰을 요청합니다. 워크로드 및 환경 클레임이 포함된 증명 확인자 서비스 토큰을 제공합니다. - 증명 인증 도구 서비스 토큰의 워크로드 측정 클레임이 WIP의 속성 조건과 일치하면
$PRIMUS_SERVICEACCOUNT.
의 액세스 토큰이 반환됩니다. - 워크로드는
$PRIMUS_SERVICEACCOUNT
에 연결된 서비스 계정 액세스 토큰을 사용하여$PRIMUS_INPUT_STORAGE_BUCKET
버킷에 저장된 머신러닝 모델에 액세스합니다. - 워크로드는 Secundus가 소유한 데이터에 대해 작업을 수행하고 해당 워크로드는 Secundus가 프로젝트에서 Secundus가 소유하고 실행합니다.
- 워크로드는
$WORKLOAD_SERVICEACCOUNT
서비스 계정을 사용하여 해당 작업의 결과를$SECUNDUS_RESULT_STORAGE_BUCKET
버킷에 씁니다.
2. 클라우드 리소스 설정
시작하기 전에
- 아래 명령어를 사용하여 이 저장소를 클론하여 이 Codelab의 일부로 사용되는 필수 스크립트를 가져옵니다.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- 이 Codelab의 디렉터리를 변경합니다.
cd confidential-space/codelabs/ml_model_protection/scripts
- 아래와 같이 필수 프로젝트 환경 변수를 설정했는지 확인하세요. GCP 프로젝트 설정에 관한 자세한 내용은 이 Codelab을 참고하세요. 프로젝트 ID를 검색하는 방법과 프로젝트 이름 및 프로젝트 번호와의 차이점에 대한 자세한 내용은 이 페이지를 참고하세요.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
- 프로젝트에 대해 결제를 사용 설정합니다.
- 두 프로젝트 모두에 컨피덴셜 컴퓨팅 API 및 다음 API를 사용 설정합니다.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- 다음 명령어를 사용하여 위에 지정된 리소스 이름의 변수에 값을 할당합니다. 이러한 변수를 사용하면 필요에 따라 리소스 이름을 맞춤설정할 수 있으며, 이미 만들어진 기존 리소스도 사용할 수 있습니다. (예:
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'
)
- Primus 프로젝트의 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Primus 프로젝트의 해당 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않으면 프로젝트 이름에서 클라우드 리소스 이름이 생성되고 해당 이름으로 새 클라우드 리소스가 생성됩니다. 다음은 리소스 이름에 지원되는 변수입니다.
| Primus의 머신러닝 모델을 저장하는 버킷입니다. |
| 클레임을 검증하는 Primus의 워크로드 아이덴티티 풀 (WIP)입니다. |
| 증명 인증자 서비스에서 서명한 토큰에 사용할 승인 조건이 포함된 Primus의 워크로드 아이덴티티 풀 제공업체입니다. |
|
|
| 워크로드 Docker 이미지가 푸시될 아티팩트 저장소입니다. |
- Secundus 프로젝트의 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Secundus 프로젝트의 해당 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않으면 프로젝트 이름에서 클라우드 리소스 이름이 생성되고 해당 이름으로 새 클라우드 리소스가 생성됩니다. 다음은 리소스 이름에 지원되는 변수입니다.
| Primus가 제공한 모델을 사용해 Secundus가 분류하려는 샘플 이미지를 저장하는 버킷입니다. |
| 워크로드 결과를 저장하는 버킷입니다. |
| 워크로드 컨테이너 이미지의 이름입니다. |
| 워크로드 컨테이너 이미지의 태그입니다. |
| 워크로드를 실행하는 컨피덴셜 VM에 액세스할 권한이 있는 서비스 계정입니다. |
- 이 두 프로젝트에는 특정 권한이 필요하며 GCP 콘솔을 사용하여 IAM 역할을 부여하는 방법은 이 가이드를 참조하세요.
$PRIMUS_PROJECT_ID
의 경우 스토리지 관리자, Artifact Registry 관리자, 서비스 계정 관리자, IAM 워크로드 아이덴티티 풀 관리자가 필요합니다.$SECUNDUS_PROJECT_ID
의 경우 Compute 관리자, 스토리지 관리자, 서비스 계정 관리자, IAM 워크로드 아이덴티티 풀 관리자, 보안 관리자 (선택사항)가 필요합니다.- 다음 script를 실행하여 나머지 변수 이름을 리소스 이름의 프로젝트 ID에 따른 값으로 설정합니다.
source config_env.sh
Primus Company 리소스 설정
이 단계에서는 Primus에 필요한 클라우드 리소스를 설정합니다. 다음 스크립트를 실행하여 Primus의 리소스를 설정합니다. 스크립트 실행의 일부로 다음 리소스가 생성됩니다.
- Primus의 머신러닝 모델을 저장할 Cloud Storage 버킷 (
$PRIMUS_INPUT_STORAGE_BUCKET
) - 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL
)에서 제공업체에 구성된 속성 조건을 기반으로 소유권 주장을 검증합니다. - Cloud Storage 버킷의 데이터를 읽고 (
objectViewer
역할 사용) 이 서비스 계정을 워크로드 아이덴티티 풀에 연결 (roles/iam.workloadIdentityUser
역할 사용)할 수 있는 IAM 액세스 권한이 있는 위에서 언급한 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL
)에 연결된 서비스 계정 ($PRIMUS_SERVICEACCOUNT
)
이 클라우드 리소스 설정의 일부로 TensorFlow 모델을 사용할 것입니다. 모델의 아키텍처, 가중치, 학습 구성을 포함하는 전체 모델을 ZIP 보관 파일에 저장할 수 있습니다. 이 Codelab에서는 여기에 있는 ImageNet 데이터 세트로 학습된 MobileNet V1 모델을 사용합니다.
./setup_primus_company_resources.sh
앞서 언급한 스크립트는 클라우드 리소스를 설정합니다. 이제 모델을 다운로드하고 스크립트로 만든 Cloud Storage 버킷에 게시합니다.
- 여기에서 선행 학습된 모델을 다운로드합니다.
- 다운로드가 완료되면 다운로드한 tar 파일의 이름을 model.tar.gz로 변경합니다.
- model.tar.gz 파일이 포함된 디렉터리에서 다음 명령어를 사용하여 model.tar.gz 파일을 Cloud Storage 버킷에 게시합니다.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/
Secundus Company 리소스 설정
이 단계에서는 Secundus에 필요한 클라우드 리소스를 설정합니다. 다음 스크립트를 실행하여 Secundus용 리소스를 설정합니다. 이 단계의 일부로 다음 리소스가 생성됩니다.
- Secundus에서 추론을 실행하기 위해 샘플 이미지를 저장할 Cloud Storage 버킷 (
$SECUNDUS_INPUT_STORAGE_BUCKET
)입니다. - Secundus에서 실행한 ML 워크로드 실행 결과를 저장할 Cloud Storage 버킷 (
$SECUNDUS_RESULT_STORAGE_BUCKET
)입니다.
이 Codelab의 일부 샘플 이미지는 여기에서 확인할 수 있습니다.
./setup_secundus_company_resources.sh
3. 워크로드 만들기
워크로드 서비스 계정 만들기
이제 필요한 역할과 권한이 있는 워크로드의 서비스 계정을 만들어 보겠습니다. 다음 스크립트를 실행하여 Secundus 프로젝트에 워크로드 서비스 계정을 만듭니다. 이 서비스 계정은 ML 워크로드를 실행하는 VM에서 사용됩니다.
이 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT
)에 다음 역할이 부여됩니다.
- 증명 토큰 가져오기에 필요한
confidentialcomputing.workloadUser
logging.logWriter
: Cloud Logging에 로그를 작성합니다.$SECUNDUS_INPUT_STORAGE_BUCKET
Cloud Storage 버킷에서 데이터를 읽기 위한objectViewer
권한objectUser
: 워크로드 결과를$SECUNDUS_RESULT_STORAGE_BUCKET
Cloud Storage 버킷에 씁니다.
./create_workload_service_account.sh
워크로드 만들기
이 단계에서는 워크로드 Docker 이미지를 만듭니다. 워크로드는 Primus가 작성하게 됩니다. 이 Codelab에서 사용하는 워크로드는 Primus의 스토리지 버킷에 저장된 ML 모델에 액세스하고 스토리지 버킷에 저장된 샘플 이미지로 추론을 실행하는 머신러닝 Python 코드입니다.
Primus의 스토리지 버킷에 저장된 머신러닝 모델은 필수 속성 조건을 충족하는 워크로드에서만 액세스할 수 있습니다. 이러한 속성 조건은 워크로드 승인에 관한 다음 섹션에서 자세히 설명합니다.
다음은 이 Codelab에서 만들고 사용할 워크로드의 run_inference() 메서드입니다. 전체 워크로드 코드는 여기에서 확인할 수 있습니다.
def run_inference(image_path, model):
try:
# Read and preprocess the image
image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
image = tf.image.resize(image, (128, 128))
image = tf.image.convert_image_dtype(image, tf.float32)
image = tf.expand_dims(image, axis=0)
# Get predictions from the model
predictions = model(image)
predicted_class = np.argmax(predictions)
top_k = 5
top_indices = np.argsort(predictions[0])[-top_k:][::-1]
# Convert top_indices to a TensorFlow tensor
top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)
# Use TensorFlow tensor for indexing
top_scores = tf.gather(predictions[0], top_indices_tensor)
return {
"predicted_class": int(predicted_class),
"top_k_predictions": [
{"class_index": int(idx), "score": float(score)}
for idx, score in zip(top_indices, top_scores)
],
}
except Exception as e:
return {"error": str(e)}
다음 스크립트를 실행하여 다음 단계가 수행되는 워크로드를 만듭니다.
- Primus가 소유한 Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY
)를 만듭니다. - 필수 리소스 이름으로 워크로드 코드를 업데이트합니다.
- ML 워크로드를 빌드하고 워크로드 코드의 Docker 이미지를 빌드하기 위한 Dockerfile을 만듭니다. 여기는 이 Codelab에 사용된 Dockerfile입니다.
- Docker 이미지를 빌드하여 Primus가 소유한 Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY
)에 게시합니다. $WORKLOAD_SERVICEACCOUNT
에$PRIMUS_ARTIFACT_REGISTRY
의 읽기 권한을 부여합니다. 이 작업은 워크로드 컨테이너가 Artifact Registry에서 워크로드 Docker 이미지를 가져오는 데 필요합니다.
./create_workload.sh
또한 모델을 사용하기 전에 모델의 해시 또는 서명을 확인하여 예상 버전의 머신러닝 모델이 로드되고 있는지 확인할 수 있도록 워크로드를 코딩할 수 있습니다. 이러한 추가 검사의 이점은 머신러닝 모델의 무결성을 보장한다는 것입니다. 이 경우 워크로드 운영자가 다른 버전의 ML 모델을 사용할 것으로 예상되는 경우 워크로드 이미지 또는 해당 매개변수도 업데이트해야 합니다.
4. 워크로드 승인 및 실행
워크로드 승인
Primus는 다음 리소스의 속성을 기반으로 머신러닝 모델에 액세스할 수 있도록 워크로드를 승인하려고 합니다.
- 내용: 확인된 코드
- 위치: 안전한 환경
- 대상: 신뢰할 수 있는 통신사
Primus는 워크로드 아이덴티티 제휴를 사용하여 이러한 요구사항에 따라 액세스 정책을 적용합니다. 워크로드 아이덴티티 제휴를 사용하면 속성 조건을 지정할 수 있습니다. 이러한 조건은 워크로드 아이덴티티 풀 (WIP)으로 인증할 수 있는 ID를 제한합니다. 증명 확인자 서비스를 워크로드 아이덴티티 풀 제공업체로 WIP에 추가하여 측정값을 표시하고 정책을 시행할 수 있습니다.
워크로드 아이덴티티 풀은 이전에 클라우드 리소스 설정 단계의 일부로 이미 생성되었습니다. 이제 Primus가 새 OIDC 워크로드 아이덴티티 풀 제공업체를 만듭니다. 지정된 --attribute-condition
가 워크로드 컨테이너에 대한 액세스를 승인합니다. 이를 위한 요구사항은 다음과 같습니다.
- 내용:
$PRIMUS_ARTIFACT_REPOSITORY
저장소에 업로드된 최신$WORKLOAD_IMAGE_NAME
입니다. - 위치: Confidential Space의 신뢰할 수 있는 실행 환경은 완전히 지원되는 Confidential Space VM 이미지에서 실행 중입니다.
- 대상: Secundus
$WORKLOAD_SERVICE_ACCOUNT
서비스 계정.
export WORKLOAD_IMAGE_DIGEST=$(docker images –digests ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}| awk 'NR>1{ print $3 }')
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
'STABLE' in assertion.submods.confidential_space.support_attributes &&
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICEACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
워크로드 실행
이 단계의 일환으로 Confidential Space VM에서 워크로드를 실행합니다. 필수 TEE 인수는 메타데이터 플래그를 사용하여 전달됩니다. 워크로드 컨테이너의 인수는 'tee-cmd
'를 사용하여 전달됩니다. 부분의 구분이 필요합니다. 워크로드 실행 결과가 $SECUNDUS_RESULT_STORAGE_BUCKET
에 게시됩니다.
gcloud config set project $SECUNDUS_PROJECT_ID
gcloud compute instances create ${WORKLOAD_VM} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=TERMINATE \
--scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata ^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
결과 보기
워크로드가 성공적으로 완료되면 ML 워크로드의 결과가 $SECUNDUS_RESULT_STORAGE_BUCKET
에 게시됩니다.
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
다음은 샘플 이미지에 대한 추론 결과의 몇 가지 예입니다.
Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}
Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}
Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}
Secundus 스토리지 버킷에 있는 각 샘플 이미지에 대해 결과에 항목이 표시됩니다. 이 항목에는 두 가지 주요 정보가 포함됩니다.
- predict_class의 색인: 모델이 이미지가 속할 것으로 예측하는 클래스를 나타내는 숫자 색인입니다.
- Top_k_predictions: 이미지에 대한 예측을 최대 k개까지 제공하며 확률이 가장 높은 것부터 가장 낮은 것 순으로 제공됩니다. 이 Codelab에서는 k의 값이 5로 설정되어 있지만 워크로드 코드에서 이 값을 조정하여 더 많이 또는 더 적게 예측을 얻을 수 있습니다.
클래스 색인을 인간이 읽을 수 있는 클래스 이름으로 변환하려면 여기에서 사용할 수 있는 라벨 목록을 참고하세요. 예를 들어 클래스 색인 2는 클래스 라벨 'tench'에 해당합니다. 표시됩니다.
이 Codelab에서는 Primus가 소유한 모델이 TEE에서 실행되는 워크로드에만 출시된다는 점을 입증했습니다. Secundus는 TEE에서 ML 워크로드를 실행하며 이 워크로드는 Primus가 소유한 모델을 사용할 수 있는 반면 Primus는 모델에 대한 완전한 제어를 유지합니다.
승인되지 않은 워크로드 실행
Secundus는 Primus에서 승인하지 않은 자체 아티팩트 저장소에서 다른 워크로드 이미지를 가져와 워크로드 이미지를 변경합니다. Primus의 워크로드 아이덴티티 풀에서 워크로드 이미지 ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
개만 승인했습니다.
워크로드 재실행
Secundus가 이 새 워크로드 이미지로 원래 워크로드를 실행하려고 하면 실패합니다. 오류를 보려면 원본 결과 파일과 VM 인스턴스를 삭제한 후 워크로드를 다시 실행해 보세요.
Secundus의 Artifact Registry (us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
)에 게시된 새 Docker 이미지가 있고 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT
)에 이 새 워크로드 이미지를 읽을 수 있는 Artifact Registry 리더 권한이 부여되었는지 확인하세요. 이는 Primus의 WIP 정책이 워크로드에서 제시한 토큰을 거부하기 전에 워크로드가 종료되지 않도록 하기 위함입니다.
기존 결과 파일 및 VM 인스턴스 삭제
- 프로젝트를
$SECUNDUS_PROJECT_ID
프로젝트로 설정합니다.
gcloud config set project $SECUNDUS_PROJECT_ID
- 결과 파일을 삭제합니다.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
- 컨피덴셜 VM 인스턴스를 삭제합니다.
gcloud compute instances delete ${WORKLOAD_VM}
승인되지 않은 워크로드를 실행합니다.
gcloud compute instances create ${WORKLOAD_VM} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=TERMINATE \
--scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
오류 보기
워크로드 결과 대신 오류 (The given credential is rejected by the attribute condition
)가 표시됩니다.
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
5. 삭제
여기는 이 Codelab의 일부로 만든 리소스를 정리하는 데 사용할 수 있는 스크립트입니다. 이 삭제의 일환으로 다음 리소스가 삭제됩니다.
- Primus의 입력 스토리지 버킷 (
$PRIMUS_INPUT_STORAGE_BUCKET)
. - Primus 서비스 계정 (
$PRIMUS_SERVICEACCOUNT
). - Primus의 아티팩트 저장소 (
$PRIMUS_ARTIFACT_REPOSITORY
). - Primus 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) - Secundus (
$WORKLOAD_SERVICEACCOUNT
)의 워크로드 서비스 계정입니다. - Secundus의 입력 스토리지 버킷 (
$SECUNDUS_INPUT_STORAGE_BUCKET)
. - 워크로드 컴퓨팅 인스턴스
- Secundus의 결과 스토리지 버킷 (
$SECUNDUS_RESULT_STORAGE_BUCKET
)
$ ./cleanup.sh
탐색을 마쳤으면 프로젝트를 삭제하는 것이 좋습니다.
- Cloud Platform Console로 이동합니다.
- 종료할 프로젝트를 선택한 후 '삭제'를 클릭하세요. 상단: 프로젝트 삭제가 예약됩니다.
다음 단계
다음과 같은 유사한 Codelab을 확인해 보세요.