Contoh App Engine dan Google Cloud Storage

ID region

REGION_ID adalah kode singkat yang ditetapkan Google berdasarkan region yang Anda pilih saat membuat aplikasi. Kode ini tidak mewakili suatu negara atau provinsi, meskipun beberapa ID region mungkin tampak mirip dengan kode negara dan provinsi yang umum digunakan. Untuk aplikasi yang dibuat setelah Februari 2020, REGION_ID.r disertakan dalam URL App Engine. Untuk aplikasi lama yang dibuat sebelum tanggal ini, ID region bersifat opsional dalam URL. Pelajari ID region lebih lanjut.

Pelajari cara mengaktifkan akses Cloud Storage ke aplikasi Python App Engine Anda dan membuat, menulis, membaca, serta membuat daftar file di bucket Cloud Storage.

Tutorial ini mengasumsikan bahwa Anda sudah memahami Python dan telah menyiapkan lingkungan pengembangan.

Saat dijalankan, contoh ini akan mengeksekusi skrip dan menulis output-nya ke browser. Skrip ini menunjukkan fitur-fitur dari library klien Cloud Storage:

  • Membuat file dan menulis file ke bucket.
  • Membaca file dan mendapatkan metadata filenya.
  • Membuat beberapa file, lalu membuat daftarnya dari bucket.
  • Mencantumkan file yang baru saja ditambahkan ke bucket.
  • Membaca kumpulan file yang sama.
  • Menghapus kumpulan file.

Tujuan

  • Mempelajari project Python untuk melihat tata letak dan file yang diperlukan.
  • Memahami kode untuk terhubung ke Cloud Storage.
  • Memahami kode untuk membuat, menulis, membaca, membuat daftar, dan menghapus file.
  • Memahami kode untuk percobaan ulang.
  • Membangun dan menguji aplikasi di server pengembangan lokal Anda.
  • Men-deploy aplikasi ke produksi di Google App Engine.

Biaya

App Engine memiliki tingkat penggunaan gratis. Jika total penggunaan App Engine Anda tidak melebihi batas yang ditentukan dalam kuota gratis App Engine, Anda tidak akan dikenai biaya untuk melakukan tutorial ini.

Sebelum memulai

Sebelum mulai menjalankan contoh ini, Anda memerlukan project ID, alat command line gcloud, dan bucket Cloud Storage:

  1. Buat project Konsol Google Cloud baru atau ambil project ID dari project yang ada dari Konsol Google Cloud:

    Buka halaman Project

  2. Instal, lalu inisialisasi Google Cloud CLI:

    Download SDK

  3. Aktifkan bucket Cloud Storage default.

Meng-clone project tutorial

Untuk meng-clone project:

  1. Clone library klien dan aplikasi (demo) contoh ke mesin lokal Anda.

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    

    Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.

  2. Buka direktori yang sesuai dalam project yang di-clone atau didownload:

    cd python-docs-samples/appengine/standard/storage/appengine-client
    

Menginstal dependensi

Alat virtualenv memungkinkan Anda membuat lingkungan Python yang bersih di sistem. Untuk pengembangan App Engine, hal ini membantu memastikan kode yang Anda uji secara lokal mirip dengan lingkungan tempat kode akan di-deploy. Untuk mempelajari lebih lanjut, baca Menggunakan library pihak ketiga.

Untuk menginstal virtualenv dan dependensi contoh:

Mac OS/Linux

  1. Jika Anda tidak memiliki virtualenv, instal di seluruh sistem menggunakan pip.
    sudo pip install virtualenv
  2. Buat lingkungan Python yang terisolasi:
    virtualenv env
    source env/bin/activate
  3. Jika Anda tidak berada dalam direktori yang berisi kode contoh, buka direktori yang berisi kode contoh hello_world. Kemudian instal dependensi:
    cd YOUR_SAMPLE_CODE_DIR
    pip install -t lib -r requirements.txt

Windows

Jika sudah menginstal Google Cloud CLI, Anda seharusnya sudah menginstal Python 2.7, biasanya di C:\python27_x64\ (untuk sistem 64-bit). Gunakan PowerShell untuk menjalankan paket Python Anda.

  1. Temukan penginstalan PowerShell Anda.
  2. Klik kanan pintasan untuk PowerShell dan mulai sebagai administrator.
  3. Coba jalankan perintah python. Jika tidak ditemukan, tambahkan folder Python ke PATH lingkungan Anda.
    $env:Path += ";C:\python27_x64\"
  4. Jika Anda tidak memiliki virtualenv, instal di seluruh sistem menggunakan pip:
    python -m pip install virtualenv
  5. Buat lingkungan Python yang terisolasi.
    python -m virtualenv env
    . env\Scripts\activate
  6. Buka direktori project Anda lalu instal dependensi. Jika Anda tidak berada dalam direktori yang berisi kode contoh, buka direktori yang berisi kode contoh hello_world. Kemudian, instal dependensi:
    cd YOUR_SAMPLE_CODE_DIR
    python -m pip install -t lib -r requirements.txt

Kode contoh yang Anda clone atau download sudah berisi file appengine_config.py, yang diperlukan untuk menginstruksikan App Engine agar menggunakan folder lib untuk memuat dependensi secara lokal dan saat di-deploy.

Menjalankan proses secara lokal

Untuk menjalankan contoh secara lokal:

  1. Dalam subdirektori project python-docs-samples/appengine/standard/storage/appengine-client, jalankan aplikasi di server pengembangan lokal:

    python3 CLOUD_SDK_ROOT/bin/dev_appserver.py .
    
  2. Tunggu pesan berhasil, yang terlihat seperti ini:

    INFO     2016-04-12 21:33:35,446 api_server.py:205] Starting API server at: http://localhost:36884
    INFO     2016-04-12 21:33:35,449 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-04-12 21:33:35,449 admin_server.py:116] Starting admin server at: http://localhost:8000
    
  3. Kunjungi URL ini di browser Anda:

    http://localhost:8080/

    Aplikasi akan dieksekusi saat halaman dimuat, dengan menampilkan output ke browser untuk menunjukkan apa yang telah dieksekusi. Outputnya akan terlihat seperti ini:

    Hello_Storage

  4. Hentikan server pengembangan dengan menekan Control-C.

Panduan app.yaml

File app.yaml menetapkan detail konfigurasi aplikasi:

runtime: python27
api_version: 1
threadsafe: yes

env_variables:

handlers:
- url: /blobstore.*
  script: blobstore.app

- url: /.*
  script: main.app

Untuk informasi selengkapnya tentang opsi konfigurasi yang tersedia dalam file ini, lihat referensi app.yaml.

Panduan impor

File main.py berisi impor standar yang digunakan untuk mengakses Cloud Storage melalui library klien:

import os

import cloudstorage
from google.appengine.api import app_identity

import webapp2

Anda memerlukan modul os dan app_identity API untuk mendapatkan nama bucket default pada runtime. Anda akan memerlukan nama bucket ini untuk semua operasi akses Cloud Storage.

Contoh ini juga menggunakan framework web webapp2.

Menentukan bucket Cloud Storage

Sebelum melakukan operasi apa pun di Cloud Storage, Anda harus memberikan nama ke bucket. Cara termudah untuk melakukannya adalah dengan menggunakan bucket default untuk project Anda, yang dapat diperoleh sebagai berikut:

def get(self):
    bucket_name = os.environ.get(
        'BUCKET_NAME', app_identity.get_default_gcs_bucket_name())

    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write(
        'Demo GCS Application running from Version: {}\n'.format(
            os.environ['CURRENT_VERSION_ID']))
    self.response.write('Using bucket name: {}\n\n'.format(bucket_name))

Menulis file ke Cloud Storage

Contoh berikut menunjukkan cara menulis ke bucket:

def create_file(self, filename):
    """Create a file."""

    self.response.write('Creating file {}\n'.format(filename))

    # The retry_params specified in the open call will override the default
    # retry params for this particular file handle.
    write_retry_params = cloudstorage.RetryParams(backoff_factor=1.1)
    with cloudstorage.open(
        filename, 'w', content_type='text/plain', options={
            'x-goog-meta-foo': 'foo', 'x-goog-meta-bar': 'bar'},
            retry_params=write_retry_params) as cloudstorage_file:
                cloudstorage_file.write('abcde\n')
                cloudstorage_file.write('f'*1024*4 + '\n')
    self.tmp_filenames_to_clean_up.append(filename)

Perhatikan bahwa saat panggilan untuk open file yang akan ditulis, contoh tersebut menentukan header Cloud Storage tertentu yang menulis metadata kustom untuk file tersebut; metadata ini dapat diambil menggunakan cloudstorage.stat. Anda dapat menemukan daftar header yang didukung dalam referensi cloudstorage.open.

Perhatikan juga bahwa header x-goog-acl tidak ditetapkan. Artinya, ACL Cloud Storage default dari pembacaan publik akan diterapkan ke objek saat ditulis ke bucket.

Terakhir, perhatikan panggilan untuk close file setelah Anda menyelesaikan penulisan. Jika Anda tidak melakukan hal ini, file tidak akan ditulis ke Cloud Storage. Perlu diketahui bahwa setelah memanggil close, Anda tidak dapat melakukan penambahan ke file. Jika perlu mengubah file, Anda harus membuka kembali file tersebut dalam mode tulis, yang melakukan penimpaan, bukan penambahan.

Membaca file dari Cloud Storage

Contoh berikut menunjukkan cara membaca file dari bucket:

def read_file(self, filename):
    self.response.write(
        'Abbreviated file content (first line and last 1K):\n')

    with cloudstorage.open(filename) as cloudstorage_file:
        self.response.write(cloudstorage_file.readline())
        cloudstorage_file.seek(-1024, os.SEEK_END)
        self.response.write(cloudstorage_file.read())

Contoh ini menunjukkan cara menampilkan baris yang dipilih dari file yang sedang dibaca, dalam hal ini, baris pembuka dan 1.000 baris terakhir, menggunakan seek.

Perhatikan bahwa tidak ada mode yang ditentukan dalam kode di atas saat file dibuka untuk dibaca. Default untuk open adalah mode hanya baca.

Mencantumkan konten bucket

Kode contoh menunjukkan cara menelusuri bucket yang berisi banyak file, menggunakan marker, dan parameter max_keys untuk menelusuri daftar konten bucket:

def list_bucket(self, bucket):
    """Create several files and paginate through them."""

    self.response.write('Listbucket result:\n')

    # Production apps should set page_size to a practical value.
    page_size = 1
    stats = cloudstorage.listbucket(bucket + '/foo', max_keys=page_size)
    while True:
        count = 0
        for stat in stats:
            count += 1
            self.response.write(repr(stat))
            self.response.write('\n')

        if count != page_size or count == 0:
            break
        stats = cloudstorage.listbucket(
            bucket + '/foo', max_keys=page_size, marker=stat.filename)

Perhatikan bahwa nama file lengkap ditampilkan sebagai satu string tanpa pembatas direktori. Jika ingin menampilkan file dengan hierarki direktori yang lebih mudah dikenali, tetapkan parameter delimiter ke pemisah direktori yang ingin Anda gunakan.

Menghapus file

Contoh kode menunjukkan penghapusan file, dalam hal ini, penghapusan semua file yang ditambahkan selama eksekusi aplikasi. Anda tidak akan melakukannya dalam kode, karena ini hanyalah fitur pembersihan dari contoh berikut:

def delete_files(self):
    self.response.write('Deleting files...\n')
    for filename in self.tmp_filenames_to_clean_up:
        self.response.write('Deleting file {}\n'.format(filename))
        try:
            cloudstorage.delete(filename)
        except cloudstorage.NotFoundError:
            pass

Men-deploy contoh

Untuk men-deploy dan menjalankan contoh di App Engine:

  1. Upload aplikasi contoh dengan menjalankan perintah berikut dari dalam direktori python-docs-samples/appengine/standard/storage/appengine-client tempat file app.yaml berada:

    gcloud app deploy
    

    Flag opsional:

    • Sertakan flag --project untuk menentukan project ID Konsol Google Cloud alternatif dengan yang Anda inisialisasi sebagai default di gcloud CLI. Contoh: --project [YOUR_PROJECT_ID]
    • Sertakan flag -v untuk menentukan ID versi. Jika tidak, flag tersebut akan dibuat untuk Anda. Contoh: -v [YOUR_VERSION_ID]
  2. Setelah proses deployment selesai, Anda dapat melihat aplikasi di https://PROJECT_ID.REGION_ID.r.appspot.com dengan menjalankan perintah berikut:

    gcloud app browse
    

    Aplikasi demo dieksekusi saat pemuatan halaman, seperti yang dilakukan saat Anda menjalankannya secara lokal. Namun, sekarang aplikasi akan benar-benar menulis ke dan membaca dari bucket Cloud Storage Anda.

Untuk mempelajari lebih lanjut cara men-deploy aplikasi dari command line, lihat Men-deploy Aplikasi Python 2.

Langkah berikutnya