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:
- Python v3.4.3
- Django v1.9
- Amazon Elastic Beanstalk, EC2, S3, dan RDS
- EB CLI 3.x
- 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"
- memperbaruiPYTHONPATH
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
danNumThreads: 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:
- Klik tautan “Konfigurasi”.
- Gulir sepenuhnya ke bagian bawah halaman, lalu di bawah bagian “Tingkat Data”, klik link “buat database RDS baru”.
- Pada halaman penyiapan RDS, ubah “Mesin DB” menjadi “postgres”.
- Tambahkan “Nama Pengguna Utama” dan “Kata Sandi Utama”.
- 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:
- Buat ember
- Ambil ARN pengguna Anda (Nama Sumber Daya Amazon)
- Tambahkan izin keranjang
- 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 kecurrent
. Jika Anda mendapatkan kegagalan dalamcontainer_commands
, lihaton-deck
folder dan bukancurrent
map./opt/python/current/env
:Semua variabel env yangeb
akan mengatur untuk Anda. Jika Anda mencoba mereproduksi kesalahan, Anda mungkin perlusource /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 menjalankansource /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.