Menghosting target webhook

Panduan ini menunjukkan cara menghosting target webhook di layanan Cloud Run.

Cloud Functions vs Cloud Run

Cloud Functions dan Cloud Run memberikan solusi yang baik untuk menghosting target webhook Anda. Umumnya, Cloud Functions dapat disiapkan dengan cepat, cocok untuk pembuatan prototipe, dan ideal untuk alur kerja dengan volume yang lebih rendah. Cloud Run memberikan fleksibilitas yang lebih besar dan mampu menangani volume yang lebih besar dengan konkurensi.

Gunakan Cloud Run jika:

  • Anda menggunakan bahasa atau runtime yang tidak didukung di Cloud Functions
  • Anda menginginkan waktu tunggu permintaan yang lebih lama (hingga 15 menit)
  • Anda memperkirakan volume yang besar dan memerlukan konkurensi (80 permintaan serentak per instance)

Membuat target webhook di Cloud Run

Dengan Cloud Run, Anda dapat menentukan target webhook dalam bahasa apa pun yang dipilih. Anda hanya perlu membuat endpoint HTTP yang dapat menerima data. Biasanya ini dilakukan dengan POST, misalnya:

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()

Pada contoh di atas, halaman indeks URL dikonfigurasi untuk hanya menerima permintaan POST dan mengharapkan data dikirim melalui payload JSON.

Melakukan integrasi dengan penyedia webhook

Sebagian besar layanan yang menyediakan callback HTTP mengharuskan Anda memverifikasi kepemilikan URL. Hal ini biasanya dilakukan dengan mengirimkan semacam token, pesan, atau secret dan mengharapkan respons yang valid. Anda harus mendapatkan persyaratan ini dari penyedia layanan. Dengan menggunakan contoh yang sama di atas, akan terlihat seperti ini:

def index():
    data = request.get_json()
    return data['challenge']

Setelah penyedia memverifikasi kepemilikan, Anda juga harus menambahkan otorisasi di pihak Anda.

Memberi otorisasi permintaan

Target webhook adalah URL terbuka dan publik. Sebagian besar layanan menyediakan token atau secret untuk memastikan bahwa permintaan yang masuk berasal dari layanan yang diotorisasi. Karena URL ini bersifat publik, Anda tidak dapat mencegah upaya berbahaya yang akan mengirim data ke target webhook. Namun, menggunakan token atau secret akan memastikan Anda hanya memproses data dari sumber yang diotorisasi.

Untuk memverifikasi permintaan, Anda harus menyimpan salinan secret tersebut sebagai variabel lingkungan atau menggunakan semacam sistem pengelolaan kunci. Setiap permintaan harus memiliki secret atau token dalam header permintaan atau payload JSON, dan Anda harus memeriksanya untuk memastikan sumbernya valid.

def index():
    request_secret = request.headers['Secret']
    if request_secret != os.environ['SECRET']:
        return ('Unauthorized', 401)

Jika penyedia webhook tidak mendukung secret atau mekanisme autentikasi lainnya, siapa pun yang memiliki URL target webhook Anda akan dapat mengirim pesan. Dalam kasus ini, implementasi webhook Anda harus aman untuk diekspos ke internet publik.

Merespons permintaan

Sebagian besar layanan mengharuskan Anda merespons permintaan dalam jangka waktu tertentu, seperti yang ditentukan oleh layanan. Beberapa webhook memiliki metode percobaan ulang bawaan jika terjadi respons error, seperti kode status HTTP 4xx atau 5xx, sehingga Anda harus menampilkan kode status yang berhasil (2xx) agar layanan dapat tahu bahwa peristiwa tersebut telah diproses dengan benar.

def index():
    data = request.get_json()
    return ('', 200)

Waktu tunggu

Cloud Run dan penyedia webhook memiliki waktu tunggu. Waktu tunggu yang lebih pendek di antara keduanya akan berlaku untuk aplikasi Anda. Jika pemrosesan data Anda melebihi waktu yang dialokasikan oleh Cloud Run atau penyedia webhook, Anda harus menggunakan produk yang memungkinkan untuk menyelesaikan pemrosesan secara asinkron, seperti Pub/Sub atau Cloud Tasks. Produk ini memungkinkan Anda menyerahkan data dengan cepat, segera menampilkan respons sukses ke penyedia webhook, dan melanjutkan pemrosesan tanpa masalah waktu tunggu. Produk ini juga merupakan opsi yang bagus untuk menangani kegagalan dan upaya coba lagi.

Pola webhook umum

Jenis Contoh
Menyampaikan Data Mengirim notifikasi melalui Firebase Cloud Messaging setiap kali webhook dipanggil.
Menyimpan Data Menyimpan data di BigQuery untuk kemudian dianalisis.
Memicu Tindakan Memenuhi tindakan di Dialogflow, memposting balasan di Twitter, atau mengirim ke lingkungan staging Anda setiap kali kode baru di-commit di GitHub.

Langkah selanjutnya