Menjalankan Django di lingkungan Cloud Run

Men-deploy aplikasi stateful ke Cloud Run seperti Django melibatkan integrasi layanan untuk berinteraksi satu sama lain guna membentuk project yang kohesif.

Tutorial ini mengasumsikan bahwa Anda sudah memahami pengembangan web Django. Jika Anda baru mengenal pengembangan Django, sebaiknya pelajari cara menulis aplikasi Django pertama Anda sebelum melanjutkan.

Meskipun tutorial ini secara khusus menunjukkan Django, Anda dapat menggunakan proses deployment ini dengan framework berbasis Django lainnya, seperti Wagtail dan Django CMS.

Tutorial ini menggunakan Django 5, yang memerlukan minimal Python 3.10.

Tujuan

Dalam tutorial ini, Anda akan:

  • Buat dan hubungkan database Cloud SQL.
  • Buat dan gunakan nilai secret Secret Manager.
  • Deploy aplikasi Django ke Cloud Run.

  • Menghosting file statis di Cloud Storage.

  • Gunakan Cloud Build untuk mengotomatiskan deployment.

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.

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 Cloud Run, Cloud SQL, Cloud Build, Secret Manager, Artifact Registry, and Compute Engine APIs.

    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 APIs

  5. Instal gcloud CLI.

  6. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  7. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  8. 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

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

  10. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, Artifact Registry, and Compute Engine APIs.

    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 APIs

  11. Instal gcloud CLI.

  12. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  13. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  14. Pastikan izin yang memadai tersedia untuk akun yang digunakan dalam tutorial ini.

Menyiapkan lingkungan Anda

Meng-clone aplikasi sampel

Kode untuk aplikasi contoh Django ada di repositori GoogleCloudPlatform/python-docs-samples di GitHub.

  1. Anda dapat mendownload contoh sebagai file ZIP dan mengekstraknya atau meng-clone repositori ke komputer lokal Anda:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. Buka direktori yang berisi kode contoh:

    Linux/macOS

    cd python-docs-samples/run/django
    

    Windows

    cd python-docs-samples\run\django
    

Mengonfirmasi penyiapan Python Anda

Tutorial ini mengandalkan Python untuk menjalankan aplikasi contoh di komputer Anda. Kode contoh juga memerlukan penginstalan dependensi

Untuk mengetahui detail selengkapnya, lihat panduan lingkungan pengembangan Python.

  1. Pastikan Python Anda minimal versi 3.10.

     python -V
    

    Anda akan melihat Python 3.10.0 atau lebih tinggi.

  2. Buat lingkungan virtual Python dan instal dependensi:

    Linux/macOS

    python -m venv venv
    source venv/bin/activate
    pip install --upgrade pip
    pip install -r requirements.txt
    

    Windows

    python -m venv venv
    venv\scripts\activate
    pip install --upgrade pip
    pip install -r requirements.txt
    

Download Proxy Auth Cloud SQL untuk terhubung ke Cloud SQL dari mesin lokal Anda

Saat di-deploy, aplikasi Anda menggunakan Proxy Auth Cloud SQL yang dibuat ke dalam lingkungan Cloud Run untuk berkomunikasi dengan instance Cloud SQL Anda. Namun, untuk menguji aplikasi secara lokal, Anda harus menginstal dan menggunakan salinan proxy lokal di lingkungan pengembangan. Untuk mengetahui detail selengkapnya, lihat Panduan Proxy Auth Cloud SQL.

Proxy Auth Cloud SQL menggunakan Cloud SQL API untuk berinteraksi dengan instance SQL Anda. Untuk melakukannya, autentikasi aplikasi diperlukan melalui gcloud CLI.

  1. Lakukan autentikasi dan dapatkan kredensial untuk API:

    gcloud auth application-default login
    
  2. Download dan instal Proxy Auth Cloud SQL ke mesin lokal Anda.

    Linux 64 bit

    1. Download Proxy Auth Cloud SQL:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.amd64
    2. Buat Proxy Auth Cloud SQL agar dapat dieksekusi:
      chmod +x cloud-sql-proxy

    Linux 32 bit

    1. Download Proxy Auth Cloud SQL:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.386
    2. Jika perintah curl tidak ditemukan, jalankan sudo apt install curl dan ulangi perintah download.
    3. Buat Proxy Auth Cloud SQL agar dapat dieksekusi:
      chmod +x cloud-sql-proxy

    macOS 64-bit

    1. Download Proxy Auth Cloud SQL:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.amd64
    2. Buat Proxy Auth Cloud SQL agar dapat dieksekusi:
      chmod +x cloud-sql-proxy

    Mac M1

    1. Download Proxy Auth Cloud SQL:
        curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.arm64
        
    2. Buat Proxy Auth Cloud SQL agar dapat dieksekusi:
        chmod +x cloud-sql-proxy
        

    Windows 64 bit

    Klik kanan https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x64.exe dan pilih Simpan Link Sebagai untuk mendownload Proxy Auth Cloud SQL. Ganti nama file menjadi cloud-sql-proxy.exe.

    Windows 32 bit

    Klik kanan https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x86.exe dan pilih Simpan Link Sebagai untuk mendownload Proxy Auth Cloud SQL. Ganti nama file menjadi cloud-sql-proxy.exe.

    Image Docker Proxy Auth Cloud SQL

    Proxy Auth Cloud SQL memiliki image container yang berbeda, seperti distroless, alpine, dan buster. Image container Proxy Auth Cloud SQL default menggunakan distroless, yang tidak berisi shell. Jika Anda memerlukan shell atau alat terkait, download image berdasarkan alpine atau buster. Untuk mengetahui informasi selengkapnya, lihat Image Container Proxy Auth Cloud SQL.

    Anda dapat menarik image terbaru ke mesin lokal menggunakan Docker dengan perintah berikut:

    docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.21.1
    

    OS Lainnya

    Untuk sistem operasi lain yang tidak disertakan di sini, Anda dapat mengompilasi Proxy Auth Cloud SQL dari sumber.

    Anda dapat memilih untuk memindahkan hasil download ke tempat yang umum, seperti lokasi di PATH, atau direktori utama Anda. Jika Anda memilih untuk melakukannya, saat Anda memulai Proxy Auth Cloud SQL nanti dalam tutorial, ingatlah untuk merujuk ke lokasi yang Anda pilih saat menggunakan perintah cloud-sql-proxy.

Membuat layanan pendukung

Tutorial ini menggunakan beberapa layanan Google Cloud untuk menyediakan database, penyimpanan media, dan penyimpanan rahasia yang mendukung project Django yang di-deploy. Layanan ini di-deploy di region tertentu. Agar efisien di antara layanan, semua layanan harus di-deploy di region yang sama. Untuk mengetahui informasi selengkapnya tentang region terdekat dengan Anda, lihat Produk yang tersedia berdasarkan region.

Tutorial ini menggunakan mekanisme hosting aset statis terintegrasi di Cloud Run.

Menyiapkan instance Cloud SQL untuk PostgreSQL

Django secara resmi mendukung beberapa database relasional, tetapi menawarkan dukungan paling banyak untuk PostgreSQL. PostgreSQL didukung oleh Cloud SQL, sehingga tutorial ini memilih untuk menggunakan jenis database tersebut.

Bagian berikut menjelaskan pembuatan instance PostgreSQL, database, dan pengguna database untuk aplikasi.

  1. Buat instance PostgreSQL:

    Konsol

    1. Di Konsol Google Cloud , buka halaman Instance Cloud SQL.

      Buka halaman Instance Cloud SQL

    2. Klik Create Instance.

    3. Klik Pilih PostgreSQL.

    4. Untuk SQL Edition, pilih "Enterprise".

    5. Untuk Edition Preset, pilih "Sandbox".

    6. Di kolom Instance ID, masukkan INSTANCE_NAME.

    7. Masukkan sandi untuk pengguna postgres.

    8. Pertahankan nilai default untuk kolom lainnya.

    9. Klik Create Instance.

    Instance akan siap digunakan dalam beberapa menit.

    gcloud

    • Buat instance PostgreSQL:

      gcloud sql instances create INSTANCE_NAME \
          --project PROJECT_ID \
          --database-version POSTGRES_16 \
          --tier db-n1-standard-2 \
          --region REGION
      

    Ganti kode berikut:

    • INSTANCE_NAME: nama instance Cloud SQL
    • PROJECT_ID: Google Cloud project ID
    • REGION: Google Cloud wilayah

    Diperlukan waktu beberapa menit untuk membuat instance dan agar instance siap digunakan.

  2. Dalam instance yang dibuat, buat database:

    Konsol

    1. Di halaman instance Anda, buka tab Databases.
    2. Klik Create database.
    3. Dalam dialog Nama Database, masukkan DATABASE_NAME.
    4. Klik Create.

    gcloud

    • Buat database dalam instance yang baru saja dibuat:

      gcloud sql databases create DATABASE_NAME \
          --instance INSTANCE_NAME
      

      Ganti DATABASE_NAME dengan nama untuk database di dalam instance.

  3. Buat pengguna database:

    Konsol

    1. Di halaman instance Anda, buka tab Pengguna.
    2. Klik Add User Account.
    3. Dalam dialog Pilih cara mengautentikasi di bagian "Autentikasi Bawaan":
    4. Masukkan nama pengguna DATABASE_USERNAME.
    5. Masukkan sandi DATABASE_PASSWORD
    6. Klik Tambahkan.

    gcloud

    • Buat pengguna dalam instance yang baru saja dibuat:

      gcloud sql users create DATABASE_USERNAME \
          --instance INSTANCE_NAME \
          --password DATABASE_PASSWORD
      

      Ganti PASSWORD dengan sandi yang aman.

Menyiapkan Artifact Registry

Gunakan Artifact Registry untuk membuat registry guna menyimpan image container Anda.

Konsol

  1. Di konsol Google Cloud , buka halaman Artifact Registry.

    Buka halaman Artifact Registry

  2. Klik Create Repository.

  3. Masukkan:

    • Untuk Name, masukkan "cloud-run-source-deploy".
    • Untuk Format, pilih "Docker".
    • Untuk Region, pilih REGION.
  4. Pertahankan nilai default untuk kolom lainnya.

  5. Klik Create.

gcloud

  • Buat Artifact Registry:
gcloud artifacts repositories create cloud-run-source-deploy \
    --repository-format docker \
    --location REGION

Menyiapkan bucket Cloud Storage

Anda dapat menyimpan aset statis yang disertakan Django, serta media yang diupload pengguna, di penyimpanan objek dengan ketersediaan tinggi menggunakan Cloud Storage. Paket django-storages[google] menangani interaksi Django dengan backend penyimpanan ini.

Konsol

  1. Di konsol Google Cloud , buka halaman Cloud Storage.

    Buka halaman Cloud Storage

  2. Klik Create Bucket.

  3. Masukkan hal berikut (klik "Lanjutkan" jika diperlukan):

    • Untuk Name, masukkan "PROJECT_ID_MEDIA_BUCKET".
    • Untuk Region, pilih REGION.
    • Untuk Storage Class, pertahankan setelan default.
    • Untuk Prevent public access, hapus "Enforce public access prevention".
    • Untuk Access Control, pilih "Fine-grained".
  4. Pertahankan nilai default untuk kolom lainnya.

  5. Klik Create.

gcloud

  • Membuat bucket Cloud Storage:

    gcloud storage buckets create gs://PROJECT_ID_MEDIA_BUCKET --location=REGION
    

    Ganti MEDIA_BUCKET dengan akhiran untuk bucket media. Jika digabungkan dengan project ID, hal ini akan membuat nama bucket yang unik.

Menyimpan nilai rahasia di Secret Manager

Setelah layanan pendukung dikonfigurasi, Django memerlukan informasi tentang layanan ini. Daripada memasukkan nilai ini langsung ke dalam kode sumber Django, tutorial ini menggunakan Secret Manager untuk menyimpan informasi ini secara aman.

Membuat file lingkungan Django sebagai secret Secret Manager

Anda menyimpan setelan yang diperlukan untuk memulai Django dalam file env yang aman. Aplikasi contoh menggunakan Secret Manager API untuk mengambil nilai rahasia, dan paket django-environ untuk memuat nilai ke dalam lingkungan Django. Secret dikonfigurasi agar dapat diakses oleh Cloud Run dan Cloud Build.

  1. Buat file bernama .env, yang menentukan string koneksi database, nama bucket media, dan nilai SECRET_KEY baru:

    echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env
    echo GS_BUCKET_NAME=PROJECT_ID_MEDIA_BUCKET >> .env
    echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .env
    
  2. Simpan secret di Secret Manager:

    Konsol

    1. Di konsol Google Cloud , buka halaman Secret Manager.

      Buka halaman Secret Manager

    2. Klik Create secret.

    3. Di kolom Name, masukkan django_settings.

    4. Di dialog Secret value, tempelkan konten file .env Anda.

    5. Klik Create secret.

    6. Hapus file lokal untuk mencegah penggantian setelan lokal.

    gcloud

    1. Buat secret baru, django_settings, dengan nilai file .env:

      gcloud secrets create django_settings --data-file .env
      
    2. Hapus file lokal untuk mencegah penggantian setelan lokal:

      rm .env
      
  3. Konfigurasi akses ke secret:

    Konsol

    1. Di Secret: django_settings, catat nomor project:

      projects/PROJECTNUM/secrets/django_settings
      
    2. Klik tab Permissions.

    3. Klik Grant access.

    4. Di kolom New Members, masukkan PROJECTNUM-compute@developer.gserviceaccount.com, lalu tekan Enter.

    5. Di menu drop-down Role, pilih Secret Manager Secret Accessor.

    6. Klik Simpan.

    gcloud

    1. Dapatkan nilai Nomor Project (PROJECTNUM):

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
    
    1. Berikan akses ke secret ke akun layanan Cloud Run:

      gcloud secrets add-iam-policy-binding django_settings \
          --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

    Di output, konfirmasi bahwa bindings mencantumkan akun layanan baru.

Buat secret untuk sandi admin Django

Pengguna admin Django biasanya dibuat dengan menjalankan perintah pengelolaan interaktif createsuperuser.

Tutorial ini menggunakan migrasi data untuk membuat pengguna admin, dengan mengambil sandi admin dari Secret Manager.

Konsol

  1. Di konsol Google Cloud , buka halaman Secret Manager.
  2. Klik Create secret.

  3. Di kolom Name, masukkan superuser_password.

  4. Di kolom Secret value, masukkan sandi acak yang unik.

  5. Klik Create secret.

  6. Di Details for superuser_password, catat nomor project (projects/PROJECTNUM/secrets/superuser_password).

  7. Klik tab Permissions.

  8. Klik Tambahkan.

  9. Di kolom New Members, masukkan PROJECTNUM-compute@developer.gserviceaccount.com, lalu tekan Enter.

  10. Di menu drop-down Role, pilih Secret Manager Secret Accessor.

  11. Klik Simpan

gcloud

  1. Buat rahasia baru, superuser_password, dari sandi yang dibuat secara acak:

    echo -n "$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 30 | head -n1)" | gcloud secrets create superuser_password --data-file -
    
  2. Berikan akses ke secret untuk Cloud Build:

    gcloud secrets add-iam-policy-binding superuser_password \
        --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
        --role roles/secretmanager.secretAccessor
    

    Di output, konfirmasi bahwa bindings hanya mencantumkan Cloud Build sebagai anggota.

Menjalankan aplikasi di komputer lokal Anda

Setelah layanan pendukung dikonfigurasi, Anda kini dapat menjalankan aplikasi di komputer. Penyiapan ini memungkinkan pengembangan lokal, dan menerapkan migrasi database. Perhatikan bahwa migrasi database juga diterapkan di Cloud Build, tetapi Anda harus melakukan penyiapan lokal ini untuk makemigrations.

  1. Di terminal terpisah, mulai Proxy Auth Cloud SQL:

    Linux/macOS

    ./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
    

    Windows

    cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
    

    Langkah ini membuat koneksi dari komputer lokal Anda ke instance Cloud SQL untuk tujuan pengujian lokal. Biarkan Proxy Auth Cloud SQL tetap berjalan selama Anda menguji aplikasi secara lokal. Menjalankan proses ini di terminal terpisah memungkinkan Anda terus bekerja saat proses ini berjalan.

  2. Di terminal asli, tetapkan Project ID secara lokal (digunakan oleh Secret Manager API):

    Linux/macOS

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    

    Windows

    set GOOGLE_CLOUD_PROJECT=PROJECT_ID
    
  3. Tetapkan variabel lingkungan untuk menunjukkan bahwa Anda menggunakan Proxy Auth Cloud SQL (nilai ini dikenali dalam kode):

    Linux/macOS

    export USE_CLOUD_SQL_AUTH_PROXY=true
    

    Windows

    set USE_CLOUD_SQL_AUTH_PROXY=true
    
  4. Jalankan migrasi Django untuk menyiapkan model dan aset Anda:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    python manage.py collectstatic
    
  5. Mulai server web Django:

    python manage.py runserver 8080
    
  6. Di browser Anda, buka http://localhost:8080.

    Jika Anda berada di Cloud Shell, klik tombol Web Preview, lalu pilih Preview on port 8080.

    Halaman akan menampilkan teks berikut: "Hello, world. Anda berada di indeks jajak pendapat." Server web Django yang berjalan di komputer Anda akan menampilkan halaman aplikasi contoh.

  7. Tekan Ctrl/Cmd+C untuk menghentikan server web lokal.

Men-deploy aplikasi ke Cloud Run

Setelah penyiapan layanan pendukung, Anda kini dapat men-deploy layanan Cloud Run.

  1. Dengan menggunakan cloudmigrate.yaml yang disediakan, gunakan Cloud Build untuk membangun image, menjalankan migrasi database, dan mengisi aset statis:

    gcloud builds submit --config cloudmigrate.yaml \
        --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
    

    Build pertama ini membutuhkan waktu beberapa menit hingga selesai.

  2. Setelah build berhasil, deploy layanan Cloud Run untuk pertama kalinya, dengan menetapkan region layanan, image dasar, dan instance Cloud SQL yang terhubung:

    gcloud run deploy polls-service \
        --region REGION \
        --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/polls-service \
        --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \
        --allow-unauthenticated
    

    Anda akan melihat output yang menunjukkan bahwa deployment berhasil, dengan URL layanan:

    Service [polls-service] revision [polls-service-00001-tug] has been deployed
    and is serving 100 percent of traffic.
    Service URL: https://polls-service-PROJECT_ID.REGION.run.app
    
  3. Perbarui layanan ke URL layanan sebagai variabel lingkungan.

    CLOUDRUN_SERVICE_URLS=$(gcloud run services describe polls-service \
        --region $REGION  \
        --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
    
    gcloud run services update polls-service \
        --region REGION \
        --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"
    
  4. Untuk melihat layanan yang di-deploy, buka URL layanan.

  5. Untuk login ke admin Django, tambahkan /admin ke URL, lalu login dengan nama pengguna admin, dan sandi yang ditetapkan sebelumnya.

    Untuk mengambil sandi superuser dari Secret Manager:

    gcloud secrets versions access latest --secret superuser_password && echo ""
    

Memperbarui aplikasi

Meskipun langkah-langkah penyediaan dan deployment awal rumit, melakukan update adalah proses yang lebih sederhana:

  1. Jalankan skrip build dan migrasi Cloud Build:

    gcloud builds submit --config cloudmigrate.yaml \
        --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
    
  2. Deploy layanan, dengan hanya menentukan region dan image:

    gcloud run deploy polls-service \
        --region REGION \
        --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/polls-service
    

Mengonfigurasi untuk produksi

Sekarang Anda memiliki deployment Django yang berfungsi, tetapi ada langkah-langkah lebih lanjut yang dapat Anda lakukan untuk memastikan aplikasi Anda siap produksi.

Menonaktifkan proses debug

Pastikan variabel DEBUG di mysite/settings.py disetel ke False. Tindakan ini akan mencegah halaman error mendetail ditampilkan kepada pengguna, yang dapat membocorkan informasi tentang konfigurasi.

Membatasi hak istimewa pengguna database

Semua pengguna yang dibuat menggunakan Cloud SQL memiliki hak istimewa yang terkait dengan peran cloudsqlsuperuser: CREATEROLE, CREATEDB, dan LOGIN.

Untuk mencegah pengguna database Django memiliki izin ini, buat pengguna secara manual di PostgreSQL. Anda harus menginstal terminal interaktif psql, atau menggunakan Cloud Shell yang telah menginstal alat ini.

Konsol

  1. Di konsol Google Cloud , aktifkan Cloud Shell.

    Aktifkan Cloud Shell

  2. Di Cloud Shell, gunakan terminal bawaan untuk terhubung ke instance INSTANCE_NAME Anda:

    gcloud sql connect INSTANCE_NAME --user postgres
    
  3. Masukkan sandi pengguna postgres.

    Anda kini menggunakan psql. Anda akan melihat perintah postgres=>.

  4. Buat pengguna:

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    

    Ganti PASSWORD dengan sandi acak yang unik.

  5. Berikan hak penuh di database baru kepada pengguna baru:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  6. Keluar dari psql:

    \q
    

gcloud

  1. Mulai koneksi ke instance SQL:

    gcloud sql connect INSTANCE_NAME --user postgres
    

    Ganti INSTANCE_NAME dengan instance Cloud SQL yang dibuat.

  2. Masukkan sandi pengguna postgres.

    Anda kini menggunakan psql. Anda akan melihat perintah postgres=>.

  3. Buat pengguna:

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    
  4. Berikan hak penuh di database baru kepada pengguna baru:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  5. Keluar dari psql:

    \q
    

Menetapkan izin minimum

Secara default, layanan ini di-deploy dengan akun layanan komputasi default. Namun, dalam beberapa kasus, penggunaan akun layanan default dapat memberikan terlalu banyak izin. Jika Anda ingin lebih membatasi, Anda perlu membuat akun layanan sendiri dan hanya memberikan izin yang diperlukan oleh layanan Anda. Izin yang diperlukan dapat bervariasi dari layanan ke layanan, bergantung pada resource yang digunakan oleh layanan tertentu.

Peran project minimum yang diperlukan oleh layanan ini adalah sebagai berikut:

  • Cloud Run Invoker
  • Cloud SQL Client
  • Storage Admin, di bucket media
  • Secret Manager Accessor, pada secret setelan Django. (Akses ke rahasia admin Django tidak diperlukan oleh layanan itu sendiri.)

Untuk membuat akun layanan dengan izin yang diperlukan, dan menetapkannya ke layanan, jalankan perintah berikut:

  1. Di gcloud CLI, buat akun layanan dengan peran yang diperlukan:

    gcloud iam service-accounts create polls-service-account
    SERVICE_ACCOUNT=polls-service-account@PROJECT_ID.iam.gserviceaccount.com
    
    # Cloud SQL Client
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:${SERVICE_ACCOUNT} \
        --role roles/cloudsql.client
    
    # Storage Admin, on the media bucket
    gcloud storage buckets add-iam-policy-binding gs://MEDIA_BUCKET \
        --member=serviceAccount:${SERVICE_ACCOUNT} \
        --role=roles/storage.objectAdmin
    
    # Secret Accessor, on the Django settings secret.
    gcloud secrets add-iam-policy-binding django_settings \
        --member serviceAccount:${SERVICE_ACCOUNT} \
        --role roles/secretmanager.secretAccessor
    
    # Secret Accessor, on the Django super user password.
    gcloud secrets add-iam-policy-binding superuser_password \
        --member serviceAccount:${SERVICE_ACCOUNT} \
        --role roles/secretmanager.secretAccessor
    
  2. Deploy layanan, dengan mengaitkannya ke akun layanan baru:

    gcloud run services update polls-service \
        --region REGION \
        --service-account ${SERVICE_ACCOUNT}
    
  3. Perbarui tugas Cloud Run di cloudmigrate.yaml agar juga memiliki setelan --service-account ini.

Memahami kode

Contoh aplikasi

Aplikasi contoh Django dibuat menggunakan alat Django standar. Perintah berikut akan membuat project dan aplikasi polling:

django-admin startproject mysite
python manage.py startapp polls

Konfigurasi tampilan, model, dan rute dasar disalin dari Menulis aplikasi Django pertama Anda (Bagian 1 dan Bagian 2).

Secret dari Secret Manager

File settings.py berisi kode yang menggunakan Secret Manager Python API untuk mengambil versi terbaru dari secret bernama, dan menariknya ke dalam lingkungan (menggunakan django-environ):

# SECURITY WARNING: don't run with debug turned on in production!
# Change this to "False" when you are ready for production
env = environ.Env(DEBUG=(bool, True))
env_file = os.path.join(BASE_DIR, ".env")

# Attempt to load the Project ID into the environment, safely failing on error.
try:
    _, os.environ["GOOGLE_CLOUD_PROJECT"] = google.auth.default()
except google.auth.exceptions.DefaultCredentialsError:
    pass

if os.path.isfile(env_file):
    # Use a local secret file, if provided

    env.read_env(env_file)
# ...
elif os.environ.get("GOOGLE_CLOUD_PROJECT", None):
    # Pull secrets from Secret Manager
    project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")

    client = secretmanager.SecretManagerServiceClient()
    settings_name = os.environ.get("SETTINGS_NAME", "django_settings")
    name = f"projects/{project_id}/secrets/{settings_name}/versions/latest"
    payload = client.access_secret_version(name=name).payload.data.decode("UTF-8")

    env.read_env(io.StringIO(payload))
else:
    raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")

Secret digunakan untuk menyimpan beberapa nilai secret guna mengurangi jumlah secret berbeda yang perlu dikonfigurasi.

Konfigurasi CSRF

Django memiliki perlindungan bawaan terhadap Pemalsuan Permintaan Lintas Situs (CSRF). Mulai Django 4.0, perubahan pada cara kerjanya berarti penting untuk memberi tahu Django URL yang dihosting, sehingga Django dapat menawarkan perlindungan terbaik bagi pengguna yang mengirimkan data.

Anda memberikan URL aplikasi sebagai variabel lingkungan dalam file settings.py Ini adalah nilai yang digunakan Django untuk setelan yang relevan.

# SECURITY WARNING: It's recommended that you use this when
# running in production. The URLs will be known once you first deploy
# to Cloud Run. This code takes the URLs and converts it to both these settings formats.
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]

    SECURE_SSL_REDIRECT = True
    SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
else:
    ALLOWED_HOSTS = ["*"]

Penggantian rahasia lokal

Jika file .env ditemukan di sistem file lokal, file tersebut akan digunakan, bukan nilai dari Secret Manager. Membuat file .env secara lokal dapat membantu pengujian lokal (misalnya, pengembangan lokal terhadap database SQLite, atau setelan lokal lainnya).

Koneksi database

File settings.py berisi konfigurasi untuk database SQL Anda. Kode ini menggunakan helper env.db() dari django-environ untuk memuat string koneksi yang ditetapkan di DATABASE_URL ke dalam setelan DATABASES.

Saat menjalankan aplikasi secara lokal dan menggunakan Proxy Auth Cloud SQL untuk mengakses database yang dihosting, tanda USE_CLOUD_SQL_AUTH_PROXY akan menyesuaikan setelan database untuk menggunakan proxy.

# Use django-environ to parse the connection string
DATABASES = {"default": env.db()}

# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

Statis yang disimpan di cloud

File settings.py juga menggunakan django-storages untuk mengintegrasikan bucket media Cloud Storage langsung ke project:

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATIC_URL = "/static/"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}
GS_DEFAULT_ACL = "publicRead"

Otomatisasi dengan Cloud Build

cloudmigrate.yaml menangani semua langkah yang diperlukan untuk membuat image penampung baru, dan menggunakannya untuk menerapkan migrasi database.

Tutorial ini memilih untuk menggunakan buildpack guna membangun image container, dan entrypoint kustom di Procfile untuk menangani perintah pengelolaan. Kemudian, perintah ini dapat dirujuk oleh tugas Cloud Run untuk menjalankan perintah.

steps:
  - id: "Build Container Image"
    name: gcr.io/k8s-skaffold/pack
    args: ["build", "${_IMAGE_NAME}", "--builder=gcr.io/buildpacks/builder"]

  - id: "Push Container Image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "${_IMAGE_NAME}"]

  - id: "Migrate database"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: /bin/bash
    args:
      - "-c"
      - |
        gcloud run jobs create migrate-job \
          --region ${_REGION} \
          --image ${_IMAGE_NAME} \
          --set-cloudsql-instances ${_CLOUD_SQL_CONNECTION_NAME} \
          --set-env-vars SETTINGS_NAME=${_SECRET_SETTINGS_NAME} \
          --command migrate \
          --execute-now

  - id: "Create superuser"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: /bin/bash
    args:
      - "-c"
      - |
        gcloud run jobs create superuser-job \
          --region ${_REGION} \
          --image ${_IMAGE_NAME} \
          --set-cloudsql-instances ${_CLOUD_SQL_CONNECTION_NAME} \
          --set-env-vars SETTINGS_NAME=${_SECRET_SETTINGS_NAME} \
          --set-env-vars DJANGO_SUPERUSER_EMAIL=${_ADMIN_EMAIL} \
          --set-secrets DJANGO_SUPERUSER_PASSWORD=${_ADMIN_PASSWORD_NAME}:latest \
          --command createsuperuser \
          --execute-now

options:
  dynamicSubstitutions: true

substitutions:
  _INSTANCE_NAME: django-instance
  _CLOUD_SQL_CONNECTION_NAME: ${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}
  _REGION: us-central1
  _SERVICE_NAME: polls-service
  _SECRET_SETTINGS_NAME: django_settings
  _ARTIFACT_REGISTRY: cloud-run-source-deploy
  _IMAGE_NAME: ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY}/${_SERVICE_NAME}
  _ADMIN_EMAIL: example@example.com
  _ADMIN_PASSWORD_NAME: superuser_password

images:
  - "${_IMAGE_NAME}"

Variabel penggantian digunakan dalam konfigurasi ini.

Pembuatan pengguna super dengan Tugas Cloud Run

Perintah pengelolaan Django createsuperuser dapat dijalankan secara non-interaktif dengan menyetel DJANGO_SUPERUSER_EMAIL dan DJANGO_SUPERUSER_PASSWORD.

Tutorial ini memilih untuk menggunakan Cloud Run Jobs guna menjalankan perintah ini. Hal ini dilakukan dengan menambahkan entri kustom ke Procfile yang menjalankan createsuperuser.

# Create superuser (requires DJANGO_SUPERUSER_PASSWORD and DJANGO_SUPERUSER_EMAIL envvars)
createsuperuser: python manage.py createsuperuser --username admin --noinput || echo "User already exists."

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

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.

Langkah berikutnya