¿Cómo puedo detener una instancia de Amazon RDS durante más de siete días?

Última actualización: 18/10/2021

Quiero detener una instancia de Amazon Relational Database Service (Amazon RDS) durante más de siete días.

Descripción corta

Puede comenzar y detener sus instancias de Amazon RDS fácilmente en unos minutos. Esta característica permite ahorrar costos para las bases de datos que no tienen que estar ejecutándose todo el tiempo. Puede detener una instancia de base de datos durante un máximo de siete días. Si no comienza manualmente la instancia de base de datos transcurridos siete días, la instancia comienza automáticamente. Esto sucede para que la instancia no se pierda las actualizaciones de mantenimiento necesarias para el hardware, el sistema operativo subyacente o la versión del motor de base de datos.

Para detener la instancia de RDS durante más de siete días sin perder las actualizaciones de mantenimiento necesarias, haga lo siguiente:

  1. Configure los permisos de AWS Identity Access Management (IAM) para permitir que AWS Lambda haga lo siguiente: Comenzar la instancia. Detener la instancia. Recuperar información de la instancia.
  2. Agregar etiquetas para las instancias de RDS que quiera comenzar y detener automáticamente.
  3. Crear una función Lambda para comenzar la instancia de base de datos.
  4. Crear una función Lambda para detener la instancia de base de datos.
  5. Cree una programación para hacer lo siguiente: Comenzar una instancia de base de datos al principio del periodo de mantenimiento semanal. Detener una instancia de base de datos al final del periodo de mantenimiento.

Resolución

Configurar permisos de IAM

Cree una política de IAM para permitir que Lambda comience y detenga la instancia y recupere información de la instancia.

1.    Abra la consola de IAM.

2.    En el panel de navegación, elija Políticas.

3.    Elija Create policy (Crear política).

4.    Elija la pestaña JSON.

5.    Copie la siguiente política y péguela en la pestaña JSON para conceder los permisos de IAM necesarios:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:StartDBCluster",
                "rds:StopDBCluster",
                "rds:ListTagsForResource",
                "rds:DescribeDBInstances",
                "rds:StopDBInstance",
                "rds:DescribeDBClusters",
                "rds:StartDBInstance"
            ],
            "Resource": "*"
        }
    ]
}

6.    Elija Next: Tags (Siguiente: etiquetas).

7.    (Opcional) Para agregar una etiqueta, elija Add tag (Agregar etiqueta) y, a continuación, ingrese los valores adecuados en los campos Key (Clave) y Value - optional (Valor: opcional).

8.    Elija Next: Review (Siguiente: revisión).

9.    En la página Review policy (Revisar política), en Name (Nombre), ingrese el nombre de su política. Revise la sección Summary (Resumen) para ver los permisos que concede su política.

10.    Elija Create policy (Crear política).

Para obtener más información, consulte Creación de políticas en la pestaña JSON.

Cree un rol de IAM y, a continuación, adjunte las políticas necesarias

  1. Abra la consola de IAM.
  2. En el panel de navegación, elija Roles.
  3. Elija Create role (Crear rol).
  4. En Select type of trusted entity (Seleccionar el tipo de entidad de confianza), elija AWS service (Servicio de AWS).
  5. En Or select a service to view its use cases (O seleccione un servicio para ver sus casos de uso), elija Lambda.
  6. Elija Next: Permissions (Siguiente: permisos).
  7. En Filter-policies (Políticas de filtro), ingrese el nombre de la política creada en la sección anterior. Cuando aparezca la política que ha creado, selecciónela. En Filter-policies (Políticas de filtro), ingrese AWSLambdaBasicExecutionRole. Cuando aparezca la política administrada AWSLambdaBasicExecutionRole que ha creado, selecciónela.
  8. Elija Next: Tags (Siguiente: etiquetas).
  9. (Opcional) Para agregar una etiqueta, ingrese los valores adecuados en los campos Key (Clave) y Value (optional) (Valor: opcional).
  10. Elija Next: Review (Siguiente: revisión).
  11. En la página Create role (Crear rol), en Role name (Nombre del rol), ingrese el nombre del rol que va a crear.
  12. Elija Create role (Crear rol).

Para obtener más información, consulte Creación de un rol para un servicio de AWS (consola).

Agregar etiquetas para instancias de base de datos

  1. Abra la consola de Amazon RDS.
  2. En el panel de navegación, elija Databases (Bases de datos).
  3. Elija la instancia de base de datos que desee comenzar y detener automáticamente.
  4. En la sección de detalles, desplácese hacia abajo hasta la sección Tags (Etiquetas).
  5. En la pestaña Tags (Etiquetas), elija Add (Agregar). En Tag key (Clave de etiqueta), ingrese autostart. En Value (Valor), ingrese yes. Elija Add (Agregar) para guardar los cambios.
  6. Vuelva a elegir Add (Agregar). En Tag key (Clave de etiqueta), ingrese autostop. En Value (Valor), ingrese yes. Elija Add (Agregar) para guardar los cambios.

Para obtener más información, consulta Agregar, publicar y quitar etiquetas.

Crear una función Lambda para comenzar las instancias de base de datos etiquetadas

1.    Abra la consola de Lambda.

2.    En el panel de navegación, elija Functions (Funciones).

3.    Elija Create function (Crear función).

4.    Elija Author from scratch (Crear desde cero).

5.    En Function name (Nombre de la función), ingrese el nombre de la función.

6.    En Runtime (Tiempo de ejecución), seleccione Python 3.7.

7.    En Architecture (Arquitectura), deje la selección predeterminada de x86_64.

7.    Amplíe Change default execution role (Cambiar rol de ejecución predeterminado).

8.    En Execution role (Rol de ejecución), elija Use an existing role (Usar un rol existente).

9.    En Existing role (Rol existente), seleccione el rol de IAM que creó anteriormente.

10.    Elija Create function (Crear función).

11.    Elija la pestaña Code (Código).

12.    En el editor Code source (Código fuente), elimine el código de muestra y pegue lo siguiente:

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Start DB Instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance stopped. Start it if eligible.
        if (db['DBInstanceStatus'] == 'stopped'):
            doNotStart=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
                for tags in GetTags:
                #if tag "autostart=yes" is set for instance, start it
                    if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
                        result = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                        print ("Starting instance: {0}.".format(db['DBInstanceIdentifier']))
                if(doNotStart == 1):
                    doNotStart=1
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                

if __name__ == "__main__":
    lambda_handler(None, None)

13.    Elija File (Archivo), Save (Guardar) y, a continuación, elija Deploy (Implementar).

15.    Elija la pestaña Configuration (Configuración), General configuration (Configuración general) y, a continuación, elija Edit (Editar).

16.    En Timeout (Tiempo de espera), haga lo siguiente: En min, seleccione 0. En sec, seleccione 10. 17.    Elija Save (Guardar).

Crear una función Lambda para detener las instancias de base de datos etiquetadas

Para crear una función Lambda que detenga las instancias de base de datos etiquetadas, siga las instrucciones de la sección anterior Crear una función Lambda para comenzar las instancias de base de datos etiquetadas con el siguiente cambio:

En el editor Code source (Código fuente), elimine el código de muestra y pegue lo siguiente:

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Stop DB instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance is not already stopped
        if (db['DBInstanceStatus'] == 'available'):
            DoNotStop=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
                for tags in GetTags:
                #if tag "autostop=yes" is set for instance, stop it
                    if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
                        result = rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                        print ("Stopping instance: {0}.".format(db['DBInstanceIdentifier']))
                if(DoNotStop == 1):
                    DoNotStop=1
            except Exception as e:
                print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                
if __name__ == "__main__":
    lambda_handler(None, None)

Llevar a cabo pruebas de función

Supongamos que el estado de las instancias de base de datos etiquetadas es Stopped (Detenida). Para llevar a cabo pruebas de función, haga lo siguiente:

  1. Abra la lista Lambda Functions (Funciones Lambda) .
  2. Elija la función que ha creado para comenzar las instancias de base de datos.
  3. Elija Actions (Acciones) y, a continuación, elija Test (Prueba).
  4. En la pestaña Test (Prueba), en Name (Nombre), ingrese el nombre de tu evento.
  5. Elija Save changes (Guardar cambios) y, a continuación, elija Test (Probar).

Crear el calendario

Supongamos que el periodo de mantenimiento semanal de las instancias de base de datos etiquetadas es el domingo de 22:00 a 22:30. Puede configurar un calendario creando dos reglas para lo siguiente:

  • Comenzar automáticamente la instancia de base de datos 30 minutos antes de que comience el periodo de mantenimiento
  • Detener automáticamente la instancia de base de datos 30 minutos después de que finalice el periodo de mantenimiento

Para crear la regla para comenzar automáticamente la instancia de base de datos 30 minutos antes del periodo de mantenimiento, haga lo siguiente:

  1. Abra la lista Lambda Functions (Funciones Lambda) .
  2. Elija la función que ha creado para comenzar las instancias de base de datos.
  3. En Function overview (Información general de la función), elija Add trigger (Agregar desencadenador).
  4. Seleccione EventBridge (CloudWatch Events) y, a continuación, seleccione Create a new rule (Crear una nueva regla).
  5. En Rule name (Nombre de la regla), ingrese el nombre de la regla que quiere crear.
  6. En Schedule expression (Expresión de programación), agregue una expresión cron para la programación automatizada (ejemplo: cron(30 21 ? * SUN *)).
  7. Elija Add (Agregar).

Siga las mismas instrucciones para crear otra regla que detenga automáticamente la instancia de base de datos 30 minutos después del periodo de mantenimiento. Asegúrese de cambiar el nombre de la regla y la expresión cron de la programación automatizada según corresponda (ejemplo: cron(00 23 ? * SUN *)).