Wordpress Stack bei AWS
Auftrag
WordPress mit Amazon RDS bereitstellen
Erstellen einer MySQL-Datenbank mit RDS
Um eine Datenbank zu erstellen, muss unter Amazon Cloud nach RDS suchen und dann auf «Datenbank erstellen» gehen.
Als Engine-Typ benutzen wir MySQL
Als Vorlage benutzen man „Kostenloses Kontingent“
In den Einstellungen ändern man die DB-Instance-Kennung zu „WordPress“, den Hauptbenutzernamen zu „admin“ (falls anders) und das Passwort kann man selbst wählen.
Als nächstes öffnet man den Reiter „Zusätzliche Konfiguration“
Dort ändert man noch den „Anfänglicher Datenbankname“ zu wordpress
Wenn dies alles Konfiguriert ist drückt man auf Datenbank erstellen
Erstellen einer EC2-Instance
Um eine EC2-Instanz zu erstellen, sucht man in der Suche nach EC2 und geht dann wenn man es gefunden hat auf „Instance starten“
Als Name kann man nehmen, was man will, Ich habe mich für „EC2-WordPress“ entschieden.
Als Image kann man im Grunde jedes nehmen, Ich würde aber „Amazon Linux“ benutzen da die Befehle auf einem anderen OS eine andere Syntax haben.
Für die Kostenlose Benutzung würde ich die „t2.micro“ nehmen da diese 750 Stunden pro Monat kostenlos benutzbar ist.
Als Schlüsselpaar (SSH Key) kann man entweder einen neuen erstellen oder einen bereits vorhandenes verwenden.
In den Netzwerkeinstellungen ändert man zur einfachheitshalber den Namen und die Beschreibung zur Erkennung der Sicherheitsgruppe. Konfiguriere dann 2 Sicherheitsgruppenregel:
- Um mit SSH auf die VM zu kommen (Am besten der Quelltyp «Meine IP», man kann aber natürlich auch «Überall» benutzen)
- Die zweite wäre das http Traffic von überall auf die Spätere Wordpressseite Zugriff hat.
Am Schluss sollten die Konfigurationen ungefähr so angezeigt werden. Danach kann man auf „Instance starten“ drücken.
Konfiguration ihrer RDS-Datenbank
Datenbank Sicherheitsgruppe anpassen
Um die Sicherheitsgruppe der Datenbank so anzupassen das nur die EC2-Instanz eine Verbindung aufbauen kann muss man auf die Datenbank gehen und dann nach VPC-Sicherheitsgruppen suchen. Wenn man diese gefunden hat, drückt man auf diese drauf und fügt eine neue Regel für den eingehenden Datenverkehr hinzu
Diese Regel sollte ungefähr so aussehen wie die auf der linken Seite.
Per SSH auf EC2 Instanz Verbinden
Wie man sich mit der EC2 Instanz verbindet, kann man auf der linken Seite erkennen.
MySQL installieren, auf Datenbank verbinden und User erstellen
sudo yum update
sudo yum install -y mysql
Nachdem man das Repository geupdatet und MySQL installiert hat kann man sich auf die Datenbank verbinden, um den Wordpress MySQL User zu erstellen. Dafür muss man die Endpunkt Adresse herausfinden die man in der AWS-Konsole unter RDS/Databases/“WordPress Datenbank“ findet.
Um die Endpunkt Adresse hinzuzufügen, benutzt man den Befehl: export MYSQL_HOST=
Mit diesen Befehlen verbindet man sich auf die Datenbank und erstellt einen Benutzer mit dem Namen „wordpress“ der „ALL PRIVILEGES“ hat.
Konfigurieren von WordPress auf EC2
Webservice Installieren
Hier installiert man den Webserver von Apache.
sudo yum install -y httpd
sudo service httpd start
WordPress herunterladen und Installieren
Man lädt das neuste WordPress .tar.gz herunter und entpackt es.
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
Nachher geht man in das Directory wordpress und kopiert die Sample config zur wirklichen WordPress config.
In dem wp-config.php File ändert man die Database Settings zu den eigenen
Hier fügt man noch die API secret-keys ein damit man sicherer ist. Diese können in diesem Link generiert werden.
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
cd /home/ec2-user
sudo cp -r wordpress/* /var/www/html/
sudo service httpd restart
Und wenn man die letzten Konfigurationen, die man oben sieht, ausführt. Sollte am Schluss im Browser die WordPress Seite zu sehen sein.
Backup
Amazon EC2 Backup and Restore using AWS Backup
Gehe auf den AWS Backup Service und erstelle einen On-Demand-Backup.
Auf den Ressourcentyp wählt man entweder EC2 und RDS und dann die Instance-ID des RDS (WordPress) und EC2 (WordPress). Die Aufbewahrungszeitraum soll 7 Tage betragen und der Backup-Tresor ist WordPress (kann auch Default sein). Leider geht diese Methode nicht da wir nicht die nötigen Berechtigungen haben.
EC2 Snapshot
Hier sind die Schritte, um ein Snapshot-Image von einer EC2-Instanz zu erstellen:
-
Öffnen Sie das AWS Management Console und melden Sie sich mit Ihrem AWS-Konto an.
-
Navigieren Sie zum Bereich "EC2" und wählen Sie die Instanz aus, von der Sie ein Snapshot-Image erstellen möchten.
-
Klicken Sie auf die Schaltfläche "Action" und wählen Sie "Image" > "Create Image" aus.
-
Geben Sie im Dialogfeld "Create Image" einen Namen und eine Beschreibung für das Snapshot-Image ein.
-
Wählen Sie "No Reboot" aus, wenn Sie möchten, dass die Instanz während des Erstellens des Snapshot-Images läuft. Wählen Sie "Reboot" aus, wenn Sie möchten, dass die Instanz neu gestartet wird, bevor das Snapshot-Image erstellt wird.
-
Klicken Sie auf die Schaltfläche "Create Image".
-
Das Snapshot-Image wird im Hintergrund erstellt und kann in der Liste der AMIs (Amazon Machine Images) im AWS Management Console angezeigt werden, wenn es abgeschlossen ist.
Es ist wichtig zu beachten, dass das Snapshot-Image nur die Inhalte der EBS-Volumes sichert, die an die EC2-Instanz angefügt sind. Wenn Sie andere Daten auf der Instanz haben, die nicht in einem EBS-Volume gespeichert sind, müssen Sie diese Daten separat sichern. Sie können zum Beispiel ein Backup von der EC2-Instanz auf S3 speichern, um zusätzliche Sicherheit zu gewährleisten.
Von Snapshot Volume Wiederherstellen:
RDS Backup
RDS Backup Automatisch
Um die automatischen Backups für Ihre RDS-Instanz zu nutzen, müssen Sie diese zunächst einrichten. Hier sind die Schritte, wie Sie das tun können:
-
Öffnen Sie die Amazon RDS-Konsole und wählen Sie die Instanz aus, für die Sie Backups einrichten möchten.
-
Klicken Sie auf die Registerkarte "Backups" und dann auf "Edit Backup Retention Period".
-
Geben Sie die Anzahl der Tage an, für die Sie Backups aufbewahren möchten, und klicken Sie dann auf "Save Changes". Standardmäßig werden Backups für eine Retention-Zeit von einem Tag erstellt.
Wichtig: Wenn Sie die Retention-Zeit auf 0 Tage ändern, werden automatische Backups deaktiviert. Sobald die automatischen Backups eingerichtet sind, werden täglich Backups Ihrer RDS-Instanz erstellt und für die angegebene Anzahl von Tagen aufbewahrt. Sie können diese Backups in der RDS-Konsole unter der Registerkarte "Backups" anzeigen und verwalten.
RDS Backup Manuell
Um manuelle Snapshots von Ihrer RDS-Instanz zu erstellen, folgen Sie diesen Schritten:
-
Öffnen Sie die Amazon RDS-Konsole und wählen Sie die Instanz aus, für die Sie einen Snapshot erstellen möchten.
-
Klicken Sie auf die Registerkarte "Snapshots" und dann auf "Create DB Snapshot".
-
Geben Sie einen Namen für den Snapshot an und klicken Sie auf "Create DB Snapshot".
Der Snapshot-Prozess kann einige Zeit in Anspruch nehmen, abhängig von der Größe Ihrer Datenbank. Während des Prozesses wird Ihre RDS-Instanz möglicherweise kurzzeitig nicht verfügbar sein. Sobald der Snapshot erstellt wurde, wird er in der Liste der Snapshots angezeigt, die Sie in der RDS-Konsole unter der Registerkarte "Snapshots" finden. Sie können auf den Namen des Snapshots klicken, um weitere Informationen anzuzeigen und ihn zu verwalten. Hinweis: Manuell erstellte Snapshots bleiben solange erhalten, bis Sie sie manuell löschen. Es ist daher wichtig, dass Sie regelmäßig überflüssige Snapshots löschen, um Speicherplatz zu sparen.
Von Backup Datenbank erstellen:
Wenn man Wiederherstellen drückt kann man eine Neue DB erstellen mit den Informationen
Was Bedeutet Stateless Architecture:
Eine stateless architecture bedeutet, dass keine Informationen über den Zustand einer Anwendung auf dem Server gespeichert werden. Dies bedeutet, dass jeder Request, den ein Benutzer an die Anwendung sendet, alle notwendigen Informationen enthält, um die Anforderung zu verarbeiten. Der Server muss keine Informationen aus einem vorherigen Request speichern, um den aktuellen Request zu verarbeiten.
Ein Beispiel für eine stateless architecture wäre eine Wordpress-Installation, bei der alle Benutzerinformationen in der Datenbank gespeichert werden und jeder Request, den ein Benutzer an die Anwendung sendet, die erforderlichen Informationen von der Datenbank abruft, um die Anforderung zu verarbeiten. Die Anwendung muss keine Informationen über den Zustand des Benutzers auf dem Server speichern, um Anforderungen von diesem Benutzer zu verarbeiten.
Bash Script
Da mir diese Schritte aber zu lang gingen habe ich noch ein kurzes Bash Script geschrieben. (Zuunterst sieht man noch einen Link zum Test Video)
#!/bin/bash
sudo yum -y update
sudo yum install -y mysql
sudo yum install -y httpd
sudo service httpd start
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
cp wordpress/wp-config-sample.php wordpress/wp-config.php
# Set the new values for the database variables
new_db_name='wordpress'
new_db_user='wordpress'
new_db_password='5ztDByGKq49aKm3S'
new_db_host='wordpressdb.csj4fgsm0wsp.us-east-1.rds.amazonaws.com'
# Replace the old values in the wp-config.php file
sed -i "s/define( 'DB_NAME', 'database_name_here' );/define( 'DB_NAME', '$new_db_name' );/" wordpress/wp-config.php
sed -i "s/define( 'DB_USER', 'username_here' );/define( 'DB_USER', '$new_db_user' );/" wordpress/wp-config.php
sed -i "s/define( 'DB_PASSWORD', 'password_here' );/define( 'DB_PASSWORD', '$new_db_password' );/" wordpress/wp-config.php
sed -i "s/define( 'DB_HOST', 'localhost' );/define( 'DB_HOST', '$new_db_host' );/" wordpress/wp-config.php
# Ersetze die Zeilen mit den 'unique phrase' durch die neuen Werte
sed -i -s 's{define( '\''AUTH_KEY'\'', '\''put your unique phrase here'\'' );{define('\''AUTH_KEY'\'', '\''0ozpHN_tE]U?[L.)kvnCDrC-H*qI:UgzQvV9Ga+)k+*~RlZZZHD,kB>[<Y6|RJXC'\'' );{' wordpress/wp-config.php
sed -i -s 's?define( '\''SECURE_AUTH_KEY'\'', '\''put your unique phrase here'\'' );?define('\''SECURE_AUTH_KEY'\'', '\''{G!dia+f!={U>8vI%Ch0Y-{/xO~Eew^q_ETOyG]~EUeK;C2v3JRx8)N [vi[tO}<'\'' );?' wordpress/wp-config.php
sed -i -s 's}define( '\''LOGGED_IN_KEY'\'', '\''put your unique phrase here'\'' );}define('\''LOGGED_IN_KEY'\'', '\''!*^I0Q?teip2%gg8W=ssNTeB,M?7/+++U7bJ`GHN9/-i#Y<{n`hK5lNO[gOB~|#y'\'' );}' wordpress/wp-config.php
sed -i -s 's!define( '\''NONCE_KEY'\'', '\''put your unique phrase here'\'' );!define('\''NONCE_KEY'\'', '\''W*L:-+4kkn4{hX_8TH`P3Z0yq1==vy)4M~OBRkJ*e}u:1ttc_}Kb8HmMV+|yO>1 '\'' );!' wordpress/wp-config.php
sed -i -s 's}define( '\''AUTH_SALT'\'', '\''put your unique phrase here'\'' );}define('\''AUTH_SALT'\'', '\''*vb,woc2_=4|[5$di(?Ata;{vQ6,!nf3OT.#( #<poS7AdkX_BU1Px~~8nY!y[1x'\'' );}' wordpress/wp-config.php
sed -i -s 's{define( '\''SECURE_AUTH_SALT'\'', '\''put your unique phrase here'\'' );{define('\''SECURE_AUTH_SALT'\'', '\''*o:<yV#gpxt/cS#HrsHeX?[A*;hm+!`oufT}WZWBum1Bn:;0hM6jyNZScN<tC)! '\'' );{' wordpress/wp-config.php
sed -i -s 's}define( '\''LOGGED_IN_SALT'\'', '\''put your unique phrase here'\'' );}define('\''LOGGED_IN_SALT'\'', '\''DY+PZ8;3?*~/~GnaQk)T<=47o|)x#Ht(o,^Zs3K,{*UtX2CBB[Ia;1Y!0:h]Q^#C'\'' );}' wordpress/wp-config.php
sed -i -s 's}define( '\''NONCE_SALT'\'', '\''put your unique phrase here'\'' );}define('\''NONCE_SALT'\'', '\'',abD~m/;Ws0NJ]I]EodiE[{a,x|DU/W%w/aK15j Ee?]> 7L-i$u[?C,5=qt<q{8'\'' );}' wordpress/wp-config.php
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo cp -r wordpress/* /var/www/html/
sudo service httpd restart
Video: https://youtu.be/b2QCiFxmGvw
Ansible Playbook
Da mir diese Schritte aber zu lang gingen habe ich noch ein kurzes Ansible Playbook geschrieben. (Zuunterst sieht man noch einen Link zum Test Video)
---
- name: Install and configure WordPress
hosts: all
become: true
vars:
new_db_name: wordpress
new_db_user: wordpress
new_db_password: 5ztDByGKq49aKm3S
new_db_host: wordpress02.csj4fgsm0wsp.us-east-1.rds.amazonaws.com
tasks:
- name: Update package manager cache and install MySQL, Apache, and PHP
package:
name:
- mysql
- httpd
- amazon-linux-extras
state: latest
register: pkg_result
- name: Start Apache service
service:
name: httpd
state: started
- name: Download latest WordPress tarball
get_url:
url: https://wordpress.org/latest.tar.gz
dest: /tmp/latest.tar.gz
- name: Extract WordPress tarball
unarchive:
src: /tmp/latest.tar.gz
dest: /tmp
remote_src: yes
- name: copy files task
shell: cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php
- name: Set database variables in wp-config.php
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\(\\s*'DB_NAME',\\s*'.*'\\s*\\)"
replace: "define( 'DB_NAME', '{{ new_db_name }}' );"
- name: Set database user in wp-config.php
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\(\\s*'DB_USER',\\s*'.*'\\s*\\)"
replace: "define( 'DB_USER', '{{ new_db_user }}' );"
- name: Set database password in wp-config.php
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\(\\s*'DB_PASSWORD',\\s*'.*'\\s*\\)"
replace: "define( 'DB_PASSWORD', '{{ new_db_password }}' );"
- name: Set database host in wp-config.php
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\(\\s*'DB_HOST',\\s*'.*'\\s*\\)"
replace: "define( 'DB_HOST', '{{ new_db_host }}' );"
- name: Set unique phrases in wp-config.php
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'AUTH_KEY',\\s+'put your unique phrase here' \\);"
replace: "define('AUTH_KEY', '0ozpHN_tE]U?[L.)kvnCDrC-H*qI:UgzQvV9Ga+)k+*~RlZZZHD,kB>[<Y6|RJXC');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'SECURE_AUTH_KEY',\\s+'put your unique phrase here' \\);"
replace: "define('SECURE_AUTH_KEY', '{G!dia+f!={U>8vI%Ch0Y-{/xO~Eew^q_ETOyG]~EUeK;C2v3JRx8)N [vi[tO}<');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'LOGGED_IN_KEY',\\s+'put your unique phrase here' \\);"
replace: "define('LOGGED_IN_KEY', '!*^I0Q?teip2%gg8W=ssNTeB,M?7/+++U7bJ`GHN9/-i#Y<{n`hK5lNO[gOB~|#y');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'NONCE_KEY',\\s+'put your unique phrase here' \\);"
replace: "define('NONCE_KEY', 'W*L:-+4kkn4{hX_8TH`P3Z0yq1==vy)4M~OBRkJ*e}u:1ttc_}Kb8HmMV+|yO>1 ');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'AUTH_SALT',\\s+'put your unique phrase here' \\);"
replace: "define('AUTH_SALT', '*vb,woc2_=4|[5$di(?Ata;{vQ6,!nf3OT.#( #<poS7AdkX_BU1Px~~8nY!y[1x');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'SECURE_AUTH_SALT',\\s+'put your unique phrase here' \\);"
replace: "define('SECURE_AUTH_SALT', '*o:<yV#gpxt/cS#HrsHeX?[A*;hm+!`oufT}WZWBum1Bn:;0hM6jyNZScN<tC)! ');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'LOGGED_IN_SALT',\\s+'put your unique phrase here' \\);"
replace: "define('LOGGED_IN_SALT', 'DY+PZ8;3?*~/~GnaQk)T<=47o|)x#Ht(o,^Zs3K,{*UtX2CBB[Ia;1Y!0:h]Q^#C');"
replace:
path: /tmp/wordpress/wp-config.php
regexp: "define\\( 'NONCE_SALT',\\s+'put your unique phrase here' \\);"
replace: "define('NONCE_SALT', 'abD~m/;Ws0NJ]I]EodiE[{a,x|DU/W%w/aK15j Ee?]> 7L-i$u[?C,5=qt<q{8');"
- name: Install lamp-mariadb10.2-php7.2
command: "sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2"
- name: copy files task
shell: sudo cp -r /tmp/wordpress/* /var/www/html/
- name: Restart Apache service
service:
name: httpd
state: restarted
Video: https://youtu.be/Nb9mF5vab7M