1. نظرة عامة
توفّر المساحة السرية بيئة آمنة للتعاون بين جهات متعددة. يوضّح هذا الدليل التعليمي كيفية استخدام "مساحة سرية" لحماية الملكية الفكرية الحسّاسة، مثل نماذج تعلُّم الآلة.
في هذا الدليل التعليمي حول رموز البرامج، ستستخدم ميزة "مساحة سرية" لتمكين شركة من مشاركة نموذج تعلُّم الآلة الخاص بها بأمان مع شركة أخرى تريد استخدام النموذج. على وجه التحديد، تمتلك شركة Primus نموذج تعلُّم آلي لن يتم إصداره إلا لتحميل عمل يتم تشغيله في "المساحة السرية"، ما يتيح لشركة Primus الاحتفاظ بالسيطرة الكاملة على ملكيتها الفكرية. ستكون "الشركة الثانية" هي مشغّل حمولة العمل وستشغّل حمولة تعلُّم الآلة في "مساحة سرية". ستحمِّل شركة Secundus هذا النموذج وستنفذ عملية استنتاج باستخدام عيّنة بيانات تملكها شركة Secundus.
في هذه الحالة، "بريموس" هو مؤلف رمز الحمولة، وهو أيضًا متعاون يريد حماية ملكيته الفكرية من "سيكوندوس"، وهو مشغّل الحمولة غير الموثوق به. Secundus هو مشغّل عبء العمل لميزة "التعرّف على الصور".
ما ستتعرّف عليه
- كيفية ضبط بيئة يمكن فيها لأحد الطرفين مشاركة نموذج الذكاء الاصطناعي المملوك له مع طرف آخر بدون فقدان السيطرة على ملكيته الفكرية
المتطلبات
- مشروع على Google Cloud Platform
- معرفة أساسية بخدمة Google Compute Engine ( codelab) والأجهزة الافتراضية المخصّصة للبيانات السرية والحاويات والمستودعات البعيدة
- معرفة أساسية بحسابات الخدمة واتحاد هوية حِزم العمل وشروط السمات
الأدوار المعنيّة بإعداد "مساحة سرية"
في هذا الدليل التعليمي حول رموز البرامج، ستكون شركة Primus مالك الموارد ومؤلف أعباء العمل، وستكون مسؤولة عن ما يلي:
- إعداد موارد السحابة الإلكترونية المطلوبة باستخدام نموذج تعلُّم آلي
- كتابة رمز الحمولة
- نشر صورة "حمل العمل"
- ضبط سياسة Workload Identity Pool لحماية نموذج تعلُّم الآلة من مشغّل غير موثوق به
ستكون شركة "الثاني" هي المشغّل، وستكون مسؤولة عن ما يلي:
- إعداد موارد السحابة الإلكترونية المطلوبة لتخزين عيّنات الصور المستخدَمة في أعباء العمل والنتائج
- تشغيل حمولة تعلُّم الآلة في "مساحة سرية" باستخدام النموذج المقدَّم من Primus
آلية عمل "المساحة السرية"
عند تشغيل حمولة العمل في Confidential Space، تحدث العملية التالية باستخدام الموارد التي تم ضبطها:
- تطلب "حمّلة العمل" الحصول على رمز وصول عام من Google لـ
$PRIMUS_SERVICEACCOUNT
من مجموعة معرّفات أعباء العمل. ويقدّم رمزًا مميزًا لخدمة "أداة التحقّق من الإثبات" مع مطالبات بحمولة العمل والبيئة. - إذا كانت مطالبات قياس حمولة العمل في رمز خدمة التحقّق من الإثبات تتطابق مع شرط السمة في "الحالة قيد التقدّم"، يتم عرض رمز الوصول إلى
$PRIMUS_SERVICEACCOUNT.
. - تستخدِم حِزمة العمل رمز دخول حساب الخدمة المرتبط بـ
$PRIMUS_SERVICEACCOUNT
للوصول إلى نموذج تعلُّم الآلة المخزَّن في حزمة$PRIMUS_INPUT_STORAGE_BUCKET
. - تُجري "وحدة العمل" عملية على البيانات التي يملكها "الثاني"، ويكون "الثاني" هو من يشغّل "وحدة العمل" في مشروعه.
- تستخدِم حِزمة العمل حساب الخدمة
$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. في حال عدم ضبط المتغيّر، سيتم إنشاء اسم مورد السحابة الإلكترونية من project-name وسيتم إنشاء مورد جديد للسحابة الإلكترونية بهذا الاسم. في ما يلي المتغيّرات المتوافقة لأسماء الموارد:
| الحزمة التي تخزِّن نموذج تعلُّم الآلة لخدمة Primus |
| مجموعة المعلومات التعريفية للمعالجة (WIP) في Primus التي تتحقّق من صحة المطالبات |
| موفِّر مجموعة معرّفات أعباء العمل في Primus الذي يتضمّن شرط التفويض لاستخدام الرموز المميزة التي وقّعت عليها خدمة "أداة التحقّق من المصادقة" |
| حساب خدمة Primus الذي يستخدمه |
| مستودع العناصر التي سيتمّ دفع صورة Docker لتحميل العمل عليها. |
- يمكنك ضبط المتغيّرات التالية باستخدام أسماء موارد السحابة الإلكترونية الحالية في مشروع Secundus. في حال ضبط المتغيّر، سيتم استخدام مورد السحابة الإلكترونية الحالي المقابل من مشروع Secundus. في حال عدم ضبط المتغيّر، سيتم إنشاء اسم مورد السحابة الإلكترونية من اسم المشروع وسيتم إنشاء مورد جديد للسحابة الإلكترونية بهذا الاسم. في ما يلي المتغيّرات المتوافقة لأسماء الموارد:
| الحزمة التي تخزِّن عيّنات الصور التي يريد "ثاني" تصنيفها باستخدام النموذج الذي يوفّره "أول" |
| الحزمة التي تخزِّن نتائج عبء العمل |
| اسم صورة حاوية "وحدة العمل" |
| علامة صورة حاوية عبء العمل |
| حساب الخدمة الذي لديه إذن بالوصول إلى "الخادم الافتراضي السري" الذي يشغّل "حمل العمل". |
- ستحتاج إلى أذونات معيّنة لهذين المشروعَين، ويمكنك الرجوع إلى هذا الدليل حول كيفية منح أدوار "إدارة الهوية وإمكانية الوصول" باستخدام وحدة تحكّم Google Cloud Platform:
- بالنسبة إلى
$PRIMUS_PROJECT_ID
، ستحتاج إلى "مشرف التخزين" و"مشرف سجلّ العناصر" و"مشرف حساب الخدمة" و"مشرف مجموعة عناوين العمل في إدارة الهوية وإمكانية الوصول". - بالنسبة إلى
$SECUNDUS_PROJECT_ID
، ستحتاج إلى "مشرف الحوسبة" و"مشرف مساحة التخزين" و"مشرف حساب الخدمة" و"مشرف مجموعة عناوين العمل في إدارة الهوية وإمكانية الوصول" و"مشرف الأمان" (اختياري). - شغِّل النص البرمجي التالي لضبط أسماء المتغيّرات المتبقية على قيم استنادًا إلى رقم تعريف مشروعك لأسماء الموارد.
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_BUCKET
objectUser
لكتابة نتيجة "حمل العمل" في حزمة التخزين السحابي$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 وانشرها في "مستودع العناصر" (
$PRIMUS_ARTIFACT_REGISTRY
) الذي تملكه شركة Primus. - امنح
$WORKLOAD_SERVICEACCOUNT
إذن القراءة لـ$PRIMUS_ARTIFACT_REGISTRY
. هذا الإجراء مطلوب لكي تسحب حاوية "حمولة العمل" صورة Docker الخاصة بها من "مستودع العناصر".
./create_workload.sh
بالإضافة إلى ذلك، يمكن ترميز أعباء العمل لضمان تحميل الإصدار المتوقّع من نموذج تعلُّم الآلة من خلال التحقّق من التجزئة أو توقيع النموذج قبل استخدامه. تتمثل ميزة عمليات التحقّق الإضافية هذه في أنّها تضمن سلامة نموذج تعلُّم الآلة. وبهذا الإجراء، سيحتاج مشغّل "وحدة العمل" أيضًا إلى تعديل صورة "وحدة العمل" أو مَعلماتها عندما يكون من المتوقّع أن تستخدم "وحدة العمل" إصدارات مختلفة من نموذج الذكاء الاصطناعي.
4. تفويض "حمل العمل" وتشغيله
منح الإذن لـ Workload
تريد شركة Primus تفويض أحمال العمل للوصول إلى نموذج تعلُّم الآلة استنادًا إلى سمات الموارد التالية:
- المحتوى: الرمز الذي تم التحقّق منه
- المكان: بيئة آمنة
- المشغّل: مشغّل موثوق به
يستخدم Primus إدارة الهوية في Workload Identity لفرض سياسة وصول استنادًا إلى هذه المتطلبات. يتيح لك اتحاد هوية Workload تحديد شروط السمات. تحدّ هذه الشروط من الهويات التي يمكنها المصادقة باستخدام مجموعة معرّفات أعباء العمل (WIP). يمكنك إضافة خدمة التحقّق من الإثبات إلى مجموعة المعلومات التعريفية لتحميل العمل كـ موفِّر مجموعة معلومات تعريفية لتحميل العمل لتقديم القياسات وفرض السياسة.
سبق أن تم إنشاء مجموعة المعلومات التعريفية للمعالجة كجزء من خطوة إعداد موارد السحابة الإلكترونية. سينشئ Primus الآن موفِّرًا جديدًا لمجموعة المعلومات التعريفية لمعالجة معيار "اتصال OpenID". يمنح --attribute-condition
المحدّد الإذن بالوصول إلى حاوية عبء العمل. يتطلب ذلك ما يلي:
- المحتوى: أحدث
$WORKLOAD_IMAGE_NAME
تم تحميله إلى مستودع$PRIMUS_ARTIFACT_REPOSITORY
- المكان: يتم تشغيل بيئة التنفيذ الموثوقة في Confidential Space على صورة الجهاز الافتراضي (VM) المتوافقة بالكامل مع Confidential Space.
- المُرسِل: حساب الخدمة
$WORKLOAD_SERVICE_ACCOUNT
في Secundus
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"
تشغيل "حمل العمل"
كجزء من هذه الخطوة، سنشغّل سير العمل في "مساحة العمل السرية" الافتراضية. يتم تمرير وسيطات 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، يعني ذلك أنّه يتوافق مع تصنيف الفئة "سمك الشبوط" في قائمة التصنيفات.
في هذا الدليل التعليمي، أظهرنا نموذجًا يملكه Primus ويتم إصداره فقط للحمولة التي تعمل في بيئة التشغيل المخصّصة للبرامج الحسّاسة. يشغِّل Secundus "وحدة عمل الذكاء الاصطناعي" في بيئة آمنة للتنفيذ، ويمكن لهذه الوحدة استخدام النموذج الذي يملكه Primus مع احتفاظ Primus بالتحكّم الكامل في النموذج.
تشغيل "حمل عمل غير مصرّح بها"
يغيّر Secundus صورة سير العمل من خلال سحب صورة سير عمل مختلفة من مستودع العناصر الخاصة به غير المصرّح به من Primus. سمحت مجموعة Workload Identity Pool في Primus ب${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
صورة Workload فقط.
إعادة تشغيل "حمل العمل"
وعندما يحاول Secundus تشغيل حمولة العمل الأصلية باستخدام صورة حمولة العمل الجديدة هذه، ستتعذّر عليه إكمال العملية. للاطّلاع على الخطأ، عليك حذف ملف النتائج الأصلي ومثيل الجهاز الظاهري، ثم محاولة تشغيل حمولة العمل مرة أخرى.
يُرجى التأكّد من توفّر صورة docker جديدة تم نشرها ضمن سجلّ العناصر في Secundus (بصفتها us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
) ومن أنّ حساب الخدمة "وحدة العمل" ($WORKLOAD_SERVICEACCOUNT
) قد منح قارئ سجلّ العناصر إذنًا بقراءة صورة وحدة العمل الجديدة هذه. يهدف ذلك إلى ضمان عدم إنهاء "وحدة العمل" قبل أن ترفض سياسة "العمل في أثناء التنقل" في Primus الرمز المميّز الذي تقدّمه "وحدة العمل".
حذف ملف النتائج الحالي ومثيل الجهاز الظاهري
- اضبط المشروع على مشروع
$SECUNDUS_PROJECT_ID
.
gcloud config set project $SECUNDUS_PROJECT_ID
- حذف ملف النتائج
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
- احذف نسخة "الخادم الظاهري السري".
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" (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - حساب خدمة "الحمولة" لخدمة Secundus (
$WORKLOAD_SERVICEACCOUNT
). - إدخال حزمة التخزين في Secundus (
$SECUNDUS_INPUT_STORAGE_BUCKET)
. - مثيلات Compute لتحميل العمل
- حزمة تخزين النتائج لخدمة Secundus (
$SECUNDUS_RESULT_STORAGE_BUCKET
).
$ ./cleanup.sh
إذا انتهيت من الاستكشاف، يُرجى التفكير في حذف مشروعك.
- انتقِل إلى وحدة تحكّم Cloud Platform.
- اختَر المشروع الذي تريد إيقافه، ثم انقر على "حذف" في أعلى الصفحة: سيؤدي ذلك إلى جدولة المشروع للحذف.
الخطوة التالية
اطّلِع على بعض هذه الدروس التطبيقية حول الترميز المشابهة...