Mengintegrasikan solusi SaaS Anda dengan Google Cloud Marketplace API menggunakan Producer Portal (Python)

1. Pengantar

Solusi SaaS di Google Cloud Marketplace adalah solusi software yang berjalan di infrastruktur Anda, terlepas dari lokasi, tetapi akan ditagih oleh Google.

Dalam codelab ini, Anda akan menyiapkan solusi SaaS dasar yang terintegrasi dengan Google Cloud Marketplace untuk:

  • Menerima notifikasi saat pengguna mendaftar ke solusi contoh.
  • Menyetujui pelanggan yang ingin mendaftar, dan menambahkannya ke database Anda.
  • Tangani skenario saat pelanggan ingin mengubah atau membatalkan paket penagihan mereka.
  • Kirim laporan penggunaan ke Google.

Codelab ini membantu Anda memahami API kontrol layanan dan pengadaan Google Cloud Marketplace. Perhatikan bahwa panduan ini tidak memberikan lingkungan produk lengkap untuk pengujian.

2. Sebelum memulai

  • Gunakan Producer Portal untuk mengaktifkan codelab untuk project Anda, jika Anda belum mengaktifkannya.

Link langsung ke Producer Portal adalah:

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

Untuk mengaktifkan codelab, klik Aktifkan di panel Codelab di sisi kanan layar.

Untuk menginstal modul Python, gunakan perintah berikut:

pip install --upgrade google-api-python-client google-cloud-pubsub
  • Clone atau download repositori GitHub untuk codelab ini, menggunakan perintah berikut:
git clone https://github.com/googlecodelabs/gcp-marketplace-integrated-saas.git
cd gcp-marketplace-integrated-saas

  • Tetapkan variabel lingkungan GOOGLE_CLOUD_PROJECT ke ID project ini:
  • Linux:
export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
  • Windows:
set GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
  • Tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS ke jalur lengkap file yang didownload:
  • Linux:
export GOOGLE_APPLICATION_CREDENTIALS="[YOUR_MACHINE]/path/service-account-key.json"
  • Windows:
set GOOGLE_APPLICATION_CREDENTIALS=[YOUR_MACHINE]/path/service-account-key.json
  • Untuk melihat contoh solusi di Google Cloud Marketplace, buka Producer Portal dan klik Codelab product di panel Codelabs. Anda juga dapat mengakses solusi secara langsung di https://console.cloud.google.com/marketplace/product/DEMO-YOUR_PROJECT_ID/isaas-codelab
  • Di Google Cloud Console, di project baru Anda, aktifkan Partner Procurement API.

Selanjutnya, siapkan backend untuk solusi contoh.

3. Mengintegrasikan dengan Google Cloud Marketplace

Secara umum, Anda mengintegrasikan solusi contoh dengan Google Cloud Marketplace dengan cara berikut:

  • Lakukan integrasi dengan Cloud Pub/Sub untuk menerima notifikasi dari Google Cloud Marketplace, seperti saat pengguna mendaftar ke solusi Anda. Partner Engineer Anda membuat topik Cloud Pub/Sub yang harus Anda langgani untuk mendapatkan notifikasi.
  • Lakukan integrasi dengan Partner Procurement API untuk membuat akun bagi pelanggan baru. Anda menggunakan Partner Procurement API untuk memperbarui akun saat pengguna memilih, mengubah, atau membatalkan paket langganan mereka. Untuk berintegrasi dengan API, Anda harus membuat library klien sendiri.
  • Integrasikan dengan Google Service Control untuk melaporkan informasi penggunaan.

4. Berlangganan topik Cloud Pub/Sub

Saat pengguna memilih paket langganan, Anda akan mendapatkan notifikasi dari Google Cloud Marketplace melalui topik Cloud Pub/Sub.

Untuk memproses pesan pada topik Cloud Pub/Sub, Anda harus membuat langganan terlebih dahulu.

Untuk membuat langganan, gunakan skrip create_subscription.py:

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

Untuk melihat langganan, buka dasbor Cloud Pub/Sub di Konsol Cloud:

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

Mencoba permintaan langganan pengujian

Untuk menguji aplikasi contoh ini sebagai pengguna, buka produk codelab di Marketplace dengan membuka https://console.cloud.google.com/marketplace/product/DEMO-YOUR_PROJECT_ID/isaas-codelab. Pastikan Anda telah memilih project codelab, lalu pilih paket langganan.

Untuk melihat pesan Cloud Pub/Sub yang dikirim saat Anda memilih paket, buka root direktori python3 di repositori, lalu jalankan perintah berikut:

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

Untuk melihat contoh kode yang memproses pesan Cloud Pub/Sub, lihat https://github.com/googlecodelabs/gcp-marketplace-integrated-saas/blob/master/python3/impl/step_1_pubsub/app.py.

Dalam pesan Cloud Pub/Sub, kolom eventType menunjukkan alasan pesan dikirim. Saat memilih paket, Anda akan melihat pesan untuk eventType: ENTITLEMENT_CREATION_REQUESTED, yang menunjukkan pilihan paket langganan Anda sebelumnya.

Jika Anda membatalkan paket saat skrip ini berjalan, Anda akan melihat pesan baru, untuk eventType: ENTITLEMENT_CANCELLED.

Perhatikan bahwa contoh di atas tidak mengonfirmasi pesan. Dengan begitu, Anda dapat menguji dengan lebih mudah dengan menerima pesan yang sama setiap kali Anda menjalankan aplikasi.

Untuk menutup skrip, tekan CTRL + \.

5. Menyetujui permintaan akun

Setelah dapat menerima pesan dari Google Cloud Marketplace, Anda harus mulai menangani resource yang dibuat oleh layanan Pengadaan Google Cloud Marketplace atas nama pelanggan.

Yang pertama adalah resource account. Akun mewakili koneksi pelanggan ke produk Anda. Anda harus menyimpan ID akun Pengadaan pelanggan di database Anda, untuk memetakan hubungan antara Akun Google mereka dan akun mereka untuk layanan Anda.

Saat pelanggan memilih paket, Google Cloud Marketplace akan mengirimkan notifikasi Cloud Pub/Sub bahwa pelanggan meminta akun. Aplikasi Anda harus menyetujui permintaan. Dalam codelab ini, Anda menyetujui permintaan akun saat pesan Cloud Pub/Sub diterima.

Buat database untuk informasi akun

Untuk codelab ini, kita menggunakan database JSON sederhana yang dapat melacak akun dan pembelian pelanggan.

Untuk menguji contoh ini, buat file dengan objek JSON kosong, di mana saja di workstation Anda:

{}

Tetapkan variabel lingkungan PROCUREMENT_CODELAB_DATABASE ke jalur lengkap file ini:

  • Linux:
export PROCUREMENT_CODELAB_DATABASE="YOUR_MACHINE/path/EMPTY_JSON_OBJECT.json"
  • Windows:
set PROCUREMENT_CODELAB_DATABASE=YOUR_MACHINE/path/EMPTY_JSON_OBJECT.json

Modul yang membaca dan menulis database ada di python3/impl/database.

Implementasi contoh menggunakan skema yang dapat diperluas jika Anda mengintegrasikan lebih dari satu penawaran produk dengan Google Cloud Marketplace. Berikut adalah contoh entri database untuk pengguna yang berlangganan paket Sangat Baik di aplikasi contoh:

{
   "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"
         }
      }
   }
}

Dalam penerapan akhir, Anda harus menghubungkan aplikasi dengan database Anda sendiri untuk menautkan akun Google Cloud Marketplace pelanggan dengan resource pelanggan Anda sendiri.

Menyetujui akun

Untuk menyetujui permintaan akun, jalankan perintah berikut:

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

Kode contoh untuk menyetujui akun ada di impl/step_2_account.

Implementasi contoh menggunakan class Procurement, yang menangani interaksi dengan Procurement API. Berikut metode get_account() dan approve_account()-nya:

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()

Untuk codelab ini, di layanan Pengadaan, ID penyedia adalah DEMO-YOUR_PROJECT_ID, dengan YOUR_PROJECT_ID adalah project yang Anda buat. Saat berinteraksi dengan Procurement API, nama akun harus menggunakan format berikut:

providers/DEMO-YOUR_PROJECT_ID/accounts/account-id

Selanjutnya, Anda menyetujui hak, yang merupakan catatan pembelian pelanggan.

6. Menyetujui hak

Saat pelanggan memilih paket langganan di Google Cloud Marketplace, akun akan dibuat, lalu permintaan hak baru akan segera dibuat. Hak mewakili pembelian layanan. Sebelum pelanggan dapat mulai menggunakan layanan, Anda harus menyetujui permintaan hak, lalu menyiapkan layanan agar pelanggan dapat mulai menggunakannya.

Saat aplikasi contoh mendapatkan pesan Cloud Pub/Sub dengan eventType ENTITLEMENT_CREATION_REQUESTED, hak disetujui, dan aplikasi harus menunggu pesan ENTITLEMENT_ACTIVE untuk mencatat hak dalam database, lalu menyiapkan resource untuk pelanggan.

Untuk membuat hak, jalankan perintah berikut:

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

Kode untuk menyetujui hak ada di contoh penerapan.

Selanjutnya, Anda akan menangani situasi saat pelanggan meminta perubahan pada paket langganannya.

7. Menyetujui perubahan pada hak

Jika layanan Anda memiliki beberapa paket, Anda harus menangani permintaan dari pelanggan yang mungkin ingin mengupgrade atau mendowngrade paket yang ada.

Jika layanan Anda hanya memiliki satu paket, lanjutkan ke Menangani pembelian yang dibatalkan.

Tidak ada perbedaan teknis antara hak yang menjadi aktif untuk pertama kalinya dan hak yang menjadi aktif setelah perubahan paket. Oleh karena itu, contoh implementasi memiliki metode handleActiveEntitlement() bersama untuk kedua kasus. Metode ini memeriksa pesan masuk untuk peristiwa terkait hak:

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)

Cuplikan berikut memeriksa apakah eventType adalah ENTITLEMENT_PLAN_CHANGE_REQUESTED atau 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

Dalam implementasi akhir Anda, saat hak kembali ke status ENTITLEMENT_ACTIVE, metode pemroses Anda harus memperbarui database Anda untuk mencerminkan perubahan dan melakukan penyediaan yang diperlukan.

Bergantung pada cara Anda menyiapkan produk dengan Partner Engineer, layanan Anda mungkin tidak mengizinkan downgrade atau pembatalan hingga akhir siklus penagihan. Dalam kasus tersebut, perubahan paket akan terus menunggu keputusan meskipun setelah persetujuan, tetapi hak tidak akan kembali ke status ENTITLEMENT_ACTIVE hingga perubahan paket selesai.

Untuk kode yang memeriksa dan menyetujui perubahan hak, lihat contoh penerapan.

Selanjutnya, Anda menangani situasi saat pelanggan membatalkan pembelian.

8. Menangani pembelian yang dibatalkan

Pelanggan dapat memilih untuk membatalkan pembelian mereka. Bergantung pada cara Anda menyiapkan produk dengan Partner Engineer, pembatalan dapat berlaku segera, atau di akhir siklus penagihan.

Saat pelanggan membatalkan pembelian, pesan dengan eventType ENTITLEMENT_PENDING_CANCELLATION akan dikirim. Jika Anda telah menyiapkan produk untuk segera memproses pembatalan, pesan dengan eventType ENTITLEMENT_CANCELLED akan dikirim segera setelahnya.

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

Layanan Anda harus menunggu pesan ENTITLEMENT_CANCELLED, lalu menghapus hak dari database Anda, dan menonaktifkan layanan untuk pelanggan.

Setelah hak dibatalkan, hak tersebut akan dihapus dari sistem Google, dan pesan dengan eventType ENTITLEMENT_DELETED akan dikirim:

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

Untuk kode yang membatalkan hak, lihat contoh implementasi.

9. Mengirim laporan penggunaan

Beberapa layanan memiliki komponen berbasis penggunaan, yang mengharuskan Google mengetahui penggunaan layanan oleh pelanggan untuk menagih pelanggan dengan jumlah yang benar. Layanan Anda harus melaporkan penggunaan melalui Google Service Control API.

Jika layanan Anda tidak memiliki komponen berbasis penggunaan, lewati bagian ini.

Untuk mengetahui informasi mendetail tentang pengiriman laporan penggunaan, lihat dokumentasi aktivasi.

Laporan penggunaan harus dikirim ke Google Service Control API setiap jam. Dalam codelab ini, laporan dikirim menggunakan skrip yang dapat Anda jadwalkan sebagai cron job. Skrip menyimpan waktu laporan penggunaan terakhir dalam database, dan menggunakannya sebagai waktu mulai untuk mengukur penggunaan.

Skrip memeriksa setiap pelanggan aktif layanan, dan mengirim laporan penggunaan ke Kontrol Layanan Google menggunakan kolom consumer_id hak pelanggan. Kemudian, skrip memperbarui entri database untuk pelanggan agar memiliki last_report_time yang ditetapkan ke waktu berakhir laporan penggunaan yang baru saja dikirim.

Kontrol Layanan Google mengekspos dua metode: check dan report. Yang pertama harus selalu dipanggil tepat sebelum panggilan ke yang kedua. Jika ada error pada yang pertama, layanan pelanggan harus dinonaktifkan hingga error tersebut diperbaiki.

Semua penggunaan untuk hak tertentu diatribusikan ke satu usageReportingId. Namun, untuk produk SaaS, penggunaan ini dikaitkan dengan item baris [Charges not specific to a project] di Penagihan Google Cloud. Jika produk SaaS Anda mungkin dibagikan secara luas dalam organisasi pelanggan, dan Anda ingin mendukung atribusi biaya, sebaiknya semua layanan Anda menyertakan kolom userLabels opsional pada operasi laporan penggunaan.

Google Cloud Marketplace mencadangkan kunci label cloudmarketplace.googleapis.com/resource_name dan cloudmarketplace.googleapis.com/container_name. Label ini dimaksudkan untuk merekam konteks penggunaan dalam hierarki layanan dan resource native Anda. Nama yang ditetapkan pelanggan untuk resource ini akan disertakan sebagai nilai label dalam laporan penggunaan. Sebaiknya sertakan label ini dalam laporan penggunaan Anda secara default.

Kunci Label

Nilai Label

Deskripsi

cloudmarketplace.googleapis.com/resource_name

RESOURCE_NAME

Nama resource yang terkait dengan metrik penggunaan.

cloudmarketplace.googleapis.com/container_name

CONTAINER_NAME

Nama penampung resource.

Cuplikan berikut melaporkan penggunaan untuk aplikasi demo dan mengatribusikan penggunaan untuk produk SaaS ke resource yang ditetapkan pelanggan bernama products_db. Untuk codelab ini, service_name adalah 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)

Lihat contoh penerapan skrip ini untuk kode lengkapnya. Untuk membuat laporan penggunaan contoh, jalankan perintah berikut:

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

10. Selamat!

Anda telah mempelajari cara solusi SaaS Anda dapat terintegrasi dengan Google Cloud Marketplace untuk menangani akun dan hak pelanggan, serta melaporkan penggunaan terhadap layanan. Untuk mengetahui langkah-langkah integrasi lengkap, lihat dokumentasi integrasi backend.

Pembersihan

Jika Anda tidak berencana menggunakannya lagi, hapus resource berikut:

  • Langganan Cloud Pub/Sub
  • Akun layanan dan kuncinya
  • Secara opsional, project yang Anda buat
  • Opsional, akun penagihan yang Anda buat

Langkah berikutnya

Mengintegrasikan frontend

Contoh dalam codelab ini secara otomatis menyetujui akun dan hak. Dalam praktiknya, pelanggan Anda harus diarahkan ke halaman pendaftaran yang Anda buat, tempat mereka dapat membuat akun di sistem Anda. Setelah mereka berhasil mendaftar, Anda harus membuat permintaan API untuk menyetujui akun dan hak mereka.

Untuk mengetahui informasi tentang cara mengintegrasikan frontend aplikasi Anda, lihat dokumentasi Google Cloud Marketplace.

Pelajari lebih lanjut cara menawarkan solusi SaaS

Untuk mengetahui ringkasan tentang cara menawarkan solusi SaaS di Google Cloud Marketplace, lihat Menawarkan solusi SaaS.