PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Triển khai Django + Python 3 + PostgreSQL lên AWS Elastic Beanstalk

Sau đây là phần hướng dẫn cách thiết lập và triển khai ứng dụng Django, được hỗ trợ bởi Python 3 và PostgreSQL cho Amazon Web Services (AWS) trong khi vẫn bình thường.

Các công cụ / công nghệ được sử dụng:

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

Tiền thưởng miễn phí: Nhấp vào đây để có quyền truy cập vào Hướng dẫn tài nguyên học tập Django (PDF) miễn phí, chỉ cho bạn các mẹo và thủ thuật cũng như các cạm bẫy phổ biến cần tránh khi xây dựng ứng dụng web Python + Django.

Xem Python 2 phiên bản của bài viết này tại đây.

Cập nhật ngày 21 tháng 8 năm 2016: Đã cập nhật cài đặt cấu hình toàn cầu EB.


Cây đậu đàn hồi so với EC2

Elastic Beanstalk là Nền tảng dưới dạng dịch vụ (PaaS) giúp đơn giản hóa việc thiết lập, triển khai và bảo trì ứng dụng của bạn trên Amazon AWS. Đó là một dịch vụ được quản lý, kết hợp máy chủ (EC2), cơ sở dữ liệu (RDS) và các tệp tĩnh của bạn (S3). Bạn có thể nhanh chóng triển khai và quản lý ứng dụng của mình, ứng dụng này sẽ tự động mở rộng quy mô khi trang web của bạn phát triển. Xem tài liệu chính thức để biết thêm thông tin.



Bắt đầu

Chúng tôi sẽ sử dụng ứng dụng “Hình ảnh trong ngày” đơn giản mà bạn có thể lấy từ kho lưu trữ này:

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

Sau khi bạn tải xuống mã, hãy tạo virtualenv và cài đặt các yêu cầu qua pip:

$ pip install -r requirements.txt

Tiếp theo, với PostgreSQL đang chạy cục bộ, hãy thiết lập cơ sở dữ liệu mới có tên iotd . Ngoài ra, tùy thuộc vào cấu hình Postgres địa phương của bạn, bạn có thể cần cập nhật DATABASES cấu hình trong settings.py . Ví dụ:tôi đã cập nhật cấu hình thành:

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

Bây giờ bạn có thể thiết lập lược đồ cơ sở dữ liệu, tạo siêu người dùng và chạy ứng dụng:

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

Điều hướng đến trang quản trị trong trình duyệt của bạn tại http:// localhost:8000 / admin và thêm một hình ảnh mới, hình ảnh này sau đó sẽ được hiển thị trên trang chính.

Ứng dụng không phải là quá thú vị; chúng tôi chỉ đang sử dụng nó cho mục đích demo. Tất cả những gì nó làm là cho phép bạn tải lên một hình ảnh thông qua giao diện quản trị và hiển thị hình ảnh đó toàn màn hình trên trang chính. Điều đó nói lên rằng, mặc dù đây là một ứng dụng tương đối cơ bản, nhưng nó vẫn sẽ cho phép chúng tôi khám phá một số “gotchas” tồn tại khi triển khai cho Amazon Beanstalk và RDS.

Bây giờ chúng tôi đã thiết lập và chạy trang web trên máy cục bộ của mình, hãy bắt đầu quá trình triển khai Amazon.



CLI cho AWS Elastic Beanstalk

Để làm việc với Amazon Elastic Beanstalk, chúng ta có thể sử dụng một gói có tên awsebcli. Tại thời điểm này, phiên bản mới nhất là 3.7.4 và cách được khuyến nghị để cài đặt nó là sử dụng pip:

$ pip install awsebcli

Bây giờ hãy kiểm tra cài đặt để đảm bảo rằng nó đang hoạt động:

$ eb --version

Điều này sẽ cung cấp cho bạn số phiên bản 3.x đẹp:

EB CLI 3.7.4 (Python 3.4.3)

Để thực sự bắt đầu sử dụng Elastic Beanstalk, bạn sẽ cần có tài khoản AWS (thật bất ngờ!). Đăng ký (hoặc đăng nhập).



Định cấu hình EB - Khởi chạy ứng dụng của bạn

Với AWS Elastic Beanstalk CLI đang hoạt động, điều đầu tiên chúng tôi muốn làm là tạo một môi trường Beanstalk để lưu trữ ứng dụng. Chạy cái này từ thư mục dự án (“image-of-the-day”):

$ eb init

Điều này sẽ gợi cho bạn một số câu hỏi để giúp bạn định cấu hình môi trường của mình.

Khu vực mặc định

Việc chọn khu vực gần nhất với người dùng cuối của bạn nói chung sẽ mang lại hiệu suất tốt nhất. Hãy xem bản đồ này nếu bạn không chắc nên chọn.

Thông tin đăng nhập

Tiếp theo, sẽ yêu cầu thông tin đăng nhập AWS của bạn.

Tại đây, rất có thể bạn sẽ muốn thiết lập Người dùng IAM. Xem hướng dẫn này để biết cách thiết lập. Nếu bạn thiết lập người dùng mới, bạn sẽ cần đảm bảo người dùng có các quyền thích hợp. Cách đơn giản nhất để làm điều này là chỉ cần thêm “Quyền truy cập của quản trị viên” vào Người dùng. (Tuy nhiên, đây có lẽ không phải là lựa chọn tuyệt vời vì lý do bảo mật.) Để biết các chính sách / vai trò cụ thể mà người dùng cần để tạo / quản lý ứng dụng Elastic Beanstalk, hãy xem liên kết tại đây.

Tên ứng dụng

Điều này sẽ mặc định cho tên thư mục. Chỉ cần làm với điều đó.

Phiên bản Python

Tiếp theo, CLI sẽ tự động phát hiện rằng bạn đang sử dụng Python và chỉ cần yêu cầu xác nhận. Nói có. Sau đó, bạn cần chọn một phiên bản nền tảng. Bạn có 2 tùy chọn khác nhau ở đây cho Python 3:

  • Python 3.4
  • Python 3.4 (Định cấu hình sẵn - Docker)

Nếu bạn là một người sành sỏi, hãy chọn tùy chọn ‘Định cấu hình sẵn - Docker’, nếu không, hãy chọn ‘Python 3.4’ thông thường. Không, chỉ trêu chọc thôi; sự khác biệt cơ bản là:


Python 3.4

Điều này cung cấp cho bạn hình ảnh EC2 chạy Amazon Linux 64 bit với Python 3.4 được cài đặt sẵn. Máy chủ web giao diện người dùng là apache, có cài đặt mod_wsgi. Đây là cách "tiêu chuẩn" hoặc "truyền thống" mà Beanstalk hoạt động. Nói cách khác, với tùy chọn này Beanstalk sẽ tạo hình ảnh EC2 cho bạn và bạn có thể sử dụng ebextension các tệp chúng ta sẽ nói sau để tùy chỉnh hình ảnh EC2.



Python 3.4 (Định cấu hình sẵn - Docker)

Điều này cung cấp cho bạn hình ảnh EC2 đang chạy Docker, với hình ảnh Docker đã được thiết lập cho bạn. Hình ảnh Docker chạy Debian Jessie 64 bit với Python 3.4, nginx 1.8 và uWSGI 2.0.8. Bởi vì về cơ bản bạn đang tương tác trực tiếp với hình ảnh Docker, nếu bạn chọn lộ trình này, bạn sẽ sử dụng các kỹ thuật cấu hình Docker tiêu chuẩn (tức là 'Dockerfile') và sau đó bạn không phải làm nhiều điều đó là AWS Beanstalk cụ thể, như Beanstalk biết cách quản lý hình ảnh Docker cho bạn.

Đối với bài viết này, chúng tôi sẽ tập trung vào cách sử dụng hình ảnh EC2 “tiêu chuẩn” hoặc “truyền thống”, vì vậy hãy chọn tùy chọn ‘Python 3.4’ và bắt đầu.

SSH

Nói có để thiết lập SSH cho các phiên bản của bạn.

Cặp khóa RSA

Tiếp theo, bạn cần tạo cặp khóa RSA, cặp khóa này sẽ được thêm vào ~ / .ssh của bạn thư mục. Cặp khóa này cũng sẽ được tải lên khóa công khai EC2 cho khu vực bạn đã chỉ định trong bước một. Điều này sẽ cho phép bạn SSH vào phiên bản EC2 của mình ở phần sau của hướng dẫn này.



Chúng tôi đã đạt được những gì?

Một lần eb init kết thúc, bạn sẽ thấy một thư mục ẩn mới có tên là .elasticbeanstalk trong thư mục dự án của bạn:

├── .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

Bên trong thư mục đó là một config.yml , là một tệp cấu hình được sử dụng để xác định các thông số nhất định cho ứng dụng Beanstalk mới được đúc của bạn.

Tại thời điểm này, nếu bạn nhập eb console nó sẽ mở trình duyệt mặc định của bạn và điều hướng đến bảng điều khiển Elastic Beanstalk. Trên trang, bạn sẽ thấy một ứng dụng (được gọi là image-of-the-day nếu bạn đang theo dõi chính xác), nhưng không có môi trường.

Một ứng dụng đại diện cho ứng dụng mã của bạn và là những gì eb init được tạo ra cho chúng tôi. Với Elastic Beanstalk, một ứng dụng có thể có nhiều môi trường (tức là phát triển, thử nghiệm, dàn dựng, sản xuất). Việc bạn muốn cấu hình / quản lý các môi trường này như thế nào là hoàn toàn tùy thuộc vào bạn. Đối với các ứng dụng Django đơn giản, tôi muốn có môi trường phát triển trên máy tính xách tay của mình, sau đó tạo thử nghiệm và môi trường sản xuất trên Beanstalk.

Hãy thiết lập môi trường thử nghiệm…




Định cấu hình EB - Tạo môi trường

Quay lại thiết bị đầu cuối, trong loại thư mục dự án của bạn:

$ eb create

Cũng giống như eb init , lệnh này sẽ nhắc bạn với một loạt câu hỏi.

Tên môi trường

Bạn nên sử dụng quy ước đặt tên tương tự như những gì Amazon đề xuất - ví dụ:application_name-env_name - đặc biệt khi / nếu bạn bắt đầu lưu trữ nhiều ứng dụng với AWS. Tôi đã sử dụng - iod-test .

Tiền tố CNAME DNS

Khi bạn triển khai một ứng dụng cho Elastic Beanstalk, bạn sẽ tự động nhận được một tên miền như xxx.elasticbeanstalk.com. DNS CNAME prefix là những gì bạn muốn được sử dụng thay cho xxx . Mặc định có thể sẽ không hoạt động nếu bạn đang theo dõi vì ai đó đã sử dụng nó (tên gọi chung cho AWS), vì vậy hãy chọn một cái gì đó độc đáo và tiếp tục.


Điều gì xảy ra bây giờ?

Tại thời điểm này eb thực sự sẽ tạo ra môi trường của bạn cho bạn. Hãy kiên nhẫn vì điều này có thể mất một chút thời gian.

Nếu bạn gặp lỗi khi tạo môi trường, như - aws.auth.client.error.ARCInstanceIdentityProfileNotFoundException - kiểm tra xem bằng chứng xác thực bạn đang sử dụng có quyền thích hợp để tạo môi trường Beanstalk, như đã thảo luận trước đó trong bài đăng này hay không.

Ngoài ra, nó có thể nhắc bạn với thông báo về Platform requires a service role . Nếu có, chỉ cần nói có và để nó tạo ra vai trò cho bạn.

Ngay sau khi môi trường được tạo, eb sẽ cố gắng triển khai ứng dụng của bạn, bằng cách sao chép tất cả mã trong thư mục dự án của bạn sang phiên bản EC2 mới, chạy pip install -r requirements.txt trong quá trình này.

Bạn sẽ thấy một loạt thông tin về môi trường đang được thiết lập được hiển thị trên màn hình của bạn, cũng như thông tin về eb đang cố gắng triển khai. Bạn cũng sẽ thấy một số lỗi. Đặc biệt, bạn sẽ thấy những dòng này được chôn ở đâu đó trong đầu ra:

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

Đừng lo lắng - Nó không thực sự không hợp lệ. Kiểm tra nhật ký để biết chi tiết:

$ eb logs

Thao tác này sẽ lấy tất cả các tệp nhật ký gần đây từ phiên bản EC2 và xuất chúng ra thiết bị đầu cuối của bạn. Đó là rất nhiều thông tin, vì vậy bạn có thể muốn chuyển hướng đầu ra đến một tệp (eb logs -z ). Xem qua nhật ký, bạn sẽ thấy một tệp nhật ký có tên là eb-activity.log :

Error: pg_config executable not found.

Vấn đề là chúng tôi đã cố cài đặt psycopy2 (các ràng buộc Postgres Python), nhưng chúng tôi cũng cần cài đặt các trình điều khiển máy khách Postgres. Vì chúng không được cài đặt theo mặc định nên trước tiên chúng ta cần cài đặt chúng. Hãy khắc phục điều đó…




Tùy chỉnh quy trình triển khai

eb sẽ đọc .config tùy chỉnh các tệp từ thư mục có tên “.ebextensions” ở cấp cơ sở của dự án của bạn (thư mục “image-of-the-day”). .config này các tệp cho phép bạn cài đặt các gói, chạy các lệnh tùy ý và / hoặc đặt các biến môi trường. Các tệp trong thư mục “.ebextensions” phải tuân theo JSON hoặc YAML cú pháp và được thực thi theo thứ tự bảng chữ cái.


Cài đặt gói

Điều đầu tiên chúng ta cần làm là cài đặt một số gói để pip install của chúng ta lệnh sẽ hoàn tất thành công. Để thực hiện việc này, trước tiên hãy tạo một tệp có tên là .ebextensions / 01_packages.config :

Các gói
packages:
  yum:
    git: []
    postgresql93-devel: []
    libjpeg-turbo-devel: []

Các phiên bản EC2 chạy Amazon Linux, là một phiên bản Redhat, vì vậy chúng tôi có thể sử dụng yum để cài đặt các gói mà chúng tôi cần. Hiện tại, chúng tôi sẽ chỉ cài đặt ba gói - git, ứng dụng khách Postgres và libjpeg cho Pillow.

Sau khi tạo tệp đó để triển khai lại ứng dụng, chúng ta cần làm như sau:

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

Chúng tôi phải thực hiện các thay đổi vì lệnh triển khai eb deploy hoạt động dựa trên cam kết mới nhất và do đó sẽ chỉ nhận thức được các thay đổi tệp của chúng tôi sau khi chúng tôi cam kết chúng với git. (Xin lưu ý rằng chúng tôi không phải thúc đẩy; chúng tôi đang làm việc từ bản sao địa phương của chúng tôi…)

Như bạn có thể đoán, lệnh tiếp theo là:

$ eb deploy

Bây giờ bạn sẽ chỉ thấy một lỗi:

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.

Hãy cùng tìm hiểu xem điều gì đang xảy ra…



Định cấu hình môi trường Python của chúng tôi

Các phiên bản EC2 trong Beanstalk chạy Apache và Apache sẽ tìm thấy ứng dụng Python của chúng tôi theo WSGIPATH mà chúng tôi đã đặt. Theo mặc định eb giả sử tệp wsgi của chúng tôi được gọi là application.py . Có hai cách để sửa lỗi này-

Tùy chọn 1:Sử dụng cài đặt cấu hình theo môi trường cụ thể

$ eb config

Lệnh này sẽ mở trình chỉnh sửa mặc định của bạn, chỉnh sửa tệp cấu hình có tên là .elasticbeanstalk / iod-test.env.yml . Tệp này không thực sự tồn tại cục bộ; eb đã kéo nó xuống khỏi máy chủ AWS và trình bày cho bạn để bạn có thể thay đổi cài đặt trong đó. Nếu bạn thực hiện bất kỳ thay đổi nào đối với tệp giả này, sau đó lưu và thoát, eb sẽ cập nhật các cài đặt tương ứng trong môi trường Beanstalk của bạn.

Nếu bạn tìm kiếm cụm từ 'WSGI' trong tệp và bạn sẽ tìm thấy phần cấu hình giống như sau:

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

Cập nhật WSGIPath:

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

Và sau đó bạn sẽ có WSGIPath được thiết lập chính xác. Nếu sau đó bạn lưu tệp và thoát, hãy eb sẽ tự động cập nhật cấu hình môi trường:

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.

Lợi thế khi sử dụng eb config phương pháp để thay đổi cài đặt là bạn có thể chỉ định các cài đặt khác nhau cho mỗi môi trường. Nhưng bạn cũng có thể cập nhật cài đặt bằng cùng một .config các tệp mà chúng tôi đã sử dụng trước đây. Điều này sẽ sử dụng các cài đặt giống nhau cho từng môi trường, như .config tệp sẽ được áp dụng khi triển khai (sau khi cài đặt từ eb config đã được áp dụng).

Tùy chọn 2:Sử dụng cài đặt cấu hình chung

Để sử dụng .config tùy chọn tệp, hãy tạo một tệp mới có tên là /.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/"

Điều gì đang xảy ra?

  • DJANGO_SETTINGS_MODULE: "iotd.settings" - thêm đường dẫn đến mô-đun cài đặt.
  • "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH" - cập nhật PYTHONPATH của chúng tôi vì vậy Python có thể tìm thấy các mô-đun trong ứng dụng của chúng tôi. Đường dẫn này có thể khác nhau tùy thuộc vào thiết lập của bạn! Xem nhận xét này để biết thêm chi tiết. (Lưu ý rằng việc sử dụng đường dẫn đầy đủ là cần thiết.)
  • WSGIPath: iotd/iotd/wsgi.py đặt Đường dẫn WSGI của chúng tôi.
  • NumProcesses: 3NumThreads: 20 - cập nhật số lượng quy trình và chuỗi được sử dụng để chạy ứng dụng WSGI của chúng tôi.
  • "/static/": "www/static/" đặt đường dẫn tệp tĩnh của chúng tôi.

Một lần nữa, chúng ta có thể thực hiện git commit sau đó triển khai eb để cập nhật các cài đặt này.

Tiếp theo, hãy thêm một cơ sở dữ liệu.




Định cấu hình cơ sở dữ liệu

Thử xem trang web đã triển khai:

$ eb open

Lệnh này sẽ hiển thị ứng dụng đã triển khai trong trình duyệt mặc định của bạn. Bạn sẽ thấy lỗi kết nối bị từ chối:

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?

Điều này là do chúng tôi chưa thiết lập cơ sở dữ liệu. Tại thời điểm này eb sẽ thiết lập môi trường Beanstalk của bạn, nhưng nó không thiết lập RDS (tầng cơ sở dữ liệu). Chúng tôi phải thiết lập thủ công.


Thiết lập cơ sở dữ liệu

Một lần nữa, hãy sử dụng eb console để mở trang cấu hình Beanstalk.

Từ đó, hãy làm như sau:

  1. Nhấp vào liên kết "Cấu hình".
  2. Cuộn đến cuối trang, sau đó trong phần "Cấp dữ liệu", hãy nhấp vào liên kết "tạo cơ sở dữ liệu RDS mới".
  3. Trên trang thiết lập RDS, hãy thay đổi “DB Engine” thành “postgres”.
  4. Thêm “Tên người dùng chính” và “Mật khẩu chính”.
  5. Lưu các thay đổi.

Beanstalk sẽ tạo RDS cho bạn. Bây giờ chúng ta cần có ứng dụng Django của mình để kết nối với RDS. Beanstalk sẽ giúp chúng tôi ở đây bằng cách tiết lộ một số biến môi trường trên các phiên bản EC2 cho chúng tôi chi tiết cách kết nối với máy chủ Postgres. Vì vậy, tất cả những gì chúng ta cần làm là cập nhật settings.py để tận dụng các biến môi trường đó. Xác nhận rằng DATABASES tham số cấu hình phản ánh những điều sau đây trong 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',
        }
    }

Điều này chỉ đơn giản nói, "sử dụng cài đặt biến môi trường nếu có, nếu không, hãy sử dụng cài đặt phát triển mặc định của chúng tôi." Đơn giản.



Xử lý di chuyển cơ sở dữ liệu

Với thiết lập cơ sở dữ liệu của chúng tôi, chúng tôi vẫn cần đảm bảo rằng quá trình di chuyển chạy sao cho cấu trúc bảng cơ sở dữ liệu là chính xác. Chúng tôi có thể làm điều đó bằng cách sửa đổi .ebextensions / 02_python.config và thêm các dòng sau vào đầu tệp:

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

container_commands cho phép bạn chạy các lệnh tùy ý sau khi ứng dụng đã được triển khai trên phiên bản EC2. Vì cá thể EC2 được thiết lập bằng môi trường ảo, trước tiên chúng ta phải kích hoạt môi trường ảo đó trước khi chạy lệnh di chuyển của mình. Cũng là leader_only: true cài đặt có nghĩa là, “chỉ chạy lệnh này trên phiên bản đầu tiên khi triển khai cho nhiều phiên bản.”

Đừng quên rằng ứng dụng của chúng tôi sử dụng quản trị viên của Django, vì vậy chúng tôi sẽ cần một người dùng cấp cao…



Tạo người dùng quản trị

Rất tiếc, createsuperuser không cho phép bạn chỉ định mật khẩu khi sử dụng --noinput tùy chọn, vì vậy chúng tôi sẽ phải viết lệnh của riêng mình. May mắn thay, Django giúp tạo các lệnh tùy chỉnh rất dễ dàng.

Tạo tệp iotd / images / management / command / createu.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")

Đảm bảo bạn thêm __init__.py thích hợp các tệp cũng như:

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

Tệp này sẽ cho phép bạn chạy python manage.py createsu , và nó sẽ tạo một siêu người dùng mà không cần nhắc nhập mật khẩu. Vui lòng mở rộng lệnh để sử dụng các biến môi trường hoặc các phương tiện khác để cho phép bạn thay đổi mật khẩu.

Sau khi bạn đã tạo lệnh, chúng tôi chỉ có thể thêm một lệnh khác vào container_commands của chúng tôi trong .ebextensions / 02_python.config :

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

Trước khi bạn kiểm tra điều này, hãy đảm bảo rằng tất cả các tệp tĩnh của chúng ta đều được đặt ở đúng vị trí…




Tệp tĩnh

Thêm một lệnh nữa trong container_commands :

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

Vì vậy, toàn bộ tệp trông giống như sau:

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/"

Bây giờ chúng tôi cần đảm bảo rằng STATIC_ROOT được đặt chính xác trong settings.py tệp:

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

Đảm bảo rằng bạn cam kết www thư mục sang git để có thể tạo dir tĩnh. Sau đó chạy eb deploy một lần nữa, và bây giờ bạn sẽ kinh doanh:

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.

Tại thời điểm này, bạn có thể truy cập http:// your_app_url / admin, đăng nhập, thêm hình ảnh và sau đó xem hình ảnh đó được hiển thị trên trang chính của ứng dụng của bạn.

Thành công!



Sử dụng S3 để lưu trữ phương tiện

Với thiết lập này, mỗi lần chúng tôi triển khai lại, chúng tôi sẽ mất tất cả các hình ảnh đã tải lên của mình. Tại sao? Chà, khi bạn chạy eb deploy , một phiên bản mới được tạo ra cho bạn. Đây không phải là những gì chúng tôi muốn vì sau đó chúng tôi sẽ có các mục nhập trong cơ sở dữ liệu cho các hình ảnh, nhưng không có hình ảnh liên quan. Giải pháp là lưu trữ các tệp phương tiện trong Amazon Simple Storage Service (Amazon S3) thay vì trên chính phiên bản EC2.

Bạn sẽ cần:

  1. Tạo một nhóm
  2. Lấy ARN của người dùng của bạn (Tên tài nguyên Amazon)
  3. Thêm quyền cho nhóm
  4. Định cấu hình ứng dụng Django của bạn để sử dụng S3 nhằm cung cấp các tệp tĩnh của bạn

Vì đã có nhiều bài viết hay về vấn đề này, tôi sẽ chỉ cho bạn điểm yêu thích của tôi:Sử dụng Amazon S3 để lưu trữ các tệp Django tĩnh và phương tiện



Cấu hình Apache

Vì chúng tôi đang sử dụng Apache với Beanstalk, chúng tôi có thể muốn thiết lập Apache để (trong số những thứ khác) bật tính năng nén gzip để các tệp được khách hàng tải xuống nhanh hơn. Điều đó có thể được thực hiện với container_commands . Tạo tệp mới .ebextensions / 03_apache.config và thêm phần sau:

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

Sau đó, bạn cần tạo tệp .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>

Làm điều này sẽ bật tính năng nén gzip, điều này sẽ giúp tăng kích thước tệp bạn đang tải xuống. Bạn cũng có thể sử dụng chiến lược tương tự để tự động rút gọn và kết hợp CSS / JS của mình và thực hiện bất kỳ quá trình tiền xử lý nào khác mà bạn cần thực hiện.



Khắc phục sự cố

Đừng quên eb ssh rất hữu ích lệnh này sẽ đưa bạn vào phiên bản EC2 để bạn có thể xem xung quanh và xem điều gì đang xảy ra. Khi khắc phục sự cố, có một số thư mục bạn nên biết:

  • /opt/python :Gốc nơi ứng dụng của bạn sẽ kết thúc.
  • /opt/python/current/app :Ứng dụng hiện tại được lưu trữ trong môi trường.
  • /opt/python/on-deck/app :Ứng dụng ban đầu được đặt trên boong và sau đó, sau khi tất cả việc triển khai hoàn tất, ứng dụng sẽ được chuyển sang current . Nếu bạn gặp lỗi trong container_commands của mình , hãy xem on-deck chứ không phải current thư mục.
  • /opt/python/current/env :Tất cả các biến env eb sẽ thiết lập cho bạn. Nếu bạn đang cố gắng tạo lại lỗi, trước tiên bạn có thể cần phải source /opt/python/current/env để mọi thứ được thiết lập như ban đầu khi triển khai eb đang chạy.
  • opt/python/run/venv :Env ảo được ứng dụng của bạn sử dụng; bạn cũng sẽ cần chạy source /opt/python/run/venv/bin/activate nếu bạn đang cố gắng tái tạo một lỗi.


Kết luận

Việc triển khai Elastic Beanstalk có thể hơi khó khăn lúc đầu, nhưng khi bạn hiểu vị trí của tất cả các bộ phận và cách mọi thứ hoạt động, thì việc này thực sự khá dễ dàng và cực kỳ linh hoạt. Nó cũng cung cấp cho bạn một môi trường sẽ tự động mở rộng quy mô khi mức sử dụng của bạn tăng lên. Hy vọng rằng bây giờ bạn đã đủ để nguy hiểm! Chúc bạn may mắn trong lần triển khai Beanstalk tiếp theo.

Tiền thưởng miễn phí: Nhấp vào đây để có quyền truy cập vào Hướng dẫn tài nguyên học tập Django (PDF) miễn phí, chỉ cho bạn các mẹo và thủ thuật cũng như các cạm bẫy phổ biến cần tránh khi xây dựng ứng dụng web Python + Django.

Chúng tôi đã bỏ lỡ bất cứ điều gì? Có bất kỳ mẹo hoặc thủ thuật nào khác không? Hãy bình luận bên dưới.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo sql với truy vấn con dưới dạng một cột trong câu lệnh chọn bằng cách sử dụng SQLAlchemy

  2. Tính đa hình trong bảng cơ sở dữ liệu SQL?

  3. Tổng quan về PostgreSQL Query Caching &Load Balancing

  4. Sự khác biệt giữa `->>` và `->` trong Postgres SQL là gì?

  5. Kiến trúc và điều chỉnh bộ nhớ trong cơ sở dữ liệu PostgreSQL