

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Automatizza i backup per le istanze DB di Amazon RDS for PostgreSQL utilizzando AWS Batch
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Kirankumar Chandrashekar, Amazon Web Services*

## Riepilogo
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-summary"></a>

Il backup dei database PostgreSQL è un'attività importante e in genere può essere completata con l'utilità [pg\$1dump, che utilizza il comando COPY per impostazione predefinita per creare uno schema e un dump](https://www.postgresql.org/docs/current/app-pgdump.html) dei dati di un database PostgreSQL. Tuttavia, questo processo può diventare ripetitivo se sono necessari backup regolari per più database PostgreSQL. Se i tuoi database PostgreSQL sono ospitati nel cloud, puoi anche sfruttare la funzionalità di backup [automatico](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html) fornita da Amazon Relational Database Service (Amazon RDS) anche per PostgreSQL. Questo modello descrive come automatizzare i backup regolari per le istanze DB Amazon RDS for PostgreSQL utilizzando l'utilità pg\$1dump.

Nota: le istruzioni presuppongono che tu stia utilizzando Amazon RDS. Tuttavia, puoi utilizzare questo approccio anche per i database PostgreSQL ospitati all'esterno di Amazon RDS. Per eseguire i backup, la funzione AWS Lambda deve essere in grado di accedere ai database.

Un evento Amazon CloudWatch Events basato sul tempo avvia una funzione Lambda che cerca [tag di backup specifici applicati ai metadati delle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) istanze DB PostgreSQL su Amazon RDS. Se le istanze DB PostgreSQL hanno il tag **DBDump BKP:Automated = Active e altri tag di backup richiesti, la** funzione Lambda invia singoli job per ogni backup del database ad AWS Batch. 

AWS Batch elabora questi processi e carica i dati di backup in un bucket Amazon Simple Storage Service (Amazon S3). Questo modello utilizza un Dockerfile e un file entrypoint.sh per creare un'immagine del contenitore Docker che viene utilizzata per eseguire backup nel job AWS Batch. Una volta completato il processo di backup, AWS Batch registra i dettagli del backup in una tabella di inventario su Amazon DynamoDB. Come ulteriore protezione, un evento CloudWatch Events avvia una notifica Amazon Simple Notification Service (Amazon SNS) se un processo fallisce in AWS Batch. 

## Prerequisiti e limitazioni
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo.
+ Un ambiente di elaborazione gestito o non gestito esistente. Per ulteriori informazioni, consulta [Ambienti di calcolo gestiti e non gestiti nella documentazione](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) di AWS Batch. 
+ [Immagine Docker AWS Command Line Interface (CLI) versione 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html), installata e configurata.
+ Istanze database Amazon RDS for PostgreSQL esistenti.  
+ Un bucket S3 esistente. 
+ [Docker](https://www.docker.com/), installato e configurato su Linux, macOS o Windows.
+ Familiarità con la programmazione in Lambda. 

## Architecture
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-architecture"></a>

![\[Architettura per il backup delle istanze DB di Amazon RDS for PostgreSQL utilizzando l'utilità pg_dump.\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**Stack tecnologico**
+  CloudWatch Eventi Amazon
+ Amazon DynamoDB
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon RDS
+ Amazon SNS
+ Simple Storage Service (Amazon S3)
+ AWS Batch
+ AWS Key Management Service (AWS KMS)
+ AWS Lambda
+ AWS Secrets Manager
+ Docker

## Tools (Strumenti)
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-tools"></a>
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) — CloudWatch Events offre un flusso quasi in tempo reale di eventi di sistema che descrivono i cambiamenti nelle risorse AWS.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) — DynamoDB è un servizio di database NoSQL completamente gestito che offre prestazioni veloci e prevedibili con una scalabilità perfetta.
+ [Amazon ECR](https://docs.aws.amazon.com/ecr/index.html) — Amazon Elastic Container Registry (Amazon ECR) è un servizio di registro di immagini di container AWS gestito che è sicuro, scalabile e affidabile.
+ [Amazon RDS](https://docs.aws.amazon.com/rds/index.html) — Amazon Relational Database Service (Amazon RDS) è un servizio Web che semplifica la configurazione, il funzionamento e la scalabilità di un database relazionale nel cloud AWS.
+ [Amazon SNS — Amazon Simple](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) Notification Service (Amazon SNS) è un servizio gestito che fornisce il recapito dei messaggi dagli editori agli abbonati.
+ [Amazon S3](https://docs.aws.amazon.com/s3/index.html) — Amazon Simple Storage Service (Amazon S3) è uno storage per Internet.
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html): AWS Batch ti aiuta a eseguire carichi di lavoro di elaborazione in batch sul cloud AWS.
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html) — AWS Key Management Service (AWS KMS) è un servizio gestito che semplifica la creazione e il controllo delle chiavi di crittografia utilizzate per crittografare i dati.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/index.html) — Lambda è un servizio di elaborazione che ti aiuta a eseguire codice senza effettuare il provisioning o gestire server.
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/index.html) — Secrets Manager ti aiuta a sostituire le credenziali hardcoded nel codice, incluse le password, con una chiamata API a Secrets Manager per recuperare il segreto a livello di codice.
+ [Docker](https://www.docker.com/) — Docker aiuta gli sviluppatori a imballare, spedire ed eseguire facilmente qualsiasi applicazione come contenitore leggero, portatile e autosufficiente.

[Le tue istanze DB PostgreSQL su Amazon RDS devono avere tag applicati ai relativi metadati.](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) La funzione Lambda cerca i tag per identificare le istanze DB di cui eseguire il backup e in genere vengono utilizzati i tag seguenti.


| 
| 
| Tag | Description | 
| --- |--- |
| BKP: automatizzato = attivo DBDump  | Identifica un'istanza DB Amazon RDS come candidata per i backup. | 
| bkp: = AutomatedBackupSecret <secret\$1name > | Identifica il segreto di Secrets Manager che contiene le credenziali di accesso di Amazon RDS. | 
| BKP: bucket S3 automatizzato = DBDump <s3\$1bucket\$1name> | Identifica il bucket S3 a cui inviare i backup. | 
| BKP: frequenza automatizzata DBDumpBKP: Tempo automatizzato DBDump | Identifica la frequenza e gli orari in cui eseguire il backup dei database.  | 
| bkp: comando pgdump = <pgdump\$1command> | Identifica i database per i quali devono essere eseguiti i backup. | 

## Epiche
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-epics"></a>

### Creare una tabella di inventario in DynamoDB
<a name="create-an-inventory-table-in-dynamodb"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea una tabella in DynamoDB. | Accedi alla Console di gestione AWS, apri la console Amazon DynamoDB e crea una tabella. Per assistenza su questa e altre storie, consulta la sezione *Risorse correlate*. | Amministratore del cloud, amministratore del database | 
| Conferma che la tabella è stata creata.  | Esegui il comando `aws dynamodb describe-table --table-name <table-name> \| grep TableStatus`. Se la tabella esiste, il comando restituirà il `"TableStatus": "ACTIVE",` risultato. | Amministratore del cloud, amministratore del database | 

### Crea un argomento SNS per gli eventi di job non riusciti in AWS Batch
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Creare un argomento SNS. | Apri la console Amazon SNS, scegli **Argomenti** e crea un argomento SNS con il nome. `JobFailedAlert` Sottoscrivi un indirizzo e-mail attivo all'argomento e controlla la tua casella di posta elettronica per confermare l'e-mail di iscrizione a SNS da AWS Notifications. | Amministratore del cloud | 
| Crea una regola relativa agli eventi di lavoro non riusciti per AWS Batch.  | Apri la CloudWatch console Amazon, scegli **Eventi**, quindi scegli **Crea regola**. Scegli **Mostra opzioni avanzate** e scegli **Modifica**. Per **Crea un pattern che seleziona gli eventi da elaborare in base ai tuoi obiettivi**, sostituisci il testo esistente con il codice «Failed job event» nella sezione *Informazioni aggiuntive*. Questo codice definisce una regola CloudWatch Events che viene avviata quando AWS Batch ha un `Failed` evento. | Amministratore cloud | 
| Aggiungi l'obiettivo della regola dell'evento.  | In **Target**, scegli **Aggiungi obiettivi** e scegli l'argomento `JobFailedAlert` SNS. Configura i dettagli rimanenti e crea la regola Cloudwatch Events. | Amministratore cloud | 

### Crea un'immagine Docker e inviala a un repository Amazon ECR
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea un repository Amazon ECR. | Apri la console Amazon ECR e scegli la regione AWS in cui desideri creare il tuo repository. **Scegli **Repositories**, quindi scegli Crea repository.** Configura il repository in base alle tue esigenze. | Amministratore cloud | 
| Scrivere un Dockerfile.  | Accedi a Docker e usa «Sample Dockerfile» e «Sample entrypoint.sh file» dalla sezione *Informazioni aggiuntive* per creare un Dockerfile. | DevOps ingegnere | 
| Crea un'immagine Docker e inviala al repository Amazon ECR. | Crea il Dockerfile in un'immagine Docker e invialo al repository Amazon ECR. *Per informazioni su questa storia, consulta la sezione Risorse correlate.* | DevOps ingegnere | 

### Crea i componenti AWS Batch
<a name="create-the-aws-batch-components"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea una definizione di processo AWS Batch. | Apri la console AWS Batch e crea una definizione di processo che includa l'URI (Uniform Resource Identifier) del repository Amazon ECR come proprietà. `Image` | Amministratore cloud | 
| Configura la coda dei job di AWS Batch.  | Nella console AWS Batch, scegli **Job queues**, quindi scegli **Create queue**. Crea una coda di lavoro che memorizzerà i lavori fino a quando AWS Batch non li eseguirà sulle risorse all'interno del tuo ambiente di calcolo. Importante: assicurati di scrivere la logica per AWS Batch per registrare i dettagli del backup nella tabella di inventario di DynamoDB. | Amministratore cloud | 

### Creare e pianificare una funzione Lambda
<a name="create-and-schedule-a-lambda-function"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea una funzione Lambda per cercare i tag. | Crea una funzione Lambda che cerca i tag nelle tue istanze DB PostgreSQL e identifica i candidati al backup. Assicurati che la tua funzione Lambda sia in grado di identificare il `bkp:AutomatedDBDump = Active` tag e tutti gli altri tag richiesti. Importante: la funzione Lambda deve anche essere in grado di aggiungere lavori alla coda di lavori di AWS Batch. | DevOps ingegnere | 
| Crea un evento CloudWatch Events basato sul tempo.  | Apri la CloudWatch console Amazon e crea un evento CloudWatch Events che utilizzi un'espressione cron per eseguire la funzione Lambda a intervalli regolari. Importante: tutti gli eventi pianificati utilizzano il fuso orario UTC. | Amministratore cloud | 

### Prova l'automazione del backup
<a name="test-the-backup-automation"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea una chiave Amazon KMS. | Apri la console Amazon KMS e crea una chiave KMS che può essere utilizzata per crittografare le credenziali Amazon RDS archiviate in AWS Secrets Manager. | Amministratore cloud | 
| Crea un segreto di AWS Secrets Manager. | Apri la console AWS Secrets Manager e archivia le credenziali del database Amazon RDS for PostgreSQL come segreto. | Amministratore cloud | 
| Aggiungi i tag richiesti alle istanze DB PostgreSQL. | Apri la console Amazon RDS e aggiungi tag alle istanze DB PostgreSQL di cui desideri eseguire il backup automatico. *Puoi utilizzare i tag della tabella nella sezione Strumenti.* Se hai bisogno di backup da più database PostgreSQL all'interno della stessa istanza Amazon RDS, usali come valore per `-d test:-d test1` il tag. `bkp:pgdumpcommand` `test`e sono nomi di database. `test1` Assicurati che non ci sia spazio dopo i due punti (:). | Amministratore cloud | 
| Verifica l'automazione del backup.  | Per verificare l'automazione del backup, puoi richiamare la funzione Lambda o attendere l'inizio della pianificazione del backup. Una volta completato il processo di backup, verifica che la tabella di inventario di DynamoDB contenga una voce di backup valida per le tue istanze DB PostgreSQL. Se corrispondono, il processo di automazione del backup ha esito positivo. | Amministratore cloud | 

## Risorse correlate
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-resources"></a>

**Creare una tabella di inventario in DynamoDB**
+ [Creare una tabella Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**Crea un argomento SNS per gli eventi di job non riusciti in AWS Batch**
+ [Crea un argomento Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [Invia avvisi SNS per eventi di lavoro non riusciti in AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**Crea un'immagine Docker e inviala a un repository Amazon ECR**
+ [Crea un repository Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [Scrivi un Dockerfile, crea un'immagine Docker e inviala ad Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**Crea i componenti AWS Batch**
+ [Crea una definizione di processo AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [Configura il tuo ambiente di calcolo e la coda di lavoro di AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [Crea una coda di lavoro in AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**Creare una funzione Lambda**
+ [Crea una funzione Lambda e scrivi codice](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [Usare Lambda con DynamoDB](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**Crea un evento Events CloudWatch **
+ [Crea un CloudWatch evento Events basato sul tempo](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [Usa le espressioni cron in Cloudwatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**Prova l'automazione del backup**
+ [Crea una chiave Amazon KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [Crea un segreto di Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [Aggiungere tag a un'istanza Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## Informazioni aggiuntive
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**Evento di processo non riuscito:**

```
{
  "detail-type": [
    "Batch Job State Change"
  ],
  "source": [
    "aws.batch"
  ],
  "detail": {
    "status": [
      "FAILED"
    ]
  }
}
```

**Dockerfile di esempio:**

```
FROM alpine:latest
RUN apk --update add py-pip postgresql-client jq bash && \
pip install awscli && \
rm -rf /var/cache/apk/*
ADD entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
```

**File entrypoint.sh di esempio:**

```
 #!/bin/bash
set -e
DATETIME=`date +"%Y-%m-%d_%H_%M"`
FILENAME=RDS_PostGres_dump_${RDS_INSTANCE_NAME}
FILE=${FILENAME}_${DATETIME}

aws configure --profile new-profile set role_arn arn:aws:iam::${TargetAccountId}:role/${TargetAccountRoleName}
aws configure --profile new-profile set credential_source EcsContainer

echo "Central Account access provider IAM role is: "
aws sts get-caller-identity

echo "Target Customer Account access provider IAM role is: "
aws sts get-caller-identity --profile new-profile

securestring=$(aws secretsmanager get-secret-value --secret-id $SECRETID --output json --query 'SecretString' --region=$REGION --profile new-profile)

if [[ ${securestring} ]]; then
    echo "successfully accessed secrets manager and got the credentials"
    export PGPASSWORD=$(echo $securestring | jq --raw-output | jq -r '.DB_PASSWORD')
    PGSQL_USER=$(echo $securestring | jq --raw-output | jq -r '.DB_USERNAME')
    echo "Executing pg_dump for the PostGres endpoint ${PGSQL_HOST}"
    # pg_dump -h $PGSQL_HOST -U $PGSQL_USER -n dms_sample | gzip -9 -c  | aws s3 cp - --region=$REGION  --profile new-profile s3://$BUCKET/$FILE
    # in="-n public:-n private"
    IFS=':' list=($EXECUTE_COMMAND);
    for command in "${list[@]}";
      do
        echo $command;
        pg_dump -h $PGSQL_HOST -U $PGSQL_USER ${command} | gzip -9 -c  | aws s3 cp - --region=$REGION --profile new-profile s3://${BUCKET}/${FILE}-${command}".sql.gz"
        echo $?;
        if  [[ $? -ne 0 ]]; then
            echo "Error occurred in database backup process. Exiting now....."
            exit 1
        else
            echo "Postgresql dump was successfully taken for the RDS endpoint ${PGSQL_HOST} and is uploaded to the following S3 location s3://${BUCKET}/${FILE}-${command}.sql.gz"
            #write the details into the inventory table in central account
            echo "Writing to DynamoDB inventory table"
            aws dynamodb put-item --table-name ${RDS_POSTGRES_DUMP_INVENTORY_TABLE} --region=$REGION --item '{ "accountId": { "S": "'"${TargetAccountId}"'" }, "dumpFileUrl": {"S": "'"s3://${BUCKET}/${FILE}-${command}.sql.gz"'" }, "DumpAvailableTime": {"S": "'"`date +"%Y-%m-%d::%H::%M::%S"` UTC"'"}}'
            echo $?
            if  [[ $? -ne 0 ]]; then
                echo "Error occurred while putting item to DynamoDb Inventory Table. Exiting now....."
                exit 1
            else
                echo "Successfully written to DynamoDb Inventory Table ${RDS_POSTGRES_DUMP_INVENTORY_TABLE}"
            fi
        fi
      done;
else
    echo "Something went wrong {$?}"
    exit 1
fi

exec "$@"
```