Menangani sesi dengan Firestore

Banyak aplikasi memerlukan penanganan sesi untuk autentikasi dan preferensi pengguna. Sinatra dilengkapi dengan implementasi berbasis memori untuk menjalankan fungsi ini. Namun, penerapan ini tidak cocok untuk aplikasi yang dapat ditayangkan dari beberapa instance, karena sesi yang direkam di satu instance mungkin berbeda dengan instance lainnya. Tutorial ini menunjukkan cara menangani sesi di App Engine.

Tujuan

  • Tulis aplikasi.
  • Jalankan aplikasi secara lokal.
  • Deploy aplikasi di App Engine.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Siapkan lingkungan pengembangan Anda.

Menyiapkan project

  1. Di jendela terminal, mulai di direktori pilihan Anda dan buat direktori baru bernama sessions. Semua kode untuk tutorial ini ada di dalam direktori sessions.

  2. Ubah ke direktori sessions:

    cd sessions
    
  3. Lakukan inisialisasi Gemfile:

    bundle init
    
  4. Tambahkan kode berikut ke Gemfile yang dihasilkan:

    gem "google-cloud-firestore", "~> 2.0"
    gem "sinatra", "~> 2.0"

    Gemfile mencantumkan library Ruby non-standar yang dibutuhkan aplikasi Anda App Engine untuk dimuat:

    • google-cloud-firestore adalah klien Ruby untuk Firestore API.

    • Sinatra adalah framework web Ruby yang digunakan untuk aplikasi.

  5. Instal dependensinya:

    bundle install
    

Menulis aplikasi web

Aplikasi ini menampilkan sapaan dalam berbagai bahasa untuk setiap pengguna. Pengguna yang kembali selalu disapa dalam bahasa yang sama.

  • Dengan editor teks, buat file bernama app.rb di direktori sessions dengan konten berikut:

    require "sinatra"
    
    require_relative "firestore_session"
    
    use Rack::Session::FirestoreSession
    
    set :greetings, ["Hello World", "Hallo Welt", "Ciao Mondo", "Salut le Monde", "Hola Mundo"]
    
    get "/" do
      session[:greeting] ||= settings.greetings.sample
      session[:views] ||= 0
      session[:views] += 1
      "<h1>#{session[:views]} views for \"#{session[:greeting]}\"</h1>"
    end

Membuat penyimpanan sesi

Sebelum aplikasi Anda dapat menyimpan preferensi untuk pengguna, Anda memerlukan cara untuk menyimpan informasi tentang pengguna saat ini dalam sesi. Diagram berikut mengilustrasikan cara Firestore menangani sesi untuk aplikasi App Engine.

Diagram arsitektur: pengguna, App Engine, Firestore.

Sinatra memiliki dukungan bawaan untuk menyimpan data sesi ke cookie. Untuk menyimpan ke Firestore, Anda harus menentukan objek Rack::Session Anda sendiri.

  • Di direktori sessions, buat file bernama firestore_session.rb dengan konten berikut:

    require "google/cloud/firestore"
    require "rack/session/abstract/id"
    
    module Rack
      module Session
        class FirestoreSession < Abstract::Persisted
          def initialize app, options = {}
            super
    
            @firestore = Google::Cloud::Firestore.new
            @col = @firestore.col "sessions"
          end
    
          def find_session _req, session_id
            return [generate_sid, {}] if session_id.nil?
    
            doc = @col.doc session_id
            fields = doc.get.fields || {}
            [session_id, stringify_keys(fields)]
          end
    
          def write_session _req, session_id, new_session, _opts
            doc = @col.doc session_id
            doc.set new_session, merge: true
            session_id
          end
    
          def delete_session _req, session_id, _opts
            doc = @col.doc session_id
            doc.delete
            generate_sid
          end
    
          def stringify_keys hash
            new_hash = {}
            hash.each do |k, v|
              new_hash[k.to_s] =
                if v.is_a? Hash
                  stringify_keys v
                else
                  v
                end
            end
            new_hash
          end
        end
      end
    end

Menghapus sesi

Seperti yang ditulis, aplikasi ini tidak menghapus sesi lama atau yang telah habis masa berlakunya. Anda dapat menghapus data sesi di konsolGoogle Cloud , atau Anda dapat menerapkan strategi penghapusan otomatis.

Berjalan secara lokal

  1. Mulai server HTTP:

    bundle exec ruby app.rb
    
  2. Lihat aplikasi di browser web Anda.

    Anda akan melihat salah satu dari lima ucapan: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde", atau "Ciao Mondo". Bahasa akan berubah jika Anda membuka halaman di browser lain atau dalam mode samaran. Anda dapat melihat dan mengedit data sesi di konsolGoogle Cloud .

  3. Untuk menghentikan server HTTP, di jendela terminal, tekan Control+C.

Men-deploy dan menjalankan di App Engine

Anda dapat menggunakan lingkungan standar App Engine untuk membangun dan men-deploy aplikasi yang berjalan secara andal dalam beban berat dan dengan data dalam jumlah besar.

Tutorial ini menggunakan lingkungan standar App Engine untuk men-deploy server.

  1. Di jendela terminal, buat file app.yaml dan tempelkan kode berikut ke dalam file:

    runtime: ruby25
    entrypoint: bundle exec ruby app.rb
  2. Deploy aplikasi di App Engine:

    gcloud app deploy
    
  3. Lihat aplikasi live di URL berikut, dengan PROJECT_ID adalah project ID Google Cloud Anda:

    https://PROJECT_ID.appspot.com

Ucapan kini dikirim oleh server web yang berjalan di instance App Engine.

Men-debug aplikasi

Jika Anda tidak dapat terhubung ke aplikasi App Engine, periksa hal-hal berikut:

  1. Periksa apakah perintah deployment gcloud berhasil diselesaikan dan tidak menghasilkan error. Jika ada error (misalnya, message=Build failed), perbaiki, lalu coba men-deploy aplikasi App Engine lagi.
  2. Di konsol Google Cloud , buka halaman Logs Explorer.

    Buka halaman Logs Explorer

    1. Di menu drop-down Recently selected resources, klik App Engine Application, lalu klik All module_id. Anda akan melihat daftar permintaan sejak Anda mengunjungi aplikasi. Jika Anda tidak melihat daftar permintaan, pastikan Anda memilih Semua module_id dari daftar drop-down. Jika Anda melihat pesan error yang dicetak ke konsol Google Cloud , periksa apakah kode aplikasi Anda cocok dengan kode di bagian tentang penulisan aplikasi web.

    2. Pastikan Firestore API diaktifkan.

Pembersihan

Menghapus project

  1. Di Konsol Google Cloud , buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus instance App Engine

  1. Di konsol Google Cloud , buka halaman Versions untuk App Engine.

    Buka Versi

  2. Pilih kotak centang untuk versi aplikasi non-default yang ingin Anda hapus.
  3. Untuk menghapus versi aplikasi, klik Hapus.

Langkah berikutnya