PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menyebarkan Django + Python 3 + PostgreSQL ke AWS Elastic Beanstalk

Berikut ini adalah panduan singkat tentang cara menyiapkan dan menerapkan aplikasi Django, yang didukung oleh Python 3, dan PostgreSQL ke Amazon Web Services (AWS) sambil tetap waras.

Alat/teknologi yang digunakan:

  1. Python v3.4.3
  2. Django v1.9
  3. Amazon Elastic Beanstalk, EC2, S3, dan RDS
  4. EB CLI 3.x
  5. PostgreSQL

Bonus Gratis: Klik di sini untuk mendapatkan akses ke Panduan Sumber Daya Pembelajaran Django (PDF) gratis yang menunjukkan kepada Anda tip dan trik serta perangkap umum yang harus dihindari saat membangun aplikasi web Python + Django.

Lihat Python 2 versi artikel ini di sini.

Diperbarui 21/08/2016: Pengaturan konfigurasi global EB yang diperbarui.


Pohon Kacang Elastis vs EC2

Elastic Beanstalk adalah Platform As A Service (PaaS) yang menyederhanakan penyiapan, penerapan, dan pemeliharaan aplikasi Anda di Amazon AWS. Ini adalah layanan terkelola, menggabungkan server (EC2), database (RDS), dan file statis Anda (S3). Anda dapat dengan cepat menerapkan dan mengelola aplikasi Anda, yang secara otomatis diskalakan seiring pertumbuhan situs Anda. Lihat dokumentasi resmi untuk informasi lebih lanjut.



Memulai

Kami akan menggunakan aplikasi “Image of the Day” sederhana, yang dapat Anda ambil dari repositori ini:

$ git clone https://github.com/realpython/image-of-the-day.git
$ cd image-of-the-day/
$ git checkout tags/start_here_py3

Setelah Anda mengunduh kode, buat virtualenv dan instal persyaratannya melalui pip:

$ pip install -r requirements.txt

Selanjutnya, dengan PostgreSQL yang berjalan secara lokal, siapkan database baru bernama iotd . Juga, tergantung pada konfigurasi Postgres lokal Anda, Anda mungkin perlu memperbarui DATABASES konfigurasi di settings.py . Misalnya, saya memperbarui konfigurasi ke:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'iotd',
        'USER': '',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

Sekarang Anda dapat mengatur skema database, membuat pengguna super, dan menjalankan aplikasi:

$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver

Arahkan ke halaman admin di browser Anda di http://localhost:8000/admin dan tambahkan gambar baru, yang kemudian akan ditampilkan di halaman utama.

Aplikasi ini tidak dimaksudkan untuk menjadi sangat menarik; kami hanya menggunakannya untuk tujuan demo. Semua itu memungkinkan Anda mengunggah gambar melalui antarmuka admin dan menampilkan gambar itu secara layar penuh di halaman utama. Meskipun demikian, meskipun ini adalah aplikasi yang relatif mendasar, aplikasi ini masih memungkinkan kami untuk menjelajahi sejumlah "gotcha" yang ada saat menerapkan ke Amazon Beanstalk dan RDS.

Sekarang setelah situs kita aktif dan berjalan di mesin lokal kita, mari kita mulai proses penerapan Amazon.



CLI untuk AWS Elastic Beanstalk

Untuk bekerja dengan Amazon Elastic Beanstalk, kita dapat menggunakan paket yang disebut awsebcli. Saat tulisan ini dibuat, versi terbaru adalah 3.7.4 dan cara yang disarankan untuk menginstalnya adalah dengan pip:

$ pip install awsebcli

Sekarang uji penginstalan untuk memastikannya berfungsi:

$ eb --version

Ini akan memberi Anda nomor versi 3.x yang bagus:

EB CLI 3.7.4 (Python 3.4.3)

Untuk benar-benar mulai menggunakan Elastic Beanstalk, Anda memerlukan akun dengan AWS (kejutan!). Daftar (atau masuk).



Konfigurasi EB – Inisialisasi Aplikasi Anda

Dengan AWS Elastic Beanstalk CLI yang berfungsi, hal pertama yang ingin kami lakukan adalah membuat lingkungan Beanstalk untuk menghosting aplikasi. Jalankan ini dari direktori proyek (“image-of-the-day”):

$ eb init

Ini akan meminta Anda dengan sejumlah pertanyaan untuk membantu Anda mengonfigurasi lingkungan Anda.

Wilayah default

Memilih wilayah yang paling dekat dengan pengguna akhir Anda umumnya akan memberikan kinerja terbaik. Lihat peta ini jika Anda tidak yakin harus memilih yang mana.

Kredensial

Selanjutnya, ia akan meminta kredensial AWS Anda.

Di sini, kemungkinan besar Anda ingin menyiapkan Pengguna IAM. Lihat panduan ini untuk cara mengaturnya. Jika Anda menyiapkan pengguna baru, Anda perlu memastikan bahwa pengguna tersebut memiliki izin yang sesuai. Cara termudah untuk melakukannya adalah dengan menambahkan "Akses Administrator" ke Pengguna. (Namun, ini mungkin bukan pilihan yang bagus untuk alasan keamanan.) Untuk kebijakan/peran khusus yang dibutuhkan pengguna untuk membuat/mengelola aplikasi Elastic Beanstalk, lihat tautan di sini.

Nama aplikasi

Ini akan default ke nama direktori. Lakukan saja.

Versi Python

Selanjutnya, CLI akan secara otomatis mendeteksi bahwa Anda menggunakan Python dan hanya meminta konfirmasi. Bilang iya. Maka Anda perlu memilih versi platform. Anda memiliki 2 opsi berbeda di sini untuk Python 3:

  • Python 3.4
  • Python 3.4 (Dikonfigurasi sebelumnya - Docker)

Jika Anda seorang hipster, pilih pilihan 'Preconfigured - Docker', jika tidak gunakan 'Python 3.4' yang normal. Tidak, hanya menggoda; perbedaan mendasarnya adalah ini:


Python 3.4

Ini memberi Anda gambar EC2 yang menjalankan Amazon Linux 64bit dengan Python 3.4 yang sudah diinstal sebelumnya. Server web ujung depan adalah apache, dengan mod_wsgi diinstal. Ini adalah cara kerja "standar" atau "tradisional" Pohon Kacang. Dengan kata lain, dengan opsi ini Pohon Kacang akan membuat gambar EC2 untuk Anda, dan Anda dapat menggunakan ebextension file yang akan kita bicarakan nanti untuk menyesuaikan gambar EC2.



Python 3.4 (Dikonfigurasi sebelumnya – Docker)

Ini memberi Anda gambar EC2 yang menjalankan Docker, dengan gambar Docker sudah disiapkan untuk Anda. Gambar Docker menjalankan Debian Jessie 64bit dengan Python 3.4, nginx 1.8 dan uWSGI 2.0.8. Karena pada dasarnya Anda berinteraksi dengan image Docker secara langsung, jika Anda memilih rute ini, Anda akan menggunakan teknik konfigurasi Docker standar (yaitu, 'Dockerfile'), dan kemudian Anda tidak perlu melakukan banyak hal yang spesifik untuk AWS Beanstalk, seperti Pohon Kacang tahu cara mengelola gambar Docker untuk Anda.

Untuk artikel ini kita akan fokus pada cara "standar" atau "tradisional" dalam menggunakan gambar EC2, jadi pilih opsi 'Python 3.4' dan mari kita lanjutkan.

SSH

Katakan ya untuk menyiapkan SSH untuk instans Anda.

Pasangan Kunci RSA

Selanjutnya, Anda perlu membuat keypair RSA, yang akan ditambahkan ke ~/.ssh Anda map. Pasangan kunci ini juga akan diunggah ke kunci publik EC2 untuk wilayah yang Anda tentukan di langkah pertama. Ini akan memungkinkan Anda untuk SSH ke instans EC2 Anda nanti dalam tutorial ini.



Apa yang telah kita capai?

Sekali eb init selesai, Anda akan melihat folder tersembunyi baru bernama .elasticbeanstalk di direktori proyek Anda:

├── .elasticbeanstalk
│   └── config.yml
├── .gitignore
├── README.md
├── iotd
│   ├── images
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── migrations
│   │   │   ├── 0001_initial.py
│   │   │   └── __init__.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   └── views.py
│   ├── iotd
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── manage.py
│   ├── static
│   │   ├── css
│   │   │   └── bootstrap.min.css
│   │   └── js
│   │       ├── bootstrap.min.js
│   │       └── jquery-1.11.0.min.js
│   └── templates
│       ├── base.html
│       └── images
│           └── home.html
├── requirements.txt
└── www
    └── media
        └── sitelogo.png

Di dalam direktori itu ada config.yml file, yang merupakan file konfigurasi yang digunakan untuk menentukan parameter tertentu untuk aplikasi Pohon Kacang Anda yang baru dibuat.

Pada titik ini, jika Anda mengetik eb console itu akan membuka browser default Anda dan menavigasi ke konsol Elastic Beanstalk. Pada halaman tersebut, Anda akan melihat satu aplikasi (disebut image-of-the-day jika Anda mengikuti dengan tepat), tetapi tidak ada lingkungan.

Sebuah aplikasi mewakili aplikasi kode Anda dan merupakan eb init diciptakan untuk kita. Dengan Elastic Beanstalk, aplikasi dapat memiliki beberapa lingkungan (yaitu, pengembangan, pengujian, pementasan, produksi). Terserah Anda bagaimana Anda ingin mengonfigurasi/mengelola lingkungan ini. Untuk aplikasi Django sederhana saya ingin memiliki lingkungan pengembangan di laptop saya, kemudian membuat pengujian dan lingkungan produksi di Pohon Kacang.

Mari kita siapkan lingkungan pengujian…




Konfigurasi EB – Buat Lingkungan

Kembali ke terminal, dalam jenis direktori proyek Anda:

$ eb create

Sama seperti eb init , perintah ini akan meminta Anda dengan serangkaian pertanyaan.

Nama Lingkungan

Anda harus menggunakan konvensi penamaan yang serupa dengan yang disarankan Amazon - mis., application_name-env_name - terutama ketika/jika Anda mulai menghosting beberapa aplikasi dengan AWS. Saya menggunakan - iod-test .

Awalan DNS CNAME

Saat Anda menerapkan aplikasi ke Elastic Beanstalk, Anda akan secara otomatis mendapatkan nama domain seperti xxx.elasticbeanstalk.com. DNS CNAME prefix adalah apa yang ingin Anda gunakan sebagai pengganti xxx . Defaultnya mungkin tidak akan berfungsi jika Anda mengikuti karena orang lain telah menggunakannya (namanya bersifat global untuk AWS), jadi pilihlah sesuatu yang unik dan lanjutkan.


Apa yang terjadi sekarang?

Pada titik ini eb benar-benar akan menciptakan lingkungan Anda untuk Anda. Bersabarlah karena ini bisa memakan waktu.

Jika Anda mendapatkan kesalahan saat membuat lingkungan, seperti - aws.auth.client.error.ARCInstanceIdentityProfileNotFoundException - periksa apakah kredensial yang Anda gunakan memiliki izin yang sesuai untuk membuat lingkungan Pohon Kacang, seperti yang dibahas sebelumnya dalam posting ini.

Juga, ini mungkin meminta Anda dengan pesan tentang Platform requires a service role . Jika ya, katakan saja ya dan biarkan dia membuat peran untuk Anda.

Segera setelah lingkungan dibuat, eb akan mencoba menerapkan aplikasi Anda, dengan menyalin semua kode di direktori proyek Anda ke instans EC2 baru, menjalankan pip install -r requirements.txt dalam proses.

Anda akan melihat banyak informasi tentang lingkungan yang sedang disiapkan ditampilkan di layar Anda, serta informasi tentang eb mencoba untuk menyebarkan. Anda juga akan melihat beberapa kesalahan. Secara khusus Anda akan melihat baris ini terkubur di suatu tempat di output:

ERROR: Your requirements.txt is invalid. Snapshot your logs for details.

Jangan khawatir - Ini tidak benar-benar tidak valid. Periksa log untuk detailnya:

$ eb logs

Ini akan mengambil semua file log terbaru dari instans EC2 dan mengeluarkannya ke terminal Anda. Ini banyak informasi, jadi Anda mungkin ingin mengarahkan output ke file (eb logs -z ). Melihat melalui log, Anda akan melihat satu file log bernama eb-activity.log :

Error: pg_config executable not found.

Masalahnya adalah kami mencoba menginstal psycopy2 (binding Postgres Python), tetapi kita juga perlu menginstal driver klien Postgres. Karena mereka tidak diinstal secara default, kita perlu menginstalnya terlebih dahulu. Mari kita perbaiki…




Menyesuaikan Proses Penerapan

eb akan membaca .config khusus file dari folder bernama ".ebextensions" di tingkat akar proyek Anda (direktori "image-of-the-day"). Ini .config file memungkinkan Anda untuk menginstal paket, menjalankan perintah arbitrer dan/atau mengatur variabel lingkungan. File dalam direktori “.ebextensions” harus sesuai dengan salah satu JSON atau YAML sintaks dan dieksekusi dalam urutan abjad.


Menginstal paket

Hal pertama yang perlu kita lakukan adalah menginstal beberapa paket sehingga pip install perintah akan berhasil diselesaikan. Untuk melakukannya, pertama-tama buat file bernama .ebextensions/01_packages.config :

packages:
  yum:
    git: []
    postgresql93-devel: []
    libjpeg-turbo-devel: []

Instans EC2 menjalankan Amazon Linux, yang merupakan varian Redhat, sehingga kami dapat menggunakan yum untuk menginstal paket yang kami butuhkan. Untuk saat ini, kita hanya akan menginstal tiga paket - git, klien Postgres, dan libjpeg untuk Bantal.

Setelah membuat file itu untuk menerapkan ulang aplikasi, kita perlu melakukan hal berikut:

$ git add .ebextensions/
$ git commit -m "added eb package configuration"

Kita harus melakukan perubahan karena perintah penerapan eb deploy bekerja dari komit terbaru, dan dengan demikian hanya akan mengetahui perubahan file kami setelah kami mengkomitnya ke git. (Perhatikan bahwa kami tidak perlu mendorong; kami bekerja dari salinan lokal kami…)

Seperti yang mungkin sudah Anda duga, perintah berikutnya adalah:

$ eb deploy

Anda seharusnya sekarang hanya melihat satu kesalahan:

INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
ERROR: Your WSGIPath refers to a file that does not exist.
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

Mari kita cari tahu apa yang terjadi…



Mengonfigurasi lingkungan Python kami

Instans EC2 di Pohon Kacang menjalankan Apache, dan Apache akan menemukan aplikasi Python kami sesuai dengan WSGIPATH yang telah kami tetapkan. Secara default eb menganggap file wsgi kita bernama application.py . Ada dua cara untuk memperbaiki ini-

Opsi 1:Menggunakan setelan konfigurasi khusus lingkungan

$ eb config

Perintah ini akan membuka editor default Anda, mengedit file konfigurasi bernama .elasticbeanstalk/iod-test.env.yml . File ini sebenarnya tidak ada secara lokal; eb menariknya dari server AWS dan menyajikannya kepada Anda sehingga Anda dapat mengubah pengaturan di dalamnya. Jika Anda membuat perubahan apa pun pada file semu ini lalu simpan dan keluar, eb akan memperbarui pengaturan yang sesuai di lingkungan Pohon Kacang Anda.

Jika Anda mencari istilah 'WSGI' dalam file, dan Anda akan menemukan bagian konfigurasi yang terlihat seperti ini:

aws:elasticbeanstalk:container:python:
  NumProcesses: '1'
  NumThreads: '15'
  StaticFiles: /static/=static/
  WSGIPath: application.py

Perbarui WSGIPath:

 aws:elasticbeanstalk:container:python:
   NumProcesses: '1'
   NumThreads: '15'
   StaticFiles: /static/=static/
   WSGIPath: iotd/iotd/wsgi.py

Dan kemudian Anda akan mengatur WSGIPath dengan benar. Jika Anda kemudian menyimpan file dan keluar, eb akan memperbarui konfigurasi lingkungan secara otomatis:

Printing Status:
INFO: Environment update is starting.
INFO: Updating environment iod-test's configuration settings.
INFO: Successfully deployed new configuration to environment.
INFO: Environment update completed successfully.

Keuntungan menggunakan eb config metode untuk mengubah pengaturan adalah Anda dapat menentukan pengaturan yang berbeda per lingkungan. Tetapi Anda juga dapat memperbarui pengaturan menggunakan .config yang sama file yang kami gunakan sebelumnya. Ini akan menggunakan pengaturan yang sama untuk setiap lingkungan, seperti .config file akan diterapkan pada penerapan (setelah pengaturan dari eb config telah diterapkan).

Opsi 2:Menggunakan setelan konfigurasi global

Untuk menggunakan .config opsi file, mari buat file baru bernama /.ebextensions/02_python.config :

option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "iotd.settings"
    "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: iotd/iotd/wsgi.py
    NumProcesses: 3
    NumThreads: 20
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "www/static/"

Apa yang terjadi?

  • DJANGO_SETTINGS_MODULE: "iotd.settings" - menambahkan jalur ke modul pengaturan.
  • "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH" - memperbarui PYTHONPATH kami sehingga Python dapat menemukan modul di aplikasi kita. Jalur ini dapat bervariasi tergantung pada pengaturan Anda! Lihat komentar ini untuk detail lebih lanjut. (Perhatikan bahwa penggunaan jalur lengkap diperlukan.)
  • WSGIPath: iotd/iotd/wsgi.py menetapkan Jalur WSGI kami.
  • NumProcesses: 3 dan NumThreads: 20 - memperbarui jumlah proses dan utas yang digunakan untuk menjalankan aplikasi WSGI kami.
  • "/static/": "www/static/" menyetel jalur file statis kami.

Sekali lagi, kita dapat melakukan git commit kemudian eb deploy untuk memperbarui setelan ini.

Selanjutnya mari kita tambahkan database.




Mengonfigurasi Basis Data

Coba lihat situs web yang digunakan:

$ eb open

Perintah ini akan menampilkan aplikasi yang digunakan di browser default Anda. Anda akan melihat kesalahan koneksi yang ditolak:

OperationalError at /
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

Ini karena kami belum menyiapkan database. Pada titik ini eb akan mengatur lingkungan Pohon Kacang Anda, tetapi tidak mengatur RDS (tingkat database). Kita harus mengaturnya secara manual.


Penyiapan basis data

Sekali lagi, gunakan eb console untuk membuka halaman konfigurasi Pohon Kacang.

Dari sana, lakukan hal berikut:

  1. Klik tautan “Konfigurasi”.
  2. Gulir sepenuhnya ke bagian bawah halaman, lalu di bawah bagian “Tingkat Data”, klik link “buat database RDS baru”.
  3. Pada halaman penyiapan RDS, ubah “Mesin DB” menjadi “postgres”.
  4. Tambahkan “Nama Pengguna Utama” dan “Kata Sandi Utama”.
  5. Simpan perubahannya.

Pohon Kacang akan membuat RDS untuk Anda. Sekarang kita perlu mendapatkan aplikasi Django kita untuk terhubung ke RDS. Pohon Kacang akan membantu kami di sini dengan memaparkan sejumlah variabel lingkungan pada instance EC2 untuk kami yang merinci cara terhubung ke server Postgres. Jadi yang perlu kita lakukan hanyalah memperbarui settings.py kita file untuk memanfaatkan variabel lingkungan tersebut. Konfirmasikan bahwa DATABASES parameter konfigurasi mencerminkan hal berikut di settings.py :

if 'RDS_DB_NAME' in os.environ:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'iotd',
            'USER': 'iotd',
            'PASSWORD': 'iotd',
            'HOST': 'localhost',
            'PORT': '5432',
        }
    }

Ini hanya mengatakan, "gunakan pengaturan variabel lingkungan jika ada, jika tidak gunakan pengaturan pengembangan default kami." Sederhana.



Menangani migrasi basis data

Dengan setup database kita, kita masih perlu memastikan bahwa migrasi berjalan sehingga struktur tabel database sudah benar. Kita dapat melakukannya dengan memodifikasi .ebextensions/02_python.config dan tambahkan baris berikut di bagian atas file:

container_commands:
  01_migrate:
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
    leader_only: true

container_commands memungkinkan Anda menjalankan perintah arbitrer setelah aplikasi diterapkan pada instans EC2. Karena instans EC2 diatur menggunakan lingkungan virtual, pertama-tama kita harus mengaktifkan lingkungan virtual tersebut sebelum menjalankan perintah migrasi. Juga leader_only: true pengaturan berarti, "jalankan perintah ini hanya pada contoh pertama saat menerapkan ke beberapa contoh."

Jangan lupa bahwa aplikasi kita menggunakan admin Django, jadi kita akan membutuhkan superuser…



Buat Pengguna Admin

Sayangnya createsuperuser tidak mengizinkan Anda menentukan sandi saat menggunakan --noinput pilihan, jadi kita harus menulis perintah kita sendiri. Untungnya, Django membuatnya sangat mudah untuk membuat perintah khusus.

Buat file iotd/images/management/commands/createsu.py :

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User


class Command(BaseCommand):

    def handle(self, *args, **options):
        if not User.objects.filter(username="admin").exists():
            User.objects.create_superuser("admin", "[email protected]", "admin")

Pastikan Anda menambahkan __init__.py yang sesuai file juga:

└─ management
    ├── __init__.py
    └── commands
        ├── __init__.py
        └── createsu.py

File ini akan memungkinkan Anda untuk menjalankan python manage.py createsu , dan itu akan membuat pengguna super tanpa meminta kata sandi. Jangan ragu untuk memperluas perintah untuk menggunakan variabel lingkungan atau cara lain untuk memungkinkan Anda mengubah kata sandi.

Setelah perintah dibuat, kita bisa menambahkan perintah lain ke container_commands kita bagian di .ebextensions/02_python.config :

02_createsu:
  command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
  leader_only: true

Sebelum Anda menguji ini, mari pastikan semua file statis kita diletakkan di tempat yang benar…




File Statis

Tambahkan satu perintah lagi di bawah container_commands :

03_collectstatic:
  command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"

Jadi seluruh file terlihat seperti ini:

container_commands:
  01_migrate:
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
    leader_only: true
  02_createsu:
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
    leader_only: true
  03_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"

option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "iotd.settings"
    "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
    "ALLOWED_HOSTS": ".elasticbeanstalk.com"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: iotd/iotd/wsgi.py
    NumProcesses: 3
    NumThreads: 20
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "www/static/"

Sekarang kita perlu memastikan bahwa STATIC_ROOT diatur dengan benar di settings.py berkas:

STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'

Pastikan Anda melakukan www direktori ke git sehingga direktori statis dapat dibuat. Kemudian jalankan eb deploy lagi, dan Anda sekarang harus berbisnis:

INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

Pada titik ini Anda seharusnya dapat membuka http://your_app_url/admin, masuk, menambahkan gambar, dan kemudian melihat gambar tersebut ditampilkan di halaman utama aplikasi Anda.

Sukses!



Menggunakan S3 untuk Penyimpanan Media

Dengan pengaturan ini, setiap kali kami menerapkan lagi, kami akan kehilangan semua gambar yang kami unggah. Mengapa? Nah, ketika Anda menjalankan eb deploy , sebuah instance baru telah disiapkan untuk Anda. Ini bukan yang kami inginkan karena kami kemudian akan memiliki entri dalam database untuk gambar, tetapi tidak ada gambar terkait. Solusinya adalah menyimpan file media di Amazon Simple Storage Service (Amazon S3), bukan di instans EC2 itu sendiri.

Anda perlu:

  1. Buat ember
  2. Ambil ARN pengguna Anda (Nama Sumber Daya Amazon)
  3. Tambahkan izin keranjang
  4. Konfigurasikan aplikasi Django Anda untuk menggunakan S3 untuk menyajikan file statis Anda

Karena sudah ada tulisan bagus tentang ini, saya hanya akan mengarahkan Anda ke favorit saya:Menggunakan Amazon S3 untuk menyimpan Anda Django Static dan File Media



Konfigurasi Apache

Karena kami menggunakan Apache dengan Pohon Kacang, kami mungkin ingin mengatur Apache untuk (antara lain) mengaktifkan kompresi gzip sehingga file diunduh lebih cepat oleh klien. Itu dapat dilakukan dengan container_commands . Buat file baru .ebextensions/03_apache.config dan tambahkan berikut ini:

container_commands:
  01_setup_apache:
    command: "cp .ebextensions/enable_mod_deflate.conf /etc/httpd/conf.d/enable_mod_deflate.conf"

Kemudian Anda perlu membuat file .ebextensions/enable_mod_deflate.conf :

# mod_deflate configuration
<IfModule mod_deflate.c>
  # Restrict compression to these MIME types
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/xml+rss
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/css
  # Level of compression (Highest 9 - Lowest 1)
  DeflateCompressionLevel 9
  # Netscape 4.x has some problems.
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  # Netscape 4.06-4.08 have some more problems
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  # MSIE masquerades as Netscape, but it is fine
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
<IfModule mod_headers.c>
  # Make sure proxies don't deliver the wrong content
  Header append Vary User-Agent env=!dont-vary
</IfModule>
</IfModule>

Melakukan ini akan mengaktifkan kompresi gzip, yang akan membantu dengan ukuran file yang Anda unduh. Anda juga dapat menggunakan strategi yang sama untuk memperkecil dan menggabungkan CSS/JS Anda secara otomatis dan melakukan prapemrosesan lain yang perlu Anda lakukan.



Pemecahan Masalah

Jangan lupa eb ssh yang sangat membantu perintah, yang akan membawa Anda ke instans EC2 sehingga Anda dapat melihat-lihat dan melihat apa yang terjadi. Saat memecahkan masalah, ada beberapa direktori yang harus Anda ketahui:

  • /opt/python :Akar tempat aplikasi Anda akan berakhir.
  • /opt/python/current/app :Aplikasi saat ini yang di-host di lingkungan.
  • /opt/python/on-deck/app :Aplikasi awalnya diletakkan di dek dan kemudian, setelah semua penerapan selesai, itu akan dipindahkan ke current . Jika Anda mendapatkan kegagalan dalam container_commands , lihat on-deck folder dan bukan current map.
  • /opt/python/current/env :Semua variabel env yang eb akan mengatur untuk Anda. Jika Anda mencoba mereproduksi kesalahan, Anda mungkin perlu source /opt/python/current/env terlebih dahulu untuk menyiapkan segala sesuatunya seperti saat eb deploy berjalan.
  • opt/python/run/venv :Env virtual yang digunakan oleh aplikasi Anda; anda juga perlu menjalankan source /opt/python/run/venv/bin/activate jika Anda mencoba mereproduksi kesalahan.


Kesimpulan

Menyebarkan ke Elastic Beanstalk bisa menjadi sedikit menakutkan pada awalnya, tetapi begitu Anda memahami di mana semua bagian berada dan bagaimana segala sesuatunya bekerja, itu sebenarnya cukup mudah dan sangat fleksibel. Ini juga memberi Anda lingkungan yang akan diskalakan secara otomatis saat penggunaan Anda meningkat. Mudah-mudahan sekarang Anda memiliki cukup untuk menjadi berbahaya! Semoga berhasil di penerapan Pohon Kacang Anda berikutnya.

Bonus Gratis: Klik di sini untuk mendapatkan akses ke Panduan Sumber Daya Pembelajaran Django (PDF) gratis yang menunjukkan kepada Anda tip dan trik serta perangkap umum yang harus dihindari saat membangun aplikasi web Python + Django.

Apakah kami melewatkan sesuatu? Punya tips atau trik lain? Silahkan berkomentar di bawah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan perbedaan hari/bulan/tahun (tanggal) antara dua tanggal?

  2. Membandingkan Tabel Sementara untuk PostgreSQL &Oracle GTT

  3. PostgreSQL menghitung berapa kali substring muncul dalam teks

  4. Setara dengan unpivot() di PostgreSQL

  5. Daftar dan jalankan PostgreSQL 9.0 sebagai Layanan Windows