O script Bash no EC2 falha devido a permissões

1

Eu não tenho muita experiência com o EC2 e quero configurar um cron job para criar um despejo do banco de dados do meu RDS e copiá-lo para o meu bucket do S3.

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

Desativando a parte de registro no momento e o script acima falha devido a permissões:

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

As permissões são: -rwxr-xr-x 1 root root 1144 Mar 21 10:30 db-take-snapshot-s3.sh

Qualquer ideia seria muito apreciada

Atualização:

$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)

UPDATE 2 Ok, eu corri mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_PASSWORD --all-databases > backup.sql no meu terminal e o backup foi feito com sucesso.

No entanto, ele ainda falha como parte do script bash e o conteúdo do backup.sql produzido é agora:

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
    
por thitami 21.03.2018 / 11:50

2 respostas

3

Eu acho que os problemas do EC2, S3 e RDS são uma distração no momento, basicamente o RDS é como qualquer instância do mysql e o EC2 é como qualquer VM linux. Parece que você nem está chegando ao ponto de se preocupar com o S3 ainda (embora esse bocado pareça ótimo).

Você deve executar seu script de backup como um usuário não raiz, portanto, mova-o para /home/ec2-user por enquanto.

Então, você deve executar o cron sob ec2-user - use sudo -u ec2-user crontab -e para editar o crontab do ec2-user - não vá editar o crontab diretamente em uma distro moderna.

Isso resolverá o problema do backup.gz, mas você também precisará garantir que $MYSQL_USER @ ec2_ip seja um usuário válido em sua instância do RDS. Esta resposta pode ser informativa.

Edit: Seu problema mais recente provavelmente significa que você precisa mudar de -u $ MYSQL_USER para -u $ MYSQL_USER por exemplo - e o mesmo para os parâmetros de host e senha.

    
por 21.03.2018 / 15:16
2

Essa falha não está relacionada aos direitos do próprio arquivo de script ( db-take-snapshot-s3.sh ), mas aos direitos do diretório em que o script é executado e salva temporariamente o arquivo backup .gz.

Eu recomendo que você liste os direitos do diretório em que você executa um script

ll -d .

E também adicionar permissão de gravação para esse diretório

chmod +w .

Também é importante que não funcione mencionar essas informações (diretório atual e usuário atual) para que possamos ajudar mais.

id
pwd
ll
ll -d .
    
por 21.03.2018 / 12:23