راه حل SaaS خود را با Google Cloud Marketplace API با استفاده از Producer Portal (Python) ادغام کنید.

1. مقدمه

راه‌حل‌های SaaS در Google Cloud Marketplace راه‌حل‌های نرم‌افزاری هستند که بدون در نظر گرفتن مکان، روی زیرساخت شما اجرا می‌شوند، اما توسط Google صورت‌حساب می‌شوند.

در این نرم افزار کد، یک راه حل اساسی SaaS را راه اندازی می کنید که با Google Cloud Marketplace ادغام می شود تا:

  • هنگامی که کاربر برای راه حل نمونه ثبت نام می کند، اعلان ها را دریافت کنید.
  • مشتریانی را که می خواهند ثبت نام کنند تأیید کنید و آنها را به پایگاه داده خود اضافه کنید.
  • سناریوهایی را که مشتریان می‌خواهند طرح‌های صورت‌حساب خود را تغییر دهند یا لغو کنند، مدیریت کنید.
  • ارسال گزارش استفاده به گوگل

این کد لبه به شما کمک می کند تا با API های خرید و کنترل خدمات Google Cloud Marketplace آشنا شوید. توجه داشته باشید که این راهنما یک محیط کامل محصول را برای آزمایش ارائه نمی دهد.

2. قبل از شروع

  • اگر قبلاً آن را فعال نکرده اید، از Producer Portal برای فعال کردن Codelab برای پروژه خود استفاده کنید.

لینک مستقیم پورتال تولید کننده:

https://console.cloud.google.com/producer-portal?project= YOUR_PROJECT_ID

برای فعال کردن کد لبه، روی Enable در پنل Codelabs در سمت راست صفحه کلیک کنید.

  • پایتون 3 را با ماژول های زیر بر روی دستگاه خود نصب کنید:
  • Python Google Client APIs .
  • کتابخانه مشتری google-cloud-pubsub .

برای نصب ماژول های پایتون از دستور زیر استفاده کنید:

pip install --upgrade google-api-python-client google-cloud-pubsub
  • با استفاده از دستور زیر، مخزن GitHub را برای این کد لبه کلون یا دانلود کنید:
git clone https://github.com/googlecodelabs/gcp-marketplace-integrated-saas.git
cd gcp-marketplace-integrated-saas

  • متغیر محیطی GOOGLE_CLOUD_PROJECT را روی شناسه این پروژه تنظیم کنید:
  • لینوکس:
export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
  • ویندوز:
set GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
  • متغیر محیطی GOOGLE_APPLICATION_CREDENTIALS را روی مسیر کامل فایل دانلود شده تنظیم کنید:
  • لینوکس:
export GOOGLE_APPLICATION_CREDENTIALS="[YOUR_MACHINE]/path/service-account-key.json"
  • ویندوز:
set GOOGLE_APPLICATION_CREDENTIALS=[YOUR_MACHINE]/path/service-account-key.json
  • برای مشاهده نمونه راه حل در Google Cloud Marketplace، از Producer Portal دیدن کنید و روی محصول Codelab در پنل Codelabs کلیک کنید. همچنین می توانید مستقیماً در https://console.cloud.google.com/marketplace/product/DEMO- YOUR_PROJECT_ID /isaas-codelab به راه حل دسترسی پیدا کنید.
  • در Google Cloud Console، در پروژه جدید خود، Partner Procurement API را فعال کنید.

در مرحله بعد، باطن را برای محلول نمونه تنظیم کنید.

3. ادغام با Google Cloud Marketplace

در سطح بالایی، راه حل نمونه را به روش های زیر با Google Cloud Marketplace ادغام می کنید:

  • برای دریافت اعلان‌ها از Google Cloud Marketplace، مانند زمانی که کاربر برای راه‌حل شما ثبت‌نام می‌کند، با Cloud Pub/Sub یکپارچه شوید. مهندس شریک شما یک موضوع Cloud Pub/Sub ایجاد می کند که برای اطلاع رسانی باید در آن مشترک شوید.
  • برای ایجاد حساب برای مشتریان جدید، با Partner Procurement API یکپارچه شوید. وقتی کاربران طرح‌های اشتراک خود را انتخاب، تغییر یا لغو می‌کنند، از API تدارکات شریک برای به‌روزرسانی حساب‌ها استفاده می‌کنید. برای ادغام با API، باید کتابخانه مشتری خود را بسازید.
  • برای گزارش اطلاعات استفاده، با Google Service Control یکپارچه شوید.

4. در موضوع Cloud Pub/Sub مشترک شوید

هنگامی که یک کاربر طرح اشتراکی را انتخاب می کند، از طریق یک موضوع Cloud Pub/Sub از Google Cloud Marketplace اعلان دریافت می کنید.

برای گوش دادن به پیام‌ها در یک موضوع Cloud Pub/Sub، ابتدا باید یک اشتراک ایجاد کنید.

برای ایجاد اشتراک، از اسکریپت create_subscription.py استفاده کنید:

cd gcp-marketplace-integrated-saas/tools
python create_subscription.py

برای مشاهده اشتراک، داشبورد Cloud Pub/Sub را در Cloud Console باز کنید:

https://console.cloud.google.com/cloudpubsub/subscriptions

درخواست اشتراک آزمایشی را امتحان کنید

برای آزمایش این نمونه برنامه به عنوان کاربر، محصول Codelab را در Marketplace با مراجعه به https://console.cloud.google.com/marketplace/product/DEMO- YOUR_PROJECT_ID /isaas-codelab باز کنید. مطمئن شوید که پروژه Codelab خود را انتخاب کرده اید و یک طرح اشتراک را انتخاب کنید.

برای دیدن پیام‌های Cloud Pub/Sub که هنگام انتخاب یک طرح ارسال می‌شوند، به ریشه دایرکتوری python3 در مخزن بروید و دستور زیر را اجرا کنید:

~/gcp-marketplace-integrated-saas/python3$ python -m impl.step_1_pubsub.app

برای دیدن کد نمونه ای که پیام های Cloud Pub/Sub را گوش می دهد، به https://github.com/googlecodelabs/gcp-marketplace-integrated-saas/blob/master/python3/impl/step_1_pubsub/app.py مراجعه کنید.

در پیام Cloud Pub/Sub، قسمت eventType دلیل ارسال پیام را نشان می دهد. وقتی طرحی را انتخاب می‌کنید، باید پیامی را برای eventType: ENTITLEMENT_CREATION_REQUESTED ، که نشان‌دهنده انتخاب قبلی شما برای طرح اشتراک است.

اگر در حین اجرای این اسکریپت طرح خود را لغو کنید، پیام جدیدی برای eventType: ENTITLEMENT_CANCELLED .

توجه داشته باشید که نمونه فوق پیام ها را تایید نمی کند. این به شما این امکان را می‌دهد که با دریافت پیام‌های مشابه در هر بار اجرای برنامه، آسان‌تر تست کنید.

برای بستن اسکریپت، CTRL + \ را فشار دهید.

5. درخواست حساب را تایید کنید

اکنون که می‌توانید پیام‌هایی را از Google Cloud Marketplace دریافت کنید، باید مدیریت منابعی را که سرویس Google Cloud Marketplace Procurement از طرف مشتری ایجاد می‌کند، شروع کنید.

اولین مورد منبع حساب است. یک حساب نشان دهنده ارتباط مشتری با محصول شما است. شما باید شناسه حساب تدارکات مشتری را در پایگاه داده خود ذخیره کنید تا ارتباط بین حساب Google و حساب او را برای خدمات خود ترسیم کنید.

وقتی مشتری طرحی را انتخاب می‌کند، Google Cloud Marketplace یک اعلان Cloud Pub/Sub می‌فرستد مبنی بر اینکه مشتری در حال درخواست حساب است. برنامه شما باید درخواست را تأیید کند. در این کد لبه، شما درخواست‌های حساب را هنگام دریافت پیام‌های Cloud Pub/Sub تأیید می‌کنید.

پایگاه داده برای اطلاعات حساب ایجاد کنید

برای این نرم افزار کد، از یک پایگاه داده ساده JSON استفاده می کنیم که می تواند حساب های مشتریان و خریدها را پیگیری کند.

برای آزمایش این نمونه، یک فایل با یک شی JSON خالی، در هر نقطه از ایستگاه کاری خود ایجاد کنید:

{}

متغیر محیطی PROCUREMENT_CODELAB_DATABASE را روی مسیر کامل این فایل تنظیم کنید:

  • لینوکس:
export PROCUREMENT_CODELAB_DATABASE="YOUR_MACHINE/path/EMPTY_JSON_OBJECT.json"
  • ویندوز:
set PROCUREMENT_CODELAB_DATABASE=YOUR_MACHINE/path/EMPTY_JSON_OBJECT.json

ماژولی که پایگاه داده را می خواند و می نویسد در python3/impl/database است.

اجرای نمونه از طرحی استفاده می‌کند که اگر بیش از یک محصول را با Google Cloud Marketplace ادغام کنید، می‌توان آن را گسترش داد. زیر نمونه ای از ورودی پایگاه داده برای کاربری است که در برنامه نمونه در طرح Very Good مشترک شده است:

{
   "a2b3c4d5-b3f1-4dea-b134-generated_id":{
      "procurement_account_id":"generated-b3f1-4dea-b134-4a1d100c0335",
      "internal_account_id":"generated-45b7-4f4d-1bcd-2abb114f77de",
      "products":{
         "isaas-codelab":{
            "start_time":"2019-01-04T01:21:16.188Z",
            "plan_id":"very-good",
            "product_id":"isaas-codelab",
            "consumer_id":"project_number:123123345345"
         }
      }
   }
}

در اجرای نهایی خود، باید برنامه خود را با پایگاه داده های خود متصل کنید تا حساب های Google Cloud Marketplace مشتریان را با منابع مشتری خود پیوند دهید.

تایید حساب

برای تایید درخواست حساب، دستور زیر را اجرا کنید:

~/gcp-marketplace-integrated-saas/python3$ python3 -m impl.step_2_account.app

کد نمونه برای تأیید یک حساب در impl/step_2_account است.

پیاده سازی نمونه از کلاس Procurement استفاده می کند که تعاملات با Procurement API را مدیریت می کند. در اینجا متدهای get_account() و approve_account() آمده است:

step_2_account/app.py

def _get_account_name(self, account_id):
    return 'providers/DEMO-{}/accounts/{}'.format(PROJECT_ID,
                                                  account_id)

def get_account(self, account_id):
    """Gets an account from the Procurement Service."""
    name = self._get_account_name(account_id)
    request = self.service.providers().accounts().get(name=name)
    try:
        response = request.execute()
        return response
    except HttpError as err:
        if err.resp.status == 404:
            return None

def approve_account(self, account_id):
    """Approves the account in the Procurement Service."""
    name = self._get_account_name(account_id)
    request = self.service.providers().accounts().approve(
        name=name, body={'approvalName': 'signup'})
    request.execute()

برای این آزمایشگاه کد، در سرویس تدارکات، شناسه ارائه‌دهنده DEMO- YOUR_PROJECT_ID است، که در آن YOUR_PROJECT_ID پروژه‌ای است که ایجاد کرده‌اید. هنگام تعامل با Procurement API، نام حساب باید از قالب زیر استفاده کند:

providers/DEMO-YOUR_PROJECT_ID/accounts/account-id

در مرحله بعد، یک استحقاق را تأیید می کنید که سابقه خرید مشتری است.

6. استحقاق را تایید کنید

هنگامی که یک مشتری طرح اشتراکی را در Google Cloud Marketplace انتخاب می کند، یک حساب ایجاد می شود و سپس بلافاصله یک درخواست استحقاق جدید ایجاد می شود. استحقاق بیانگر خرید یک سرویس است. قبل از اینکه مشتری شروع به استفاده از سرویس کند، باید درخواست استحقاق را تأیید کنید و سپس سرویس را تنظیم کنید تا مشتری شروع به استفاده از آن کند.

وقتی برنامه نمونه یک پیام Cloud Pub/Sub با eventType ENTITLEMENT_CREATION_REQUESTED دریافت می‌کند، این حق تأیید می‌شود و برنامه باید منتظر یک پیام ENTITLEMENT_ACTIVE باشد تا حق را در پایگاه داده ثبت کند، سپس منابع را برای مشتری تنظیم کند.

برای ایجاد حق، دستور زیر را اجرا کنید:

~/gcp-marketplace-integrated-saas/python3$ python3 -m impl.step_3_entitlement_create.app

کد تایید حق در اجرای نمونه است.

در مرحله بعد، شرایطی را که در آن مشتری درخواست تغییر در طرح اشتراک خود را دارد، انجام می دهید.

7. تغییرات یک حق را تأیید کنید

اگر سرویس شما دارای چندین طرح است، باید به درخواست‌های مشتریانی رسیدگی کنید که ممکن است بخواهند طرح موجود خود را ارتقا یا کاهش دهند.

اگر سرویس شما فقط یک طرح دارد، به بخش رسیدگی به خریدهای لغو شده بروید.

هیچ تفاوت فنی بین فعال شدن یک حق برای اولین بار و فعال شدن پس از تغییر طرح وجود ندارد. به همین دلیل، پیاده‌سازی نمونه برای هر دو مورد، یک روش اشتراکی handleActiveEntitlement() دارد. این روش پیام های دریافتی را برای رویدادهای مرتبط با حق بررسی می کند:

step_4_entitlement_change/app.py

def handleActiveEntitlement(self, entitlement, customer, accountId):
  """Updates the database to match the active entitlement."""

  product = {
      'product_id': entitlement['product'],
      'plan_id': entitlement['plan'],
  }

  if 'consumerId' in entitlement:
    product['consumer_id'] = entitlement['consumerId']

  customer['products'][entitlement['product']] = product

  self.db.write(accountId, customer)

قطعه زیر بررسی می‌کند که eventType ENTITLEMENT_PLAN_CHANGE_REQUESTED یا ENTITLEMENT_PLAN_CHANGED است:

step_4_entitlement_change/app.py

elif eventType == 'ENTITLEMENT_PLAN_CHANGE_REQUESTED':
  if state == 'ENTITLEMENT_PENDING_PLAN_CHANGE_APPROVAL':
    # Don't write anything to our database until the entitlement becomes
    # active within the Procurement Service.
    self.approveEntitlementPlanChange(id, entitlement['newPendingPlan'])
    return True

elif eventType == 'ENTITLEMENT_PLAN_CHANGED':
  if state == 'ENTITLEMENT_ACTIVE':
    # Handle an active entitlement after a plan change.
    self.handleActiveEntitlement(entitlement, customer, accountId)
    return True

در اجرای نهایی شما، وقتی استحقاق به حالت ENTITLEMENT_ACTIVE برمی گردد، روش شنونده شما باید پایگاه داده شما را به روز کند تا تغییرات را منعکس کند و هر گونه تدارک لازم را انجام دهد.

بسته به نحوه راه‌اندازی محصول خود با مهندس شریکتان، ممکن است سرویس شما تا پایان یک چرخه صورت‌حساب اجازه تنزل رتبه یا لغو را ندهد. در چنین مواردی، تغییر طرح حتی پس از تأیید همچنان معلق خواهد بود، اما تا زمانی که تغییر طرح کامل نشود، استحقاق به حالت ENTITLEMENT_ACTIVE برنمی‌گردد.

برای کدی که تغییرات حق را بررسی و تأیید می کند، اجرای نمونه را ببینید.

در مرحله بعد، شما موقعیت هایی را کنترل می کنید که مشتریان خرید خود را لغو می کنند.

8. به خریدهای لغو شده رسیدگی کنید

مشتریان می توانند خرید خود را لغو کنند. بسته به نحوه تنظیم محصول با مهندس شریک خود، لغو می تواند بلافاصله یا در پایان چرخه صورتحساب اعمال شود.

وقتی مشتری خرید خود را لغو می کند، پیامی با eventType ENTITLEMENT_PENDING_CANCELLATION ارسال می شود. اگر محصول خود را طوری تنظیم کرده‌اید که لغو فوراً پردازش شود، پیامی با eventType ENTITLEMENT_CANCELLED به زودی ارسال می‌شود.

step_5_entitlement_cancel/app.py

elif eventType == 'ENTITLEMENT_CANCELLED':
  # Clear out our records of the customer's plan.
  if entitlement['product'] in customer['products']:
    del customer['products'][entitlement['product']]

  ### TODO: Turn off customer's service. ###
  self.db.write(accountId, customer)
  return True

elif eventType == 'ENTITLEMENT_PENDING_CANCELLATION':
  # Do nothing. We want to cancel once it's truly canceled. For now it's
  # just set to not renew at the end of the billing cycle.
  return True

elif eventType == 'ENTITLEMENT_CANCELLATION_REVERTED':
  # Do nothing. The service was already active, but now it's set to renew
  # automatically at the end of the billing cycle.
  return True

سرویس شما باید منتظر پیام ENTITLEMENT_CANCELLED باشد تا حق را از پایگاه داده شما حذف کند و سرویس را برای مشتری خاموش کند.

پس از لغو حق، از سیستم‌های Google حذف می‌شود و پیامی با eventType ENTITLEMENT_DELETED ارسال می‌شود:

step_5_entitlement_cancel/app.py

elif eventType == 'ENTITLEMENT_DELETED':
  # Do nothing. Entitlements can only be deleted when they are already
  # cancelled, so our state is already up-to-date.
  return True

برای کدی که حق را لغو می کند، اجرای نمونه را ببینید.

9. ارسال گزارش استفاده

برخی از سرویس‌ها دارای مؤلفه‌های مبتنی بر استفاده هستند، که در آن Google باید درباره استفاده مشتریان از این سرویس بداند تا مبلغ صحیحی را از مشتری دریافت کند. سرویس شما باید استفاده را از طریق Google Service Control API گزارش دهد.

اگر سرویس شما دارای اجزای مبتنی بر استفاده نیست، از این بخش صرفنظر کنید.

برای اطلاعات دقیق در مورد ارسال گزارش‌های استفاده، به مستندات ورود مراجعه کنید.

گزارش‌های استفاده باید هر ساعت به Google Service Control API ارسال شود. در این کد لبه، گزارش‌ها با استفاده از اسکریپتی ارسال می‌شوند که می‌توانید به‌عنوان کار کرون زمان‌بندی کنید. اسکریپت زمان آخرین گزارش استفاده را در پایگاه داده ذخیره می کند و از آن به عنوان زمان شروع برای اندازه گیری میزان مصرف استفاده می کند.

اسکریپت هر مشتری فعال سرویس را بررسی می‌کند و با استفاده از فیلد consumer_id حق مشتری، یک گزارش استفاده به Google Service Control ارسال می‌کند. سپس اسکریپت ورودی پایگاه داده را برای مشتری به روز می کند تا یک last_report_time روی زمان پایان گزارش استفاده که به تازگی ارسال شده تنظیم شود.

Google Service Control دو روش را نشان می دهد: check و report . همیشه باید اولی بلافاصله قبل از تماس با دومی تماس گرفته شود. اگر اولی خطا داشته باشد، خدمات مشتری باید غیرفعال شود تا زمانی که رفع شود.

تمام استفاده برای یک حق معین به یک usageReportingId نسبت داده می شود. با این حال، برای محصولات SaaS، این استفاده با مورد خط [Charges not specific to a project] در صورت‌حساب Google Cloud مرتبط است. اگر محصول SaaS شما ممکن است به طور گسترده در سازمان مشتری به اشتراک گذاشته شود، و می‌خواهید از انتساب هزینه پشتیبانی کنید، توصیه می‌کنیم تمام خدمات شما شامل قسمت userLabels اختیاری در عملیات گزارش استفاده آنها باشد.

Google Cloud Marketplace کلیدهای برچسب cloudmarketplace.googleapis.com/resource_name و cloudmarketplace.googleapis.com/container_name را رزرو می کند. این برچسب‌ها برای به تصویر کشیدن زمینه استفاده در سلسله مراتب منابع و سرویس‌های اصلی شما در نظر گرفته شده‌اند. نام‌های اختصاص داده شده توسط مشتری این منابع به عنوان مقادیر برچسب در گزارش‌های استفاده گنجانده می‌شود. توصیه می کنیم این برچسب ها را به صورت پیش فرض در گزارش های استفاده خود قرار دهید.

کلید برچسب

ارزش برچسب

توضیحات

cloudmarketplace.googleapis.com/resource_name

RESOURCE_NAME

نام منبع مرتبط با معیار استفاده.

cloudmarketplace.googleapis.com/container_name

CONTAINER_NAME

نام ظرف منبع.

قطعه زیر استفاده از برنامه آزمایشی را گزارش می‌کند و استفاده از محصول SaaS را به منبع اختصاص داده شده توسط مشتری به نام products_db نسبت می‌دهد. برای این codelab، service_name isaas-codelab.mp-marketplace-partner-demos.appspot.com است.

operation = {
  'operationId': '<UUID>',
  'operationName': 'Codelab Usage Report',
  'consumerId': 'project_number:<Project Number>',
  'startTime': '<Timestamp>',
  'endTime': '<Timestamp>',
  'metricValues': [{
      'int64Value': 100,
  }],
  'userLabels': {
    'cloudmarketplace.googleapis.com/container_name': 'saas-storage-solutions',
    'cloudmarketplace.googleapis.com/resource_name': 'products_db'
  }
}

service.services().report(
    serviceName=service_name, body={
        'operations': [operation]
    }).execute()
product['last_report_time'] = end_time
database.write(customer_id, customer)

برای مشاهده کد کامل نمونه اجرای این اسکریپت را مشاهده کنید. برای تهیه یک نمونه گزارش استفاده، دستور زیر را اجرا کنید:

~/gcp-marketplace-integrated-saas/python3$ python3 -m impl.step_6_usage_reporting.report isaas-codelab.mp-marketplace-partner-demos.appspot.com

10. تبریک می گویم!

آموختید که چگونه راه‌حل SaaS شما می‌تواند با Google Cloud Marketplace ادغام شود تا حساب‌ها و حقوق مشتری را مدیریت کند و استفاده از یک سرویس را گزارش دهد. برای مراحل ادغام کامل، به مستندات یکپارچه سازی باطن مراجعه کنید.

پاک کن

اگر دیگر قصد استفاده از آنها را ندارید، منابع زیر را حذف کنید:

  • اشتراک Cloud Pub/Sub
  • حساب سرویس و کلیدهای آن
  • به صورت اختیاری، پروژه ای که ایجاد کردید
  • به صورت اختیاری، حساب صورت‌حساب‌ای که ایجاد کرده‌اید

بعدش چی

ظاهر خود را یکپارچه کنید

نمونه های موجود در این کد لبه به طور خودکار حساب ها و حقوق را تأیید می کنند. در عمل، مشتریان شما باید به صفحه ثبت نامی که شما ایجاد می کنید هدایت شوند، جایی که می توانند در سیستم شما حساب ایجاد کنند. پس از اینکه آنها با موفقیت ثبت نام کردند، باید درخواست های API را برای تأیید حساب ها و حقوق آنها ارسال کنید.

برای کسب اطلاعات در مورد ادغام نمای برنامه خود، به مستندات Google Cloud Marketplace مراجعه کنید.

درباره ارائه راه حل های SaaS بیشتر بیاموزید

برای نمای کلی از ارائه راه حل های SaaS در Google Cloud Marketplace، به ارائه راه حل های SaaS مراجعه کنید.