In diesem ersten Teil unserer Tutorialreihe gehen wir die Schritte zum Bereitstellen einer PHP-Anwendung (Laravel) in Amazon ECS durch. Wir beginnen damit, ein Docker-Image zu erstellen, es an Amazon ECR zu übertragen, eine ECS-Aufgabendefinition, einen ECS-Cluster und einen ECS-Dienst zu erstellen und einen Domänennamen mit dem Dienst zu verbinden.
Erstellen Sie im Stammverzeichnis Ihres Git-Repositorys eine Docker-Datei mit folgendem Inhalt:
# Use the official PHP-FPM image as the base FROM public.ecr.aws/docker/library/php:fpm # Define a user variable ARG user=www-data # Install system dependencies and PHP extensions RUN apt-get update && apt-get install -y \ git curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip unzip libzip-dev \ nginx \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-install \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd \ zip # Install Composer COPY --from=public.ecr.aws/composer/composer:latest-bin /usr/bin/composer /usr/bin/composer # Create a system user for running Composer and Artisan commands RUN mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Copy Nginx configuration and entrypoint script COPY ./docker/default.conf /etc/nginx/sites-enabled/default COPY ./docker/entrypoint.sh /etc/entrypoint.sh # Make the entrypoint script executable RUN chmod +x /etc/entrypoint.sh # Set the working directory WORKDIR /var/www # Copy the application code COPY --chown=www-data:www-data . /var/www # Install PHP dependencies RUN composer install # Expose port 80 EXPOSE 80 # Define the entrypoint ENTRYPOINT ["/etc/entrypoint.sh"]
Erstellen Sie einen neuen Ordner mit dem Namen Docker und legen Sie die folgenden zwei Dateien darin ab.
#!/usr/bin/env bash # Start Nginx service service nginx start # Run Laravel migrations php artisan migrate --force # Create symbolic link for storage php artisan storage:link # Clear and optimize the application cache php artisan optimize:clear php artisan optimize # Start PHP-FPM php-fpm
server { listen 80 default_server; index index.php index.html; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_hide_header X-Powered-By; # Tells PHP we're using a reverse proxy with TLS termination fastcgi_param HTTPS on; fastcgi_param HTTP_X_FORWARDED_PROTO $scheme; fastcgi_param HTTP_X_FORWARDED_SSL on; add_header Content-Security-Policy "upgrade-insecure-requests" always; } location / { try_files $uri $uri/ /index.php?$query_string; } }
Und machen Sie Entrypoint.sh ausführbar, indem Sie chmod x docker/entrypoint.sh ausführen.
Der erste Schritt besteht darin, das Bild an ECR zu übertragen. Sie müssen diesen Schritt zunächst manuell ausführen, bevor Sie mit der Bereitstellung der Anwendung im ECS fortfahren können.
Erstellen Sie ein ECR-Repository, indem Sie zur Amazon ECR-Konsole gehen, auf Repository erstellen klicken und einen Repository-Namen eingeben. Für dieses Beispiel verwenden wir die Demo-App.
Kopieren Sie nach der Erstellung den URI des Repositorys. Diesen URI benötigen Sie später.
Wählen Sie das gerade erstellte Repository aus, klicken Sie auf Push-Befehle anzeigen und führen Sie die Befehle in Ihrem Terminal aus. Die Befehle sehen folgendermaßen aus (stellen Sie sicher, dass Sie die richtige Region auswählen und die richtige Konto-ID verwenden):
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com docker build -t demo-app . docker tag demo-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest
Sobald die Befehle erfolgreich ausgeführt wurden, kehren Sie zur Amazon ECR-Konsole zurück, geben Sie das Repository ein und bestätigen Sie mit dem Tag „latest“, dass das Image erfolgreich übertragen wurde.
Der nächste Schritt besteht darin, eine ECS-Aufgabendefinition mit dem Docker-Image zu erstellen, das wir gerade an ECR übertragen haben.
Gehen Sie zunächst zur Amazon ECS-Konsole und klicken Sie unter Aufgabendefinitionen auf Neue Aufgabendefinition erstellen.
Wählen Sie einen eindeutigen Namen für die Aufgabendefinition (wir verwenden die Demo-App) und stellen Sie sicher, dass Fargate als Starttyp ausgewählt ist. Ändern Sie in diesem Abschnitt vorerst nichts anderes.
Scrollen Sie nach unten zum Abschnitt Container – 1 und geben Sie die folgenden Werte ein:
Später möchten Sie wahrscheinlich die Speicher- und CPU-Einstellungen je nach Anwendung anpassen. Bei Bedarf können Sie hier auch Umgebungsvariablen und EFS-Volumes hinzufügen. Wir werden es in einem separaten Tutorial behandeln.
Ändern Sie in diesem Abschnitt vorerst nichts anderes. Scrollen Sie nach unten und klicken Sie auf Erstellen.
Wir müssen jetzt einen ECS-Cluster erstellen. Im Cluster führen wir den Dienst aus, der in der soeben erstellten Aufgabendefinition definiert ist.
Gehen Sie zur Amazon ECS-Konsole, klicken Sie unter Cluster auf Cluster erstellen, geben Sie einen Clusternamen ein und stellen Sie sicher, dass Sie AWS auswählen Fargate (serverlos) als Infrastruktur:
Die Erstellung des Clusters dauert einige Minuten. Die Clustererstellung kann gelegentlich fehlschlagen, insbesondere bei neuen Konten; Warten Sie einfach ein paar Minuten und versuchen Sie es erneut, indem Sie einen anderen Clusternamen wählen.
Öffnen Sie den soeben erstellten Cluster, scrollen Sie nach unten zur Tabelle Dienste, klicken Sie auf Erstellen und geben Sie die folgenden Werte ein:
Klicken Sie noch nicht auf Erstellen.
Da wir die Anwendung wahrscheinlich über HTTPS bereitstellen, möchten wir einen Load Balancer hinzufügen. Sie können dies später nicht mehr tun.
Scrollen Sie nach unten zum Abschnitt Netzwerk und wählen Sie eine VPC aus, auf der Sie den Dienst bereitstellen möchten. Stellen Sie sicher, dass die VPC über ein öffentliches Subnetz verfügt, an das ein Internet-Gateway angeschlossen ist. Wenn Sie keine VPC haben, können Sie eine erstellen, indem Sie auf Neue VPC erstellen klicken und dem Assistenten folgen.
Sobald Sie eine VPC ausgewählt haben, lesen Sie weiter.
Scrollen Sie nach unten zum Abschnitt Lastausgleich, wählen Sie Application Load Balancer und wählen Sie die Option Neuen Lastausgleich erstellen.
Wenn diese Option nicht verfügbar ist, haben Sie im vorherigen Schritt wahrscheinlich keine VPC ausgewählt.
Passen Sie die folgenden Werte an:
Lassen Sie im Abschnitt Listener die Option Neuen Listener erstellen ausgewählt, passen Sie die Werte jedoch so an, dass Port 443 und das HTTPS-Protokoll verwendet werden. Um diese Auswahl zu bestätigen, benötigen Sie ein ACM-Zertifikat für die Domain, die Sie verwenden möchten; Weitere Informationen zum Erhalt finden Sie in der AWS-Dokumentation.
Passen Sie im Abschnitt Zielgruppe die folgenden Werte an:
Klicken Sie auf Erstellen.
Es kann einige Minuten dauern, bis Dienste in der Tabelle Dienste angezeigt werden. Warten Sie einfach ein wenig und aktualisieren Sie die Seite, wenn Sie den neuen Dienst nicht sofort sehen.
Wenn alles gut gelaufen ist, sollten Sie den Dienst in der Tabelle Dienste mit dem Status Aktiv und Bereitstellungen und Aufgaben mit 1/1 sehen laufende Aufgabe.
Bereitstellungsfehler werden wie folgt angezeigt:
Um Bereitstellungsfehler zu beheben, öffnen Sie den Dienst und klicken Sie dann auf die Registerkarte Bereitstellungen. Scrollen Sie nach unten zum Abschnitt Ereignisse und klicken Sie auf die ID der zuletzt gestarteten Aufgabe. Der Abschnitt Protokolle der Aufgabenausführung zeigt Ihnen weitere Details darüber, was schief gelaufen ist.
Laravel beschwert sich normalerweise über eine unvollständige Speicherordnerstruktur (z. B. fehlendes Framework, Cache, Sitzungen). Wir werden in einem separaten Tutorial sehen, wie man ein EFS-Volume an die Aufgabendefinition anfügt, um dieses Problem zu beheben.
Sie möchten wahrscheinlich einen Domänennamen mit dem Dienst verbinden, den wir gerade bereitgestellt haben. In den vorherigen Schritten haben wir bereits einen Application Load Balancer erstellt, die AWS-Komponente, die für die Weiterleitung des Internetverkehrs an den Dienst verantwortlich ist.
Wir haben außerdem bereits ein ACM-Zertifikat bereitgestellt, das zur Verschlüsselung des Datenverkehrs zwischen den Endbenutzern und dem Load Balancer verwendet wird.
Um den Vorgang abzuschließen und Ihre Anwendung über HTTPS aus dem öffentlichen Internet zugänglich zu machen, müssen Sie einen DNS-Eintrag erstellen, der Ihren Domänennamen auf den Load Balancer verweist. Dieser Vorgang unterscheidet sich je nachdem, welchen DNS-Anbieter Sie verwenden. Weitere Informationen finden Sie in der Dokumentation.
Ermitteln Sie zunächst den DNS-Namen des Application Load Balancers. Navigieren Sie zur Suchleiste in der AWS-Konsole (Option S unter macOS), geben Sie Load Balancer ein und wählen Sie Load Balancers (EC2 Feature). Sie sehen eine Tabelle mit dem Load Balancer, mit dem wir unseren Domainnamen verbinden müssen:
Kopieren Sie den DNS-Namen des Load Balancers.
Wenn Sie Route 53 verwenden, befolgen Sie diese Anweisungen:
Wenn Sie nicht die Route 53 nutzen:
Weitere Informationen finden Sie in der Dokumentation Ihres DNS-Anbieters. Sie müssen wahrscheinlich einen CNAME-Eintrag erstellen, dessen Ziel/Wert der DNS-Name des Load Balancers ist.
Sobald Sie den DNS-Eintrag erstellt haben, warten Sie einige Minuten, bis er sich verbreitet, und versuchen Sie dann, über den Domänennamen auf Ihre Anwendung zuzugreifen.
Herzlichen Glückwunsch!Sie haben jetzt erfolgreich eine PHP-Anwendung (Laravel) in AWS ECS bereitgestellt.
Das obige ist der detaillierte Inhalt vonTeil: Bereitstellung einer PHP-Anwendung (Laravel) in Amazon ECS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!