1. نظرة عامة
توفّر ميزة المساحة الآمنة بيئة آمنة للتعاون بين جهات متعددة. يوضّح هذا الدرس العملي كيفية استخدام Confidential Space لحماية الملكية الفكرية الحسّاسة، مثل نماذج تعلُّم الآلة.
في هذا الدرس التطبيقي حول الترميز، ستستخدم Confidential Space لتمكين إحدى الشركات من مشاركة نموذج تعلُّم الآلة الخاص بها بشكل آمن مع شركة أخرى تريد استخدام النموذج. على وجه التحديد، لدى شركة Primus نموذج تعلُّم آلي لن يتم إصداره إلا لحِمل عمل يتم تشغيله في Confidential Space، ما يتيح لشركة Primus الاحتفاظ بالتحكّم الكامل في ملكيتها الفكرية. ستكون شركة Secundus هي مشغّل عبء العمل وستنفّذ عبء عمل تعلُّم الآلة في "مساحة سرية". سيحمّل Secundus هذا النموذج ويشغّل استنتاجًا باستخدام بيانات نموذجية مملوكة لـ Secundus.
في هذا المثال، Primus هو مؤلف عبء العمل الذي يكتب رمز عبء العمل، وهو أيضًا متعاون يريد حماية ملكيته الفكرية من مشغّل عبء العمل غير الموثوق به، Secundus. Secundus هو مشغّل أعباء العمل لأعباء عمل تعلُّم الآلة.

ما ستتعلمه
- كيفية إعداد بيئة يمكن لأحد الطرفين فيها مشاركة نموذج تعلُّم الآلة الخاص به مع طرف آخر بدون فقدان السيطرة على ملكيته الفكرية
المتطلبات
- مشروع على Google Cloud Platform
- معرفة أساسية بـ Google Compute Engine ( درس تطبيقي حول الترميز) وConfidential VM والحاويات والمستودعات البعيدة
- معرفة أساسية بحسابات الخدمة وWorkload Identity Federation وشروط السمات
الأدوار المشاركة في إعداد "مساحة سرية"
في هذا الدرس التطبيقي حول الترميز، ستكون شركة Primus هي مالك المورد ومؤلف عبء العمل، وستكون مسؤولة عمّا يلي:
- إعداد موارد السحابة الإلكترونية المطلوبة باستخدام نموذج تعلُّم آلي
- كتابة الرمز البرمجي لوحدة العمل
- نشر صورة حمل العمل
- ضبط سياسة Workload Identity Pool لحماية نموذج تعلُّم الآلة من مشغّل غير موثوق به
ستكون شركة Secundus هي المشغّل، وستكون مسؤولة عن:
- إعداد موارد السحابة الإلكترونية المطلوبة لتخزين الصور النموذجية التي تستخدمها أعباء العمل والنتائج
- تشغيل عبء عمل تعلُّم الآلة في Confidential Space باستخدام النموذج الذي توفّره Primus
طريقة عمل ميزة "مساحة للبيانات السرية"
عند تشغيل عبء العمل في Confidential Space، تتم العملية التالية باستخدام الموارد التي تم إعدادها:
- يطلب عبء العمل رمز دخول عامًا من Google إلى
$PRIMUS_SERVICEACCOUNTمن Workload Identity Pool. يوفّر رمزًا مميّزًا لخدمة "التحقّق من صحة الشهادة" يتضمّن مطالبات بشأن عبء العمل والبيئة. - إذا تطابقت مطالبات قياس عبء العمل في رمز خدمة التحقّق من صحة الشهادة مع شرط السمة في مجموعة معرّفات أعباء العمل، سيتم عرض رمز الدخول إلى
$PRIMUS_SERVICEACCOUNT.. - يستخدم عبء العمل رمز الدخول إلى حساب الخدمة المرتبط بـ
$PRIMUS_SERVICEACCOUNTللوصول إلى نموذج تعلُّم الآلة المخزَّن في حزمة$PRIMUS_INPUT_STORAGE_BUCKET. - ينفّذ عبء العمل عملية على البيانات التي تملكها شركة Secundus، وتتولّى شركة Secundus تشغيل عبء العمل هذا في مشروعها.
- يستخدم عبء العمل حساب الخدمة
$WORKLOAD_SERVICEACCOUNTلكتابة نتائج هذه العملية في الحزمة$SECUNDUS_RESULT_STORAGE_BUCKET.
2. إعداد "موارد السحابة"
قبل البدء
- استنسِخ هذا المستودع باستخدام الأمر أدناه للحصول على النصوص البرمجية المطلوبة التي يتم استخدامها كجزء من هذا الدرس التطبيقي حول الترميز.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- غيِّر الدليل الخاص بهذا الدرس البرمجي.
cd confidential-space/codelabs/ml_model_protection/scripts
- تأكَّد من ضبط متغيّرات بيئة المشروع المطلوبة كما هو موضّح أدناه. لمزيد من المعلومات حول إعداد مشروع على Google Cloud Platform، يُرجى الاطّلاع على هذا الدرس العملي. يمكنك الرجوع إلى هذا الرابط للحصول على تفاصيل حول كيفية استرداد رقم تعريف المشروع وكيفية اختلافه عن اسم المشروع ورقمه.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
- فعِّل الفوترة لمشاريعك.
- فعِّل واجهة برمجة التطبيقات Confidential Computing 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 |
| مجموعة معرّفات أعباء العمل (WIP) في Primus التي تتحقّق من صحة المطالبات. |
| موفّر مجموعة معرّفات أعباء العمل في Primus الذي يتضمّن شرط التفويض الذي سيتم استخدامه للرموز المميزة الموقَّعة من خدمة "التحقّق من صحة الشهادة" |
| حساب خدمة Primus الذي يستخدمه |
| مستودع العناصر حيث سيتم إرسال صورة Docker الخاصة بوحدة العمل. |
- يمكنك ضبط المتغيّرات التالية باستخدام أسماء موارد السحابة الإلكترونية الحالية في مشروع Secundus. في حال تم ضبط المتغيّر، سيتم استخدام مورد السحابة الإلكترونية الحالي المقابل من مشروع Secundus. إذا لم يتم ضبط المتغيّر، سيتم إنشاء اسم مورد السحابة الإلكترونية من اسم المشروع وسيتم إنشاء مورد سحابة إلكترونية جديد بهذا الاسم. في ما يلي المتغيرات المتاحة لأسماء الموارد:
| الحزمة التي تخزّن الصور النموذجية التي يريد Secundus تصنيفها باستخدام النموذج الذي يوفّره Primus. |
| الحزمة التي تخزِّن نتائج عبء العمل |
| تمثّل هذه السمة اسم صورة حاوية عبء العمل. |
| علامة صورة حاوية وحدة العمل |
| حساب الخدمة الذي لديه إذن بالوصول إلى Confidential VM الذي يشغّل عبء العمل |
- ستحتاج إلى أذونات معيّنة لهذين المشروعَين، ويمكنك الرجوع إلى هذا الدليل حول كيفية منح أدوار "إدارة الهوية وإمكانية الوصول" باستخدام وحدة تحكّم Google Cloud Platform:
- بالنسبة إلى
$PRIMUS_PROJECT_ID، ستحتاج إلى دور "مشرف التخزين" و"مشرف Artifact Registry" و"مشرف حساب الخدمة" و"مشرف مجموعة Workload Identity في IAM". - بالنسبة إلى
$SECUNDUS_PROJECT_ID، ستحتاج إلى "مشرف Compute" و"مشرف مساحة التخزين" و"مشرف حساب الخدمة" و"مشرف مجموعة Workload Identity في إدارة الهوية وإمكانية الوصول" و"مشرف الأمان" (اختياري). - نفِّذ البرنامج النصي التالي لضبط أسماء المتغيرات المتبقية على قيم استنادًا إلى رقم تعريف مشروعك لأسماء الموارد.
source config_env.sh
إعداد موارد شركة Primus
كجزء من هذه الخطوة، عليك إعداد موارد السحابة الإلكترونية المطلوبة لـ Primus. شغِّل النص البرمجي التالي لإعداد الموارد الخاصة بـ Primus. سيتم إنشاء الموارد التالية كجزء من تنفيذ النص البرمجي:
- حزمة التخزين في السحابة الإلكترونية (
$PRIMUS_INPUT_STORAGE_BUCKET) لتخزين نموذج تعلُّم الآلة الخاص بـ Primus - مجموعة المعلومات التعريفية (
$PRIMUS_WORKLOAD_IDENTITY_POOL) للتحقّق من صحة المطالبات استنادًا إلى شروط السمات التي تم ضبطها ضمن الموفِّر - حساب الخدمة (
$PRIMUS_SERVICEACCOUNT) المرتبط بمجموعة تعريفات عبء العمل المذكورة أعلاه ($PRIMUS_WORKLOAD_IDENTITY_POOL) مع إمكانية الوصول إلى "إدارة الهوية وإمكانية الوصول" لقراءة البيانات من حزمة التخزين في السحابة الإلكترونية (باستخدام دورobjectViewer) ولربط حساب الخدمة هذا بمجموعة تعريفات عبء العمل (باستخدام دورroles/iam.workloadIdentityUser).
وكجزء من عملية إعداد موارد السحابة الإلكترونية هذه، سنستخدم نموذج TensorFlow. يمكننا حفظ النموذج بأكمله الذي يتضمّن بنية النموذج والأوزان وإعدادات التدريب في أرشيف ZIP. لأغراض هذا الدرس التطبيقي حول الترميز، سنستخدم نموذج MobileNet V1 الذي تم تدريبه على مجموعة بيانات ImageNet المتوفّرة هنا.
./setup_primus_company_resources.sh
سيؤدي النص البرمجي المذكور أعلاه إلى إعداد مورد السحابة الإلكترونية، وسننزّل الآن النموذج وننشره في حزمة Cloud Storage التي أنشأها النص البرمجي.
- نزِّل النموذج المدرَّب مسبقًا من هنا.
- بعد تنزيله، أعِد تسمية ملف tar الذي تم تنزيله إلى model.tar.gz.
- انشر الملف model.tar.gz في حزمة Cloud Storage باستخدام الأمر التالي من الدليل الذي يحتوي على الملف model.tar.gz.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/
إعداد مراجع شركة Secundus
كجزء من هذه الخطوة، عليك إعداد موارد السحابة الإلكترونية المطلوبة لـ Secundus. شغِّل النص البرمجي التالي لإعداد الموارد الخاصة بـ Secundus. كجزء من هذه الخطوات، سيتم إنشاء المراجع التالية:
- حزمة التخزين في السحابة الإلكترونية (
$SECUNDUS_INPUT_STORAGE_BUCKET) لتخزين الصور النموذجية من أجل تنفيذ الاستنتاجات بواسطة Secundus - حزمة التخزين في السحابة الإلكترونية (
$SECUNDUS_RESULT_STORAGE_BUCKET) لتخزين نتيجة تنفيذ سير عمل تعلُّم الآلة بواسطة Secundus
تتوفّر بعض الصور النموذجية هنا لهذا الدرس العملي.
./setup_secundus_company_resources.sh
3- إنشاء حمل عمل
إنشاء حساب خدمة خاص بعبء العمل
الآن، عليك إنشاء حساب خدمة لعبء العمل مع الأدوار والأذونات المطلوبة. نفِّذ النص البرمجي التالي لإنشاء حساب خدمة عبء عمل في مشروع Secundus. سيتم استخدام حساب الخدمة هذا من قِبل الجهاز الظاهري الذي ينفّذ عبء عمل تعلُّم الآلة.
سيحصل حساب الخدمة الخاص بعبء العمل هذا ($WORKLOAD_SERVICEACCOUNT) على الأدوار التالية:
confidentialcomputing.workloadUserللحصول على رمز مميز للتصديقlogging.logWriterلكتابة السجلّات في Cloud LoggingobjectViewerلقراءة البيانات من حزمة التخزين في السحابة الإلكترونية$SECUNDUS_INPUT_STORAGE_BUCKETobjectUserلكتابة نتيجة عبء العمل في حزمة التخزين في السحابة الإلكترونية$SECUNDUS_RESULT_STORAGE_BUCKET
./create_workload_service_account.sh
إنشاء حمل عمل
كجزء من هذه الخطوة، ستنشئ صورة Docker لعبء العمل. سيتم إنشاء وحدة العمل بواسطة Primus. حِمل العمل المستخدَم في هذا الدرس التطبيقي حول الترميز هو رمز Python الخاص بتعلُّم الآلة والذي يصل إلى نموذج تعلُّم الآلة المخزَّن في حزمة تخزين Primus وينفّذ استنتاجات باستخدام الصور النموذجية المخزَّنة في حزمة تخزين.
لن يكون نموذج التعلّم الآلي المخزَّن في حزمة تخزين Primus متاحًا إلا لأحمال العمل التي تستوفي شروط السمات المطلوبة. يتم وصف شروط السمات هذه بمزيد من التفصيل في القسم التالي حول تفويض عبء العمل.
في ما يلي طريقة 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)}
نفِّذ البرنامج النصي التالي لإنشاء عبء عمل يتم فيه تنفيذ الخطوات التالية:
- أنشئ مستودع Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY) مملوكًا لشركة Primus. - عدِّل رمز عبء العمل باستخدام أسماء الموارد المطلوبة.
- أنشئ عبء عمل تعلُّم الآلة وأنشئ ملف Dockerfile لإنشاء صورة Docker لرمز عبء العمل. في ما يلي ملف Dockerfile المستخدَم في هذا الدرس التطبيقي.
- أنشئ صورة Docker وانشرها في Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY) المملوكة لشركة Primus. - امنح
$WORKLOAD_SERVICEACCOUNTإذن القراءة لـ$PRIMUS_ARTIFACT_REGISTRY. هذا الإذن مطلوب لكي يسحب حاوية عبء العمل صورة Docker لعبء العمل من Artifact Registry.
./create_workload.sh
بالإضافة إلى ذلك، يمكن ترميز أحمال العمل لضمان تحميل الإصدار المتوقّع من نموذج تعلُّم الآلة من خلال التحقّق من التجزئة أو التوقيع الخاص بالنموذج قبل استخدامه. تضمن هذه عمليات التحقّق الإضافية سلامة نموذج تعلُّم الآلة. وبذلك، على مشغّل عبء العمل أيضًا تعديل صورة عبء العمل أو مَعلماتها عندما يُتوقّع أن يستخدم عبء العمل إصدارات مختلفة من نموذج تعلُّم الآلة.
4. تفويض حمل العمل وتشغيله
منح الإذن لحمل العمل
تريد شركة Primus منح أحمال العمل الإذن بالوصول إلى نموذج تعلُّم الآلة استنادًا إلى سمات الموارد التالية:
- الوصف: رمز تم التحقّق منه
- المكان: بيئة آمنة
- المشغّل: مشغّل موثوق به
تستخدم Primus اتحاد هوية عبء العمل لفرض سياسة وصول استنادًا إلى هذه المتطلبات. تتيح لك ميزة "اتحاد موفّري هويات المستخدمين" تحديد شروط السمات. تفرض هذه الشروط قيودًا على الهويات التي يمكنها المصادقة باستخدام مجموعة معرّفات أعباء العمل (WIP). يمكنك إضافة خدمة Attestation Verifier إلى WIP بصفتها موفِّر مجموعة هوية عبء العمل لعرض القياسات وفرض السياسة.
تم إنشاء مجموعة المعلومات التعريفية سابقًا كجزء من خطوة إعداد موارد السحابة. سينشئ Primus الآن موفِّرًا جديدًا لمجموعة معلومات تعريفية للمعالجة باستخدام OIDC. يمنح --attribute-condition المحدّد إذن الوصول إلى حاوية عبء العمل. يتطلّب ذلك ما يلي:
- التعديل: أحدث إصدار من
$WORKLOAD_IMAGE_NAMEتم تحميله إلى مستودع$PRIMUS_ARTIFACT_REPOSITORY. - المكان: تعمل بيئة التنفيذ الموثوقة في "مساحة للبيانات السرية" على صورة الجهاز الافتراضي المتوافقة بالكامل مع "مساحة للبيانات السرية".
- المستخدم: حساب خدمة 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"
تشغيل حجم المعالجة
كجزء من هذه الخطوة، سنشغّل عبء العمل في الجهاز الافتراضي Confidential Space. يتم تمرير وسيطات 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}
عرض النتائج
بعد اكتمال عبء العمل بنجاح، سيتم نشر نتيجة عبء عمل تعلُّم الآلة في $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، سيظهر لك إدخال في النتائج. سيتضمّن هذا الإدخال معلومات أساسية:
- فهرس predicted_class: هذا فهرس رقمي يمثّل الفئة التي يتوقّع النموذج أنّ الصورة تنتمي إليها.
- Top_k_predictions: يقدّم هذا الحقل ما يصل إلى k من التوقّعات للصورة، ويتم ترتيبها من الأكثر احتمالاً إلى الأقل احتمالاً. تم ضبط قيمة k على 5 في هذا الدرس التطبيقي حول الترميز، ولكن يمكنك تعديلها في رمز عبء العمل للحصول على المزيد من التوقّعات أو عدد أقل منها.
لترجمة فهرس الفئات إلى اسم فئة يمكن قراءته، يُرجى الرجوع إلى قائمة التصنيفات المتاحة هنا. على سبيل المثال، إذا رأيت فهرس فئة بقيمة 2، فهذا يعني أنّه يتوافق مع تصنيف الفئة "tench" في قائمة التصنيفات.
في هذا الدرس التطبيقي حول الترميز، أوضحنا أنّ Primus يملك نموذجًا يتم إصداره فقط إلى عبء العمل الذي يتم تشغيله في بيئة تنفيذ موثوقة. تنفّذ Secundus عبء عمل تعلُّم الآلة في بيئة تنفيذ موثوقة، ويمكن لعبء العمل هذا استخدام النموذج الذي تملكه 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 تشغيل عبء العمل الأصلي باستخدام صورة عبء العمل الجديدة هذه، ستحدث مشكلة. لعرض الخطأ، احذف ملف النتائج الأصلي والجهاز الافتراضي، ثم حاوِل تشغيل عبء العمل مرة أخرى.
يُرجى التأكّد من نشر صورة docker جديدة ضمن Artifact Registry الخاص بـ Secundus (بالاسم us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}) ومنح حساب الخدمة الخاص بعبء العمل ($WORKLOAD_SERVICEACCOUNT) إذن القراءة من Artifact Registry لقراءة صورة عبء العمل الجديدة هذه. يتم ذلك لضمان عدم إنهاء عبء العمل قبل أن ترفض سياسة WIP في Primus الرمز المميز الذي يقدّمه عبء العمل.
حذف ملف النتائج الحالي ومثيل الجهاز الافتراضي
- اضبط المشروع على مشروع
$SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
- احذف ملف النتائج.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
- احذف مثيل Confidential 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- تنظيف
في ما يلي البرنامج النصي الذي يمكن استخدامه لتنظيف الموارد التي أنشأناها كجزء من هذا الدرس التطبيقي حول الترميز. وكجزء من عملية التنظيف هذه، سيتم حذف الموارد التالية:
- حزمة التخزين المدخَلة في Primus (
$PRIMUS_INPUT_STORAGE_BUCKET) - حساب خدمة Primus (
$PRIMUS_SERVICEACCOUNT) - مستودع العناصر في Primus (
$PRIMUS_ARTIFACT_REPOSITORY) - مجموعة Primus Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL) - حساب خدمة عبء العمل في Secundus (
$WORKLOAD_SERVICEACCOUNT) - حزمة التخزين المدخَلة في Secundus (
$SECUNDUS_INPUT_STORAGE_BUCKET) - Workload Compute Instances
- حزمة تخزين النتائج في Secundus (
$SECUNDUS_RESULT_STORAGE_BUCKET)
$ ./cleanup.sh
إذا انتهيت من استكشاف المشروع، يُرجى التفكير في حذفه.
- انتقِل إلى وحدة تحكّم Cloud Platform.
- اختَر المشروع الذي تريد إيقافه، ثم انقر على "حذف" في أعلى الصفحة: يؤدي ذلك إلى تحديد موعد لحذف المشروع.
ما هي الخطوات التالية؟
اطّلِع على بعض دروس الترميز التطبيقية المشابهة...