

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Automatizar las copias de seguridad de las instancias de base de datos de Amazon RDS para PostgreSQL mediante AWS Batch
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Kirankumar Chandrashekar, Amazon Web Services*

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

Realizar copias de seguridad de las bases de datos de PostgreSQL es una tarea importante que, por lo general, se puede obtener mediante el [programa de utilidad pg\_dump](https://www.postgresql.org/docs/current/app-pgdump.html), que usa el comando COPY de forma predeterminada para crear un esquema y un volcado de datos de una base de datos de PostgreSQL. Sin embargo, este proceso puede resultar repetitivo si necesita copias de seguridad periódicas de varias bases de datos de PostgreSQL. Si las bases de datos PostgreSQL están alojadas en la nube, también puede aprovechar la función [automated backup](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html) de copia de seguridad automática que ofrece Amazon Relational Database Service (Amazon RDS) para PostgreSQL. Este patrón describe cómo automatizar las copias de seguridad periódicas de las instancias de base de datos de Amazon RDS para PostgreSQL mediante el programa de utilidad pg\_dump.

Nota: En las instrucciones se parte del supuesto de que utiliza Amazon RDS. Sin embargo, también puede utilizar este enfoque para bases de datos PostgreSQL alojadas fuera de Amazon RDS. Para realizar copias de seguridad, la función de AWS Lambda debe poder acceder a las bases de datos.

Un evento de Amazon CloudWatch Events basado en el tiempo inicia una función Lambda que busca [etiquetas de respaldo específicas aplicadas a los metadatos de las instancias de base de datos de](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) PostgreSQL en Amazon RDS. Si las instancias de base de datos PostgreSQL tienen **la etiqueta DBDump bkp:Automated =** Active y otras etiquetas de backup obligatorias, la función Lambda envía los trabajos individuales para cada copia de seguridad de la base de datos a AWS Batch. 

AWS Batch procesa estos trabajos y carga los datos de copia de seguridad en un bucket de Amazon Simple Storage Service (Amazon S3). En este patrón se utiliza un Dockerfile y un archivo entrypoint.sh para crear una imagen de contenedor de Docker que se usa para realizar copias de seguridad en el trabajo de AWS Batch. Una vez finalizado el proceso de copia de seguridad, AWS Batch registra los detalles de la copia de seguridad en una tabla de inventario de Amazon DynamoDB. Como medida de seguridad adicional, un evento de CloudWatch eventos inicia una notificación de Amazon Simple Notification Service (Amazon SNS) si un trabajo falla en AWS Batch. 

## Requisitos previos y limitaciones
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**Requisitos previos**
+ Una cuenta de AWS activa.
+ Un entorno informático existente, administrado o no administrado. Para obtener más información, consulte [Entornos informáticos administrados y no administrados](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) en la documentación de AWS Batch. 
+ [Imagen de Docker de la Interfaz de la línea de comandos (CLI) de AWS, versión 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html), instalada y configurada.
+ Instancias de base de datos de Amazon RDS para PostgreSQL existentes.  
+ Un bucket de S3 existente. 
+ [Docker](https://www.docker.com/), instalado y configurado en Linux, macOS o Windows.
+ Familiaridad con la codificación en Lambda. 

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

![Arquitectura para realizar copias de seguridad de las instancias de base de datos de Amazon RDS para PostgreSQL mediante la utilidad pg_dump.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**Pila de tecnología**
+  CloudWatch Eventos de Amazon
+ Amazon DynamoDB
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon RDS
+ Amazon SNS
+ Amazon S3
+ AWS Batch
+ AWS Key Management Service (AWS KMS)
+ AWS Lambda
+ AWS Secrets Manager
+ Docker

## Tools (Herramientas)
<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 ofrece una transmisión casi en tiempo real de los eventos del sistema que describen los cambios en los recursos de AWS.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html): DynamoDB es un servicio de base de datos NoSQL totalmente administrado que ofrece un rendimiento rápido y predecible, así como una perfecta escalabilidad.
+ [Amazon ECR](https://docs.aws.amazon.com/ecr/index.html): Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor de AWS administrado que es seguro, escalable y fiable.
+ [Amazon RDS](https://docs.aws.amazon.com/rds/index.html): Amazon Relational Database Service (Amazon RDS) es un servicio web que facilita la configuración, el funcionamiento y el escalado de una base de datos relacional en la nube de AWS.
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html): Amazon Simple Notification Service (Amazon SNS) es un servicio administrado que proporciona la entrega de mensajes de los publicadores a los suscriptores.
+ [Amazon S3](https://docs.aws.amazon.com/s3/index.html): Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento para Internet.
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html): AWS Batch facilita poder ejecutar cargas de trabajo informáticas por lotes en la nube de AWS.
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html) – AWS Key Management Service (AWS KMS) es un servicio administrado que permite crear y controlar fácilmente las claves de cifrado que se utilizan para cifrar datos.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/index.html): Lambda es un servicio informático que facilita poder ejecutar código sin aprovisionar ni administrar servidores.
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/index.html): Secrets Manager le permite reemplazar las credenciales codificadas en el código, incluidas las contraseñas, con una llamada a la API de Secrets Manager para recuperar el secreto mediante programación.
+ [Docker:](https://www.docker.com/) Docker facilita a los desarrolladores empaquetar, enviar y ejecutar cualquier aplicación como un contenedor ligero, portátil y autosuficiente.

Las instancias de base de datos de PostgreSQL en Amazon RDS deben tener [etiquetas aplicadas a sus metadatos](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html). La función de Lambda busca etiquetas para identificar las instancias de base de datos de las que se debe hacer una copia de seguridad y, por lo general, se utilizan las siguientes etiquetas.


| 
| 
| Etiqueta | Description (Descripción) | 
| --- |--- |
| BKP: Automatizado = Activo DBDump  | Identifica una instancia de base de datos de Amazon RDS como candidata para realizar copia de seguridad. | 
| bkp: = AutomatedBackupSecret <secret\_name > | Identifica el secreto de Secrets Manager que contiene las credenciales de inicio de sesión de Amazon RDS. | 
| BKP: Cubeta S3 DBDump automatizada = <s3\_bucket\_name> | Identifica el bucket de S3 al que se enviarán las copias de seguridad. | 
| BKP: DBDump Frecuencia automatizada<br />BKP: Tiempo DBDump automatizado | Identifica la frecuencia y las horas en las que se deben hacer copias de seguridad de las bases de datos.  | 
| bkp:pgdumpcommand = <pgdump\_command> | Identifica las bases de datos para las que se deben realizar las copias de seguridad. | 

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

### Crear una tabla de inventario en DynamoDB
<a name="create-an-inventory-table-in-dynamodb"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una tabla en DynamoDB. | Inicie sesión en la Consola de administración de AWS, abra la consola de Amazon DynamoDB y cree una tabla. Para obtener ayuda con esta y otras explicaciones, consulte la sección *Recursos relacionados*. | Administrador de la nube, administrador de bases de datos | 
| Confirme que se creó la tabla.  | Ejecute el comando `aws dynamodb describe-table --table-name <table-name> \| grep TableStatus`. Si la tabla existe, el comando devolverá el resultado `"TableStatus": "ACTIVE",`. | Administrador de la nube, administrador de bases de datos | 

### Creación de un tema de SNS para los eventos de trabajo con errores en AWS Batch
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un tema de SNS. | Abra la consola de Amazon SNS, seleccione **Topics** (Temas) y cree un tema de SNS con el nombre `JobFailedAlert`. Suscríbase al tema con una dirección de correo electrónico activa y compruebe su bandeja de entrada para confirmar que llegue el correo electrónico de suscripción a SNS de AWS Notifications. | Administrador de la nube | 
| Cree una regla de eventos de trabajo con errores para AWS Batch.  | Abre la CloudWatch consola de Amazon, selecciona **Eventos** y, a continuación, selecciona **Crear regla**. Seleccione **Show advanced options** (Mostrar opciones avanzadas) y, a continuación, **Edit** (Editar). En **Build a pattern that selects events for processing by your targets** (Crear un patrón que seleccione eventos para procesar por los destinos), sustituya el texto que aparezca con el código Failed job event (Evento de trabajo con errores) de la sección *Información adicional*. Este código define una regla de CloudWatch eventos que se inicia cuando AWS Batch tiene un `Failed` evento. | Administrador de la nube | 
| Agregue el destino de la regla del evento.  | En **Targets** (Destinos), seleccione **Add target** (Agregar destino) y, a continuación, el tema de SNS `JobFailedAlert`. Configure los detalles restantes y cree la regla de eventos de Cloudwatch. | Administrador de la nube | 

### Crear una imagen de Docker y pasarla a un repositorio de Amazon ECR
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un repositorio de Amazon ECR. | Abra la consola de Amazon ECR y seleccione la región de AWS donde desee crear el repositorio. Seleccione **Repositories** (Repositorios) y, a continuación, **Create repository** (Crear repositorio). Configure el repositorio según los requisitos. | Administrador de la nube | 
| Cree un Dockerfile.  | Inicie sesión en Docker y utilice Sample Dockerfile (Dockerfile de muestra) y el archivo entrypoint.sh de muestra de la sección de *Información adicional* para crear un Dockerfile. | DevOps ingeniero | 
| Cree una imagen de Docker y pásela a un repositorio de Amazon ECR. | Cree el Dockerfile en una imagen de Docker y pásela a un repositorio de Amazon ECR. Para obtener ayuda con esta y otras explicaciones, consulte la sección *Recursos relacionados*. | DevOps ingeniero | 

### Crear los componentes de AWS Batch
<a name="create-the-aws-batch-components"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una definición de trabajo de AWS Batch. | Abra la consola de AWS Batch y cree una definición de trabajo que incluya el identificador uniforme de recursos (URI) del repositorio de Amazon ECR como la propiedad `Image`. | Administrador de la nube | 
| Configure la cola de trabajos de AWS Batch.  | En la consola de AWS Batch, seleccione **Job queues** (Colas de trabajos) y, a continuación, **Create queue** (Crear cola). Cree una cola de trabajos que almacene los trabajos hasta que AWS Batch los ejecute en los recursos del entorno informático. Importante: Asegúrese de escribir la lógica para que AWS Batch registre los detalles de la copia de seguridad en la tabla de inventario de DynamoDB. | Administrador de la nube | 

### Crear y programar una función de Lambda
<a name="create-and-schedule-a-lambda-function"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una función de Lambda para buscar etiquetas. | Cree una función de Lambda que busque etiquetas en las instancias de base de datos de PostgreSQL e identifique los candidatos a copia de seguridad. Asegúrese de que la función de Lambda pueda identificar la etiqueta `bkp:AutomatedDBDump = Active` y todas las demás etiquetas necesarias. Importante: La función de Lambda también debe poder agregar trabajos a la cola de trabajo de AWS Batch. | DevOps ingeniero | 
| Crea un evento de CloudWatch eventos basado en el tiempo.  | Abra la CloudWatch consola de Amazon y cree un evento CloudWatch Events que utilice una expresión cron para ejecutar la función Lambda de forma regular. Importante: Todos los eventos programados utilizan la zona horaria UTC. | Administrador de la nube | 

### Probar la automatización de las copias de seguridad
<a name="test-the-backup-automation"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una clave de Amazon KMS. | Abra la consola de Amazon KMS y cree una clave de KMS que pueda usarse para cifrar las credenciales de Amazon RDS almacenadas en AWS Secrets Manager. | Administrador de la nube | 
| Crear un secreto de AWS Secrets Manager. | Abra la consola de AWS Secrets Manager y guarde en secreto las credenciales de la base de datos de Amazon RDS para PostgreSQL. | Administrador de la nube | 
| Agregue las etiquetas necesarias a las instancias de base de datos de PostgreSQL. | Abra la consola de Amazon RDS y agregue etiquetas a las instancias de base de datos de PostgreSQL de las que desee hacer una copia de seguridad automática. Puede utilizar las etiquetas de la tabla de la sección *Tools* (Herramientas). Si necesita copias de seguridad de varias bases de datos de PostgreSQL dentro de la misma instancia de Amazon RDS, utilice `-d test:-d test1` como valor para la etiqueta `bkp:pgdumpcommand`. `test` y `test1` son los nombres de las bases de datos. Compruebe que no quede ningún espacio después de los dos puntos (:). | Administrador de la nube | 
| Verifique la automatización de la copia de seguridad.  | Para verificar la automatización de la copia de seguridad, puede invocar la función de Lambda o esperar a que comience la programación de la copia de seguridad. Una vez finalizado el proceso de copia de seguridad, compruebe que la tabla de inventario de DynamoDB tenga una entrada de copia de seguridad válida para las instancias de base de datos de PostgreSQL. Si coinciden, el proceso de automatización de la copia de seguridad se ha realizado correctamente. | Administrador de la nube | 

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

**Crear una tabla de inventario en DynamoDB**
+ [Crear una tabla de Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**Creación de un tema de SNS para los eventos de trabajo con errores en AWS Batch**
+ [Crear un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [Enviar alertas de SNS sobre eventos de trabajo con errores en AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**Crear una imagen de Docker y pasarla a un repositorio de Amazon ECR**
+ [Crear un repositorio de Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [Escribir un Dockerfile, crear una imagen de Docker y pasarla a Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**Crear los componentes de AWS Batch**
+ [Crear una definición de trabajo de AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [Configurar el entorno informático y la cola de trabajos de AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [Crear una cola de trabajos en AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**Crear una función de Lambda**
+ [Crear una función de Lambda y escribir código](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [Usar Lambda con DynamoDB](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**Cree un evento de eventos CloudWatch **
+ [Crea un evento de CloudWatch eventos basado en el tiempo](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [Utilizar expresiones cron en eventos de Cloudwatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**Probar la automatización de las copias de seguridad**
+ [Crear una clave de Amazon KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [Crear un secreto en Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [Agregar etiquetas a una instancia de Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## Información adicional
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**Evento de trabajo con errores:**

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

**Dockerfile de muestra:**

```
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"]
```

**Archivo entrypoint.sh de muestra:**

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