Bash-Skript in EC2 schlägt aufgrund von Berechtigungen fehl

Bash-Skript in EC2 schlägt aufgrund von Berechtigungen fehl

Ich habe nicht viel Erfahrung mit EC2 und möchte einen Cron-Job einrichten, um einen Dump meiner RDS-Datenbank zu erstellen und ihn in meinen S3-Bucket zu kopieren.

#!/bin/bash

AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
BUCKET=db-snapshots

MYSQL_USER=***
MYSQL_PASSWORD=***
MYSQL_HOST=***
MYSQL_DATABASE_NAME= 'database_name'

TIMESTAMP=$(date +"%d-%b-%Y-%H-%M-%S")

#logging
LOG_ROOT="/backup/mysql_dump/logs/dump.log"

#Dump of Mysql Database into S3
echo "[db-take-snapshot]: creating backup of database $MYSQL_DATABASE_NAME start at $TSTAMP" >> "$LOG_ROOT"

mysqldump -u $MYSQL_USER \
          -p $MYSQL_PASSWORD \
          -h $MYSQL_HOST \
          --single-transaction \
          --routines --triggers \
          --database_name  $MYSQL_DATABASES_NAME| gzip > backup.gz

echo "[db-take-snapshot]:Finished backup of database and sending it in S3 Bucket at $TIMESTAMP" >> "$LOG_ROOT"

S3_KEY=$BUCKET/backups/$(date "+%Y-%m-%d")-backup.gz
aws s3 cp backup.gz s3://$S3_KEY --sse AES256

echo "[db-take-snapshot]: Copied to S3 at $TIMESTAMP" >> "$LOG_ROOT"

rm -f backup.gz

echo "[db-take-snapshot]: Backup finished at $TIMESTAMP" >> "$LOG_ROOT"

Wenn ich derzeit den Protokollierungsteil deaktiviere, schlägt das obige Skript aufgrund von Berechtigungen fehl:

/db-take-snapshot-s3.sh: line 25: backup.gz: Permission denied

Die Berechtigungen sind:-rwxr-xr-x 1 root root 1144 Mar 21 10:30 db-take-snapshot-s3.sh

Alle Ideen sind herzlich willkommen

Aktualisieren:

$ll -d . : drwxr-xr-x 2 root root 4096 Mar 21 11:07 .

$ll: -rwx------ 1 root root 1139 Mar 21 11:06 db-take-snapshot-s3.sh

$pwd: /etc/cron.hourly

id: uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)

AKTUALISIERUNG 2 Okay, ich habe es mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_PASSWORD --all-databases > backup.sqlin meinem Terminal ausgeführt und die Sicherung wurde erfolgreich erstellt.

Allerdings schlägt es als Teil des Bash-Skripts immer noch fehl und der Inhalt der erstellten Datei „backup.sql“ lautet nun:

Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help

Antwort1

Ich denke, die Probleme mit EC2, S3 und RDS sind im Moment eine Ablenkung. Im Grunde ist RDS wie jede MySQL-Instanz und EC2 wie jede Linux-VM. Es scheint, dass Sie sich noch nicht einmal Gedanken über S3 machen (obwohl dieser Teil gut aussieht).

Sie sollten Ihr Sicherungsskript als Nicht-Root-Benutzer ausführen, verschieben Sie es also /home/ec2-uservorerst dorthin.

Anschließend sollten Sie den Cron unter dem EC2-Benutzer ausführen – verwenden Sie ihn, sudo -u ec2-user crontab -eum die Crontab des EC2-Benutzers zu bearbeiten – bearbeiten Sie Crontabs auf einer modernen Distribution nicht direkt.

Dadurch wird das Problem mit Backup.gz gelöst, Sie müssen jedoch auch sicherstellen, dass $MYSQL_USER@ ec2_ipein gültiger Benutzer auf Ihrer RDS-Instanz ist.DasDie Antwort könnte aufschlussreich sein.

Bearbeiten: Ihr neuestes Problem bedeutet wahrscheinlich nur, dass Sie beispielsweise von -u $MYSQL_USER zu -u$MYSQL_USER wechseln müssen – und dasselbe gilt für die Host- und Kennwortparameter.

Antwort2

Dieser Fehler hat nichts mit den Rechten der Skriptdatei selbst zu tun (db-take-snapshot-s3.sh), sondern auf Rechte des Verzeichnisses, in dem das Skript ausgeführt wird und die Datei vorübergehend speichertSicherung.gz.

Ich empfehle Ihnen, die Rechte des Verzeichnisses aufzulisten, in dem Sie ein Skript ausführen

ll -d .

Fügen Sie außerdem Schreibberechtigung für dieses Verzeichnis hinzu

chmod +w .

Wenn es nicht funktioniert, ist es auch wichtig, diese Informationen (aktuelles Verzeichnis und aktueller Benutzer) zu erwähnen, damit wir weiterhelfen können.

id
pwd
ll
ll -d .

verwandte Informationen