Confidential Space를 사용하여 ML 모델 및 지적 재산 보호

1. 개요

Confidential Space는 여러 당사자 간의 협업을 위한 안전한 환경을 제공합니다. 이 Codelab에서는 컨피덴셜 스페이스를 사용하여 머신러닝 모델과 같은 민감한 지식 재산을 보호하는 방법을 보여줍니다.

이 Codelab에서는 Confidential Space를 사용하여 한 회사가 모델을 사용하려는 다른 회사와 독점 머신러닝 모델을 안전하게 공유할 수 있도록 합니다. 특히 Company Primus에는 Confidential Space에서 실행되는 워크로드에만 출시되는 머신러닝 모델이 있어 Primus가 지식 재산에 대한 완전한 제어권을 유지할 수 있습니다. Company Secundus는 워크로드 운영자이며 컨피덴셜 스페이스에서 머신러닝 워크로드를 실행합니다. Secundus는 이 모델을 로드하고 Secundus가 소유한 샘플 데이터를 사용하여 추론을 실행합니다.

여기서 Primus는 워크로드 코드를 작성하는 워크로드 작성자이자 신뢰할 수 없는 워크로드 운영자인 Secundus로부터 지식 재산을 보호하려는 공동작업자입니다. Secundus는 머신러닝 워크로드의 워크로드 운영자입니다.

5a86c47d935da998.jpeg

학습할 내용

  • 한 당사자가 지식 재산에 대한 통제권을 잃지 않고 다른 당사자와 독점 ML 모델을 공유할 수 있는 환경을 구성하는 방법

필요한 항목

Confidential Space 설정에 관련된 역할

이 Codelab에서 Company Primus는 리소스 소유자이자 워크로드 작성자로서 다음을 담당합니다.

  1. 머신러닝 모델로 필수 클라우드 리소스 설정
  2. 워크로드 코드 작성
  3. 워크로드 이미지 게시
  4. 신뢰할 수 없는 운영자로부터 ML 모델을 보호하도록 워크로드 아이덴티티 풀 정책 구성

Secundus Company는 운영자로서 다음을 담당합니다.

  1. 워크로드에서 사용하는 샘플 이미지와 결과를 저장하는 데 필요한 클라우드 리소스 설정
  2. Primus에서 제공한 모델을 사용하여 Confidential Space에서 ML 워크로드 실행

Confidential Space 작동 방식

Confidential Space에서 워크로드를 실행하면 구성된 리소스를 사용하여 다음 프로세스가 진행됩니다.

  1. 워크로드가 워크로드 아이덴티티 풀에서 $PRIMUS_SERVICEACCOUNT의 일반 Google 액세스 토큰을 요청합니다. 워크로드 및 환경 클레임이 포함된 증명 검증 도구 서비스 토큰을 제공합니다.
  2. 증명 검증 도구 서비스 토큰의 워크로드 측정 클레임이 WIP의 속성 조건과 일치하면 $PRIMUS_SERVICEACCOUNT.의 액세스 토큰을 반환합니다.
  3. 워크로드는 $PRIMUS_SERVICEACCOUNT와 연결된 서비스 계정 액세스 토큰을 사용하여 $PRIMUS_INPUT_STORAGE_BUCKET 버킷에 저장된 머신러닝 모델에 액세스합니다.
  4. 워크로드는 Secundus가 소유한 데이터에 작업을 실행하며 해당 워크로드는 Secundus가 프로젝트에서 운영하고 실행합니다.
  5. 워크로드는 $WORKLOAD_SERVICEACCOUNT 서비스 계정을 사용하여 해당 작업의 결과를 $SECUNDUS_RESULT_STORAGE_BUCKET 버킷에 씁니다.

2. Cloud 리소스 설정

시작하기 전에

  • 아래 명령어를 사용하여 이 저장소를 클론하여 이 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>
  • 프로젝트에 결제를 사용 설정합니다.
  • 두 프로젝트 모두에 대해 Confidential Computing 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')
  1. Primus 프로젝트의 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Primus 프로젝트의 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않은 경우 클라우드 리소스 이름이 프로젝트 이름에서 생성되고 해당 이름으로 새 클라우드 리소스가 생성됩니다. 다음은 리소스 이름에 지원되는 변수입니다.

$PRIMUS_INPUT_STORAGE_BUCKET

Primus의 머신러닝 모델을 저장하는 버킷입니다.

$PRIMUS_WORKLOAD_IDENTITY_POOL

클레임을 검증하는 Primus의 워크로드 아이덴티티 풀 (WIP)입니다.

$PRIMUS_WIP_PROVIDER

증명 검증 도구 서비스에서 서명한 토큰에 사용할 승인 조건을 포함하는 Primus의 워크로드 아이덴티티 풀 제공업체입니다.

$PRIMUS_SERVICE_ACCOUNT

$PRIMUS_WORKLOAD_IDENTITY_POOL가 보호된 리소스 (이 Codelab의 ML 모델)에 액세스하는 데 사용하는 Primus 서비스 계정입니다. 이 단계에서는 $PRIMUS_INPUT_STORAGE_BUCKET 버킷에 저장된 머신러닝 모델을 읽을 수 있는 권한이 있습니다.

$PRIMUS_ARTIFACT_REPOSITORY

워크로드 Docker 이미지가 푸시될 아티팩트 저장소입니다.

  1. Secundus 프로젝트의 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Secundus 프로젝트의 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않은 경우 클라우드 리소스 이름이 프로젝트 이름에서 생성되고 해당 이름으로 새 클라우드 리소스가 생성됩니다. 다음은 리소스 이름에 지원되는 변수입니다.

$SECUNDUS_INPUT_STORAGE_BUCKET

Secundus가 Primus에서 제공한 모델을 사용하여 분류하려는 샘플 이미지를 저장하는 버킷입니다.

$SECUNDUS_RESULT_STORAGE_BUCKET

워크로드 결과를 저장하는 버킷입니다.

$WORKLOAD_IMAGE_NAME

워크로드 컨테이너 이미지의 이름입니다.

$WORKLOAD_IMAGE_TAG

워크로드 컨테이너 이미지의 태그입니다.

$WORKLOAD_SERVICE_ACCOUNT

워크로드를 실행하는 컨피덴셜 VM에 액세스할 수 있는 권한이 있는 서비스 계정입니다.

  • 이 두 프로젝트에 대해 특정 권한이 필요하며 GCP 콘솔을 사용하여 IAM 역할을 부여하는 방법은 이 가이드를 참고하세요.
  • $PRIMUS_PROJECT_ID의 경우 스토리지 관리자, Artifact Registry 관리자, 서비스 계정 관리자, IAM 워크로드 아이덴티티 풀 관리자가 필요합니다.
  • $SECUNDUS_PROJECT_ID의 경우 컴퓨팅 관리자, 스토리지 관리자, 서비스 계정 관리자, IAM 워크로드 아이덴티티 풀 관리자, 보안 관리자 (선택사항)가 필요합니다.
  • 다음 스크립트를 실행하여 나머지 변수 이름을 리소스 이름의 프로젝트 ID를 기반으로 하는 값으로 설정합니다.
source config_env.sh

Primus Company 리소스 설정

이 단계에서는 Primus에 필요한 클라우드 리소스를 설정합니다. 다음 스크립트를 실행하여 Primus의 리소스를 설정합니다. 다음 리소스는 스크립트 실행의 일부로 생성됩니다.

  • Primus의 머신러닝 모델을 저장할 Cloud Storage 버킷 ($PRIMUS_INPUT_STORAGE_BUCKET)
  • 공급자 아래에 구성된 속성 조건을 기반으로 클레임을 검증하는 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)
  • 클라우드 스토리지 버킷에서 데이터를 읽고 (objectViewer 역할 사용) 이 서비스 계정을 워크로드 아이덴티티 풀에 연결 (roles/iam.workloadIdentityUser 역할 사용)하는 IAM 액세스 권한이 있는 위에 언급된 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)에 연결된 서비스 계정 ($PRIMUS_SERVICEACCOUNT)

이 클라우드 리소스 설정의 일환으로 TensorFlow 모델을 사용합니다. 모델의 아키텍처, 가중치, 학습 구성을 포함한 전체 모델을 ZIP 보관 파일에 저장할 수 있습니다. 이 Codelab에서는 여기에서 찾을 수 있는 ImageNet 데이터 세트로 학습된 MobileNet V1 모델을 사용합니다.

./setup_primus_company_resources.sh

위에서 언급한 스크립트는 클라우드 리소스를 설정합니다. 이제 스크립트로 만든 Cloud Storage 버킷에 모델을 다운로드하고 게시합니다.

  1. 여기에서 사전 학습된 모델을 다운로드합니다.
  2. 다운로드가 완료되면 다운로드된 tar 파일의 이름을 model.tar.gz로 변경합니다.
  3. 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 워크로드 실행 결과를 저장하는 클라우드 스토리지 버킷 ($SECUNDUS_RESULT_STORAGE_BUCKET)

이 Codelab에서는 일부 샘플 이미지를 여기에서 사용할 수 있습니다.

./setup_secundus_company_resources.sh

3. 워크로드 만들기

워크로드 서비스 계정 만들기

이제 필요한 역할과 권한이 있는 워크로드의 서비스 계정을 만듭니다. 다음 스크립트를 실행하여 Secundus 프로젝트에 워크로드 서비스 계정을 만듭니다. 이 서비스 계정은 ML 워크로드를 실행하는 VM에서 사용됩니다.

이 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT)에는 다음 역할이 있습니다.

  • confidentialcomputing.workloadUser을 사용하여 증명 토큰을 가져옵니다.
  • logging.logWriter를 사용하여 Cloud Logging에 로그를 작성합니다.
  • objectViewer를 사용하여 $SECUNDUS_INPUT_STORAGE_BUCKET 클라우드 스토리지 버킷에서 데이터를 읽습니다.
  • 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을 확인할 수 있습니다.
  • Primus 소유의 Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY)에 Docker 이미지를 빌드하고 게시합니다.
  • $PRIMUS_ARTIFACT_REGISTRY에 대한 $WORKLOAD_SERVICEACCOUNT 읽기 권한을 부여합니다. 이는 워크로드 컨테이너가 Artifact Registry에서 워크로드 Docker 이미지를 가져오는 데 필요합니다.
./create_workload.sh

또한 워크로드는 사용하기 전에 모델의 해시 또는 서명을 확인하여 예상되는 버전의 머신러닝 모델을 로드하도록 코딩할 수 있습니다. 이러한 추가 검사의 장점은 머신러닝 모델의 무결성을 보장한다는 것입니다. 따라서 워크로드가 서로 다른 버전의 ML 모델을 사용해야 하는 경우 워크로드 운영자도 워크로드 이미지나 매개변수를 업데이트해야 합니다.

4. 워크로드 승인 및 실행

워크로드 승인

Primus는 다음 리소스의 속성을 기반으로 워크로드가 머신러닝 모델에 액세스하도록 승인하려고 합니다.

  • 내용: 인증된 코드
  • 위치: 안전한 환경
  • 누구: 신뢰할 수 있는 운영자

Primus는 워크로드 아이덴티티 제휴를 사용하여 이러한 요구사항에 기반한 액세스 정책을 적용합니다. 워크로드 아이덴티티 제휴를 사용하면 속성 조건을 지정할 수 있습니다. 이러한 조건은 워크로드 아이덴티티 풀 (WIP)로 인증할 수 있는 ID를 제한합니다. 증명 검증 도구 서비스를 WIP에 워크로드 아이덴티티 풀 공급업체로 추가하여 측정을 제공하고 정책을 적용할 수 있습니다.

워크로드 아이덴티티 풀은 클라우드 리소스 설정 단계의 일부로 이미 이전에 생성되었습니다. 이제 Primus가 새 OIDC 워크로드 아이덴티티 풀 공급업체를 만듭니다. 지정된 --attribute-condition는 워크로드 컨테이너에 대한 액세스를 승인합니다. 이를 위한 요구사항은 다음과 같습니다.

  • 내용: 최신 $WORKLOAD_IMAGE_NAME$PRIMUS_ARTIFACT_REPOSITORY 저장소에 업로드되었습니다.
  • 위치: Confidential Space 신뢰할 수 있는 실행 환경이 완전히 지원되는 Confidential Space VM 이미지에서 실행됩니다.
  • Who: Secundus $WORKLOAD_SERVICE_ACCOUNT 서비스 계정
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
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"

워크로드 실행

이 단계에서는 컨피덴셜 스페이스 VM에서 워크로드를 실행합니다. 필수 TEE 인수는 메타데이터 플래그를 사용하여 전달됩니다. 워크로드 컨테이너의 인수는 플래그의 'tee-cmd' 부분을 사용하여 전달됩니다. 워크로드 실행 결과가 $SECUNDUS_RESULT_STORAGE_BUCKET에 게시됩니다.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --project=${SECUNDUS_PROJECT_ID} \
 --maintenance-policy=MIGRATE \
 --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 스토리지 버킷의 각 샘플 이미지에 대해 결과에 항목이 표시됩니다. 이 항목에는 다음과 같은 두 가지 주요 정보가 포함됩니다.

  • 예측된 클래스의 색인: 모델이 이미지가 속한다고 예측하는 클래스를 나타내는 숫자 색인입니다.
  • Top_k_predictions: 이미지에 대한 최대 k개의 예측을 제공하며, 가능성이 가장 높은 순서대로 순위가 지정됩니다. 이 Codelab에서는 k 값이 5로 설정되어 있지만 워크로드 코드에서 조정하여 예측을 더 많이 또는 더 적게 가져올 수 있습니다.

클래스 색인을 사람이 읽을 수 있는 클래스 이름으로 변환하려면 여기에서 사용 가능한 라벨 목록을 참고하세요. 예를 들어 클래스 색인이 2인 경우 라벨 목록의 클래스 라벨 'tench'에 해당합니다.

이 Codelab에서는 TEE에서 실행되는 워크로드에만 출시되는 Primus 소유 모델을 시연했습니다. 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 (us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG})의 Artifact Registry에 새 Docker 이미지가 게시되어 있고 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT)에 이 새 워크로드 이미지를 읽을 수 있는 Artifact Registry 리더 권한이 부여되어 있는지 확인하세요. 이는 워크로드가 Primus의 WIP 정책에서 워크로드가 제공한 토큰을 거부하기 전에 종료되지 않도록 하기 위한 것입니다.

기존 결과 파일 및 VM 인스턴스 삭제

  1. 프로젝트를 $SECUNDUS_PROJECT_ID 프로젝트로 설정합니다.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. 결과 파일을 삭제합니다.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. 컨피덴셜 VM 인스턴스를 삭제합니다.
gcloud compute instances delete ${WORKLOAD_VM} --zone=${SECUNDUS_PROJECT_ZONE}

승인되지 않은 워크로드를 실행합니다.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --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=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을 확인해 보세요.