sql >> Database >  >> RDS >> PostgreSQL

Django + Python 3 + PostgreSQL implementeren op AWS Elastic Beanstalk

Het volgende is een soepele uitleg over het opzetten en implementeren van een Django-toepassing, mogelijk gemaakt door Python 3, en PostgreSQL naar Amazon Web Services (AWS), terwijl u gezond blijft.

Gebruikte tools/technologieën:

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

Gratis bonus: Klik hier om toegang te krijgen tot een gratis Django Learning Resources Guide (PDF) met tips en trucs en veelvoorkomende valkuilen die je moet vermijden bij het bouwen van Python + Django-webapplicaties.

Bekijk de Python 2 versie van dit artikel hier.

Bijgewerkt 21-08-2016: Bijgewerkte EB globale configuratie-instellingen.


Elastische bonenstaak vs EC2

Elastic Beanstalk is een Platform As A Service (PaaS) dat de installatie, implementatie en het onderhoud van uw app op Amazon AWS stroomlijnt. Het is een beheerde service, die de server (EC2), database (RDS) en uw statische bestanden (S3) koppelt. U kunt uw toepassing snel implementeren en beheren, die automatisch wordt geschaald naarmate uw site groeit. Bekijk de officiële documentatie voor meer informatie.



Aan de slag

We gebruiken een eenvoudige app "Beeld van de dag", die u uit deze repository kunt halen:

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

Nadat je de code hebt gedownload, maak je een virtualenv en installeer je de vereisten via pip:

$ pip install -r requirements.txt

Stel vervolgens, terwijl PostgreSQL lokaal draait, een nieuwe database in met de naam iotd . Afhankelijk van uw lokale Postgres-configuratie, moet u mogelijk ook de DATABASES bijwerken configuratie in settings.py . Ik heb de configuratie bijvoorbeeld bijgewerkt naar:

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

Nu kunt u het databaseschema instellen, een superuser maken en de app uitvoeren:

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

Navigeer naar de beheerderspagina in uw browser op http://localhost:8000/admin en voeg een nieuwe afbeelding toe, die vervolgens op de hoofdpagina wordt weergegeven.

De applicatie is niet bedoeld om erg spannend te zijn; we gebruiken het alleen voor demo-doeleinden. Het enige dat het doet, is u een afbeelding laten uploaden via de beheerdersinterface en die afbeelding op volledig scherm weergeven op de hoofdpagina. Dat gezegd hebbende, hoewel dit een relatief eenvoudige app is, kunnen we er nog steeds een aantal "problemen" mee ontdekken die bestaan ​​bij het implementeren naar Amazon Beanstalk en RDS.

Nu we de site in gebruik hebben op onze lokale computer, laten we het Amazon-implementatieproces starten.



CLI voor AWS elastische bonenstaak

Om met een Amazon Elastic Beanstalk te werken, kunnen we een pakket gebruiken met de naam awsebcli. Op het moment van schrijven is de nieuwste versie van 3.7.4 en de aanbevolen manier om het te installeren is met pip:

$ pip install awsebcli

Test nu de installatie om te controleren of deze werkt:

$ eb --version

Dit zou je een mooi 3.x versienummer moeten geven:

EB CLI 3.7.4 (Python 3.4.3)

Om Elastic Beanstalk daadwerkelijk te gaan gebruiken heb je een account bij AWS nodig (verrassing!). Meld u aan (of log in).



EB configureren – uw app initialiseren

Nu de AWS Elastic Beanstalk CLI werkt, is het eerste wat we willen doen een Beanstalk-omgeving creëren om de applicatie op te hosten. Voer dit uit vanuit de projectdirectory (“image-of-the-day”):

$ eb init

Dit zal u een aantal vragen stellen om u te helpen bij het configureren van uw omgeving.

Standaardregio

Het kiezen van de regio die het dichtst bij uw eindgebruikers ligt, levert over het algemeen de beste prestaties op. Bekijk deze kaart als je niet zeker weet welke je moet kiezen.

Inloggegevens

Vervolgens zal het om uw AWS-inloggegevens vragen.

Hier wilt u waarschijnlijk een IAM-gebruiker instellen. Zie deze handleiding voor het instellen ervan. Als u een nieuwe gebruiker instelt, moet u ervoor zorgen dat de gebruiker over de juiste machtigingen beschikt. De eenvoudigste manier om dit te doen, is door "Beheerderstoegang" toe te voegen aan de Gebruiker. (Om veiligheidsredenen is dit echter waarschijnlijk geen goede keuze.) Voor de specifieke beleidsregels/rollen die een gebruiker nodig heeft om een ​​Elastic Beanstalk-toepassing te maken/beheren, zie de link hier.

Applicatienaam

Dit zal standaard de directorynaam zijn. Ga daar maar mee akkoord.

Python-versie

Vervolgens moet de CLI automatisch detecteren dat u Python gebruikt en gewoon om bevestiging vragen. Zeg ja. Vervolgens moet u een platformversie selecteren. Je hebt hier 2 verschillende opties voor Python 3:

  • Python 3.4
  • Python 3.4 (vooraf geconfigureerd - Docker)

Als je een hipster bent, kies dan de 'Preconfigured - Docker' keuze, anders ga je voor de normale 'Python 3.4'. Nee, alleen plagen; het fundamentele verschil is dit:


Python 3.4

Dit geeft je een EC2-image met 64-bits Amazon Linux met Python 3.4 vooraf geïnstalleerd. De front-end webserver is apache, met mod_wsgi geïnstalleerd. Dit is de "standaard" of "traditionele" manier waarop Beanstalk werkt. Met andere woorden, met deze optie maakt Beanstalk EC2-afbeeldingen voor u, en u kunt de ebextension gebruiken bestanden waar we het later over zullen hebben om de EC2-afbeelding aan te passen.



Python 3.4 (vooraf geconfigureerd – Docker)

Dit geeft je een EC2-image waarop Docker draait, terwijl er al een Docker-image voor je is ingesteld. De Docker-image draait 64-bits Debian Jessie met Python 3.4, nginx 1.8 en uWSGI 2.0.8. Omdat je in feite rechtstreeks met de Docker-afbeelding communiceert, zou je, als je deze route kiest, standaard Docker-configuratietechnieken gebruiken (d.w.z. een 'Dockerfile'), en dan hoef je niet veel te doen dat specifiek is voor AWS Beanstalk, zoals Beanstalk weet hoe hij de Docker-image voor je moet beheren.

Voor dit artikel zullen we ons concentreren op de "standaard" of "traditionele" manier om een ​​EC2-afbeelding te gebruiken, dus kies de optie 'Python 3.4' en laten we verder gaan.

SSH

Zeg ja tegen het instellen van SSH voor uw instanties.

RSA-sleutelpaar

Vervolgens moet u een RSA-sleutelpaar genereren, dat wordt toegevoegd aan uw ~/.ssh map. Dit sleutelpaar wordt ook geüpload naar de openbare EC2-sleutel voor de regio die u in stap één hebt opgegeven. Hierdoor kun je later in deze tutorial SSH naar je EC2-instantie sturen.



Wat hebben we bereikt?

Eenmaal eb init klaar is, ziet u een nieuwe verborgen map met de naam .elasticbeanstalk in uw projectmap:

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

In die map bevindt zich een config.yml bestand, dat een configuratiebestand is dat wordt gebruikt om bepaalde parameters voor uw nieuw aangemaakte Beanstalk-toepassing te definiëren.

Als u nu eb console . typt het opent uw standaardbrowser en navigeert naar de Elastic Beanstalk-console. Op de pagina zou je één applicatie moeten zien (genaamd image-of-the-day als je precies volgt), maar geen omgevingen.

Een toepassing vertegenwoordigt uw codetoepassing en is wat eb init . is voor ons gemaakt. Met Elastic Beanstalk kan een applicatie meerdere omgevingen hebben (d.w.z. ontwikkeling, testen, staging, productie). Het is geheel aan jou hoe je deze omgevingen wilt configureren/beheren. Voor simpele Django applicaties heb ik graag de ontwikkelomgeving op mijn laptop, om vervolgens een test- en een productieomgeving op Beanstalk te maken.

Laten we een testomgeving opzetten...




EB configureren – Creëer een omgeving

Terugkomend op de terminal, typ in uw projectdirectory:

$ eb create

Net als eb init , zal deze opdracht u een reeks vragen stellen.

Omgevingsnaam

U moet een soortgelijke naamgevingsconventie gebruiken als wat Amazon suggereert - bijvoorbeeld applicatienaam-env_naam - vooral wanneer/als u meerdere applicaties gaat hosten met AWS. Ik gebruikte - iod-test .

DNS CNAME-voorvoegsel

Wanneer u een app implementeert voor Elastic Beanstalk, krijgt u automatisch een domeinnaam zoals xxx.elasticbeanstalk.com. DNS CNAME prefix is wat u wilt gebruiken in plaats van xxx . De standaard zal waarschijnlijk niet werken als je meedoet, omdat iemand anders het al heeft gebruikt (de namen zijn globaal voor AWS), dus kies iets unieks en ga door.


Wat gebeurt er nu?

Op dit punt eb zal daadwerkelijk uw omgeving voor u creëren. Wees geduldig, want dit kan even duren.

Als u een foutmelding krijgt bij het maken van de omgeving, zoals - aws.auth.client.error.ARCInstanceIdentityProfileNotFoundException - controleer of de inloggegevens die u gebruikt de juiste machtigingen hebben om de Beanstalk-omgeving te maken, zoals eerder in dit bericht is besproken.

Het kan u ook vragen om een ​​bericht over Platform requires a service role . Als dat zo is, zeg dan gewoon ja en laat het de rol voor jou creëren.

Onmiddellijk nadat de omgeving is gemaakt, eb zal proberen uw toepassing te implementeren door alle code in uw projectdirectory te kopiëren naar de nieuwe EC2-instantie, met pip install -r requirements.txt in het proces.

U zou een heleboel informatie over de omgeving die wordt ingesteld op uw scherm moeten zien, evenals informatie over eb proberen in te zetten. U zult ook enkele fouten zien. In het bijzonder zou je deze regels ergens in de uitvoer moeten zien begraven:

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

Maak je geen zorgen - het is niet echt ongeldig. Controleer de logboeken voor details:

$ eb logs

Hiermee worden alle recente logbestanden van de EC2-instantie opgehaald en naar uw terminal uitgevoerd. Het is veel informatie, dus misschien wilt u de uitvoer omleiden naar een bestand (eb logs -z ). Als u door de logs kijkt, ziet u één logbestand met de naam eb-activity.log :

Error: pg_config executable not found.

Het probleem is dat we hebben geprobeerd psycopy2 . te installeren (de Postgres Python-bindingen), maar we moeten ook de Postgres-clientstuurprogramma's installeren. Omdat ze niet standaard zijn geïnstalleerd, moeten we ze eerst installeren. Laten we dat oplossen...




Het implementatieproces aanpassen

eb leest aangepaste .config bestanden uit een map genaamd ".ebextensions" op het hoofdniveau van uw project ("image-of-the-day" directory). Deze .config Met bestanden kunt u pakketten installeren, willekeurige opdrachten uitvoeren en/of omgevingsvariabelen instellen. Bestanden in de map ".ebextensions" moeten voldoen aan JSON of YAML syntaxis en worden in alfabetische volgorde uitgevoerd.


Pakketten installeren

Het eerste wat we moeten doen is enkele pakketten installeren zodat onze pip install opdracht wordt succesvol voltooid. Laten we hiervoor eerst een bestand maken met de naam .ebextensions/01_packages.config :

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

EC2-instanties draaien Amazon Linux, wat een Redhat-smaak is, dus we kunnen yum gebruiken om de pakketten te installeren die we nodig hebben. Voor nu gaan we gewoon drie pakketten installeren - git, de Postgres-client en libjpeg voor Pillow.

Nadat we dat bestand hebben gemaakt om de toepassing opnieuw te implementeren, moeten we het volgende doen:

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

We moeten de wijzigingen vastleggen omdat het deployment-commando eb deploy werkt met de laatste commit, en zal dus alleen op de hoogte zijn van onze bestandswijzigingen nadat we ze hebben vastgelegd in git. (Houd er echter rekening mee dat we niet hoeven te pushen; we werken vanuit onze lokale kopie...)

Zoals je waarschijnlijk al geraden had, is het volgende commando:

$ eb deploy

U zou nu slechts één fout moeten zien:

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.

Laten we eens kijken wat er aan de hand is...



Onze Python-omgeving configureren

EC2-instanties in Beanstalk voeren Apache uit en Apache zal onze Python-app vinden volgens de WSGIPATH die we hebben ingesteld. Standaard eb gaat ervan uit dat ons wsgi-bestand application.py . heet . Er zijn twee manieren om dit te corrigeren-

Optie 1:omgevingsspecifieke configuratie-instellingen gebruiken

$ eb config

Deze opdracht opent uw standaardeditor en bewerkt een configuratiebestand met de naam .elasticbeanstalk/iod-test.env.yml . Dit bestand bestaat niet echt lokaal; eb haalde het van de AWS-servers en presenteerde het aan u zodat u de instellingen erin kunt wijzigen. Als u wijzigingen aanbrengt in dit pseudo-bestand en vervolgens opslaat en afsluit, eb zal de overeenkomstige instellingen in uw Beanstalk-omgeving bijwerken.

Als u zoekt naar de termen 'WSGI' in het bestand, zou u een configuratiegedeelte moeten vinden dat er als volgt uitziet:

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

Werk de WSGIPath bij:

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

En dan heb je je WSGIPath correct ingesteld. Als u het bestand vervolgens opslaat en afsluit, eb zal de omgevingsconfiguratie automatisch bijwerken:

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.

Het voordeel van het gebruik van de eb config methode om instellingen te wijzigen is dat je per omgeving verschillende instellingen kunt opgeven. Maar u kunt ook instellingen bijwerken met dezelfde .config bestanden die we eerder gebruikten. Dit gebruikt dezelfde instellingen voor elke omgeving, als de .config bestanden worden toegepast bij implementatie (na de instellingen van eb config zijn toegepast).

Optie 2:Algemene configuratie-instellingen gebruiken

Om de .config te gebruiken bestandsoptie, laten we een nieuw bestand maken met de naam /.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/"

Wat gebeurt er?

  • DJANGO_SETTINGS_MODULE: "iotd.settings" - voegt het pad toe aan de instellingenmodule.
  • "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH" - werkt onze PYTHONPATH bij zodat Python de modules in onze applicatie kan vinden. Dit pad kan variëren, afhankelijk van je setup! Zie deze opmerking voor meer details. (Merk op dat het gebruik van het volledige pad noodzakelijk is.)
  • WSGIPath: iotd/iotd/wsgi.py bepaalt ons WSGI-pad.
  • NumProcesses: 3 en NumThreads: 20 - werkt het aantal processen en threads bij dat wordt gebruikt om onze WSGI-toepassing uit te voeren.
  • "/static/": "www/static/" stelt ons pad voor statische bestanden in.

Nogmaals, we kunnen een git commit . doen dan een eb deploy om deze instellingen bij te werken.

Laten we vervolgens een database toevoegen.




Een database configureren

Probeer de geïmplementeerde website te bekijken:

$ eb open

Met deze opdracht wordt de geïmplementeerde toepassing in uw standaardbrowser weergegeven. U zou de foutmelding verbinding geweigerd moeten zien:

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?

Dit komt omdat we nog geen database hebben opgezet. Op dit punt eb zal uw Beanstalk-omgeving opzetten, maar het stelt geen RDS (de databaselaag) in. Dat moeten we handmatig instellen.


Database instellen

Gebruik opnieuw eb console om de Beanstalk-configuratiepagina te openen.

Doe vanaf daar het volgende:

  1. Klik op de link 'Configuratie'.
  2. Scroll helemaal naar de onderkant van de pagina en klik vervolgens onder het gedeelte 'Gegevenslaag' op de link 'maak een nieuwe RDS-database'.
  3. Verander op de RDS-configuratiepagina de "DB Engine" in "postgres".
  4. Voeg een “Hoofdgebruikersnaam” en “Hoofdwachtwoord” toe.
  5. Sla de wijzigingen op.

Beanstalk maakt de RDS voor je aan. Nu moeten we onze Django-app krijgen om verbinding te maken met de RDS. Beanstalk zal ons hierbij helpen door een aantal omgevingsvariabelen op de EC2-instanties voor ons bloot te leggen die beschrijven hoe we verbinding kunnen maken met de Postgres-server. We hoeven dus alleen onze settings.py . bij te werken bestand om te profiteren van die omgevingsvariabelen. Bevestig dat de DATABASES configuratieparameter geeft het volgende weer in 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',
        }
    }

Dit zegt eenvoudigweg:"gebruik de instellingen van de omgevingsvariabele, indien aanwezig, gebruik anders onze standaard ontwikkelingsinstellingen." Eenvoudig.



Databasemigraties afhandelen

Met onze databaseconfiguratie moeten we er nog steeds voor zorgen dat migraties worden uitgevoerd, zodat de databasetabelstructuur correct is. We kunnen dat doen door .ebextensions/02_python.config . aan te passen en de volgende regels bovenaan het bestand toe te voegen:

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

container_commands kunt u willekeurige opdrachten uitvoeren nadat de toepassing is geïmplementeerd op de EC2-instantie. Omdat de EC2-instantie is ingesteld met behulp van een virtuele omgeving, moeten we eerst die virtuele omgeving activeren voordat we onze migratieopdracht uitvoeren. Ook de leader_only: true instelling betekent, "voer deze opdracht alleen uit op de eerste instantie bij implementatie op meerdere instanties."

Vergeet niet dat onze applicatie gebruik maakt van Django's admin, dus we hebben een superuser nodig...



Maak de beheerdergebruiker

Helaas createsuperuser staat u niet toe om een ​​wachtwoord op te geven bij gebruik van de --noinput optie, dus we zullen onze eigen opdracht moeten schrijven. Gelukkig maakt Django het heel gemakkelijk om aangepaste commando's te maken.

Maak het bestand 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")

Zorg ervoor dat u de juiste __init__.py . toevoegt ook bestanden:

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

Met dit bestand kun je python manage.py createsu . uitvoeren , en het zal een superuser maken zonder om een ​​wachtwoord te vragen. Voel je vrij om de opdracht uit te breiden om omgevingsvariabelen of een ander middel te gebruiken waarmee je het wachtwoord kunt wijzigen.

Zodra je de opdracht hebt gemaakt, kunnen we gewoon een andere opdracht toevoegen aan onze container_commands sectie in .ebextensions/02_python.config :

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

Voordat u dit uitprobeert, moeten we ervoor zorgen dat onze statische bestanden allemaal op de juiste plaats staan...




Statische bestanden

Voeg nog een commando toe onder container_commands :

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

Het hele bestand ziet er dus als volgt uit:

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

We moeten er nu voor zorgen dat de STATIC_ROOT is correct ingesteld in settings.py bestand:

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

Zorg ervoor dat u de www . commit directory naar git zodat de statische dir kan worden gemaakt. Voer vervolgens eb deploy uit nogmaals, en u zou nu zaken moeten doen:

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.

Op dit punt zou u naar http://your_app_url/admin moeten kunnen gaan, inloggen, een afbeelding toevoegen en die afbeelding vervolgens op de hoofdpagina van uw toepassing zien verschijnen.

Succes!



S3 gebruiken voor mediaopslag

Met deze opstelling zullen we elke keer dat we opnieuw implementeren, al onze geüploade afbeeldingen verliezen. Waarom? Welnu, wanneer u eb deploy . uitvoert , wordt er een nieuw exemplaar voor je gemaakt. Dit is niet wat we willen, omdat we dan gegevens in de database voor de afbeeldingen hebben, maar geen bijbehorende afbeeldingen. De oplossing is om de mediabestanden op te slaan in Amazon Simple Storage Service (Amazon S3) in plaats van op de EC2-instantie zelf.

U moet:

  1. Maak een bucket
  2. Pak de ARN van uw gebruiker (Amazon Resource Name)
  3. Buckemachtigingen toevoegen
  4. Configureer je Django-app om S3 te gebruiken om je statische bestanden te serveren

Aangezien hier al goede berichten over zijn, wijs ik je gewoon op mijn favoriet:Amazon S3 gebruiken om je Django-statische en mediabestanden op te slaan



Apache-configuratie

Aangezien we Apache gebruiken met Beanstalk, willen we Apache waarschijnlijk zo instellen dat het (onder andere) gzip-compressie mogelijk maakt, zodat bestanden sneller door de clients worden gedownload. Dat kan met container_commands . Maak een nieuw bestand .ebextensions/03_apache.config en voeg het volgende toe:

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

Vervolgens moet u het bestand .ebextensions/enable_mod_deflate.conf maken :

# 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>

Als u dit doet, wordt gzip-compressie ingeschakeld, wat zou moeten helpen bij de grootte van de bestanden die u downloadt. U kunt dezelfde strategie ook gebruiken om uw CSS/JS automatisch te verkleinen en te combineren en andere voorbewerkingen uit te voeren die u moet doen.



Problemen oplossen

Vergeet de zeer behulpzame eb ssh . niet commando, waarmee je naar de EC2-instantie gaat, zodat je rond kunt snuffelen en kunt zien wat er aan de hand is. Bij het oplossen van problemen zijn er een paar mappen waar u op moet letten:

  • /opt/python :Root van waar je applicatie zal eindigen.
  • /opt/python/current/app :De huidige applicatie die in de omgeving wordt gehost.
  • /opt/python/on-deck/app :De app wordt in eerste instantie op het dek geplaatst en vervolgens, nadat de implementatie is voltooid, wordt deze verplaatst naar current . Als u fouten krijgt in uw container_commands , bekijk de on-deck map en niet de current map.
  • /opt/python/current/env :Alle env-variabelen die eb voor u zal opzetten. Als u een fout probeert te reproduceren, moet u mogelijk eerst source /opt/python/current/env om dingen in te stellen zoals ze zouden zijn wanneer eb deploy actief is.
  • opt/python/run/venv :De virtuele omgeving die door uw toepassing wordt gebruikt; je moet ook source /opt/python/run/venv/bin/activate uitvoeren als u een fout probeert te reproduceren.


Conclusie

Implementeren op Elastic Beanstalk kan in het begin een beetje ontmoedigend zijn, maar als je eenmaal begrijpt waar alle onderdelen zijn en hoe de dingen werken, is het eigenlijk vrij eenvoudig en extreem flexibel. Het geeft u ook een omgeving die automatisch wordt geschaald naarmate uw gebruik groeit. Hopelijk heb je nu genoeg om gevaarlijk te zijn! Veel succes bij uw volgende Beanstalk-implementatie.

Gratis bonus: Klik hier om toegang te krijgen tot een gratis Django Learning Resources Guide (PDF) met tips en trucs en veelvoorkomende valkuilen die je moet vermijden bij het bouwen van Python + Django-webapplicaties.

Hebben we iets gemist? Heb je nog andere tips of trucs? Reageer hieronder.



  1. Kan ik :OLD en :NEW pseudo-records kopiëren in/naar een Oracle opgeslagen procedure?

  2. Een overzicht van replicatie op volumeniveau voor PostgreSQL met DRBD

  3. Vind rijen waar tekstarray een waarde bevat die vergelijkbaar is met invoer

  4. Evolutie van fouttolerantie in PostgreSQL:synchrone commit